# # Yoink # Use this file with make to compile and install Yoink. # # This makefile supports these targets: # all, install, clean, cleandist, run, debug # # This build system incorporates the ideas written by Emile van Bergen: # http://www.xs4all.nl/~evbergen/nonrecursive-make.html # # Set this to `yes' to echo each build command in full. verbose := no # # Include the configuration file, config.mk. # SHELL := /bin/sh have_config := $(wildcard config.mk) ifneq ($(strip $(have_config)),) include config.mk else no_config: $(error You must run the configure script before you can make anything) endif # # Declare the default targets and implicit rules. # .PHONY: all all: all_ .SUFFIXES: .SUFFIXES: .a .c .cc .cpp .in .o .rc # # Define some useful functions. # add_exe_suffix = $(addsuffix $(EXEEXT),$1) remove_silencer = $(1:@%=%) # # Include the subdirectories--order is not important. # dir := src include $(dir)/rules.mk dir := data include $(dir)/rules.mk dir := doc include $(dir)/rules.mk # # Define some common rules. # CC_WRAPPER = ./build/compile.sh $(CC) CXX_WRAPPER = ./build/compile.sh $(CXX) COMMAND_CC = $(CC_WRAPPER) $(CFLAGS) $(CF_TGT) -o $@ -c $< COMMAND_CXX = $(CXX_WRAPPER) $(CXXFLAGS) $(CF_TGT) -o $@ -c $< COMMAND_LD = $(CC) $(LDFLAGS) $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS) COMMAND_LDX = $(CXX) $(LDFLAGS) $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS) COMMAND_CCLD = $(CC_WRAPPER) $(CFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS) COMMAND_CXXLD = $(CXX_WRAPPER) $(CXXFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS) COMMAND_AR = $(AR) rcs $@ $^; $(RANLIB) $@ COMMAND_RC = $(WINDRES) $(DDEFINES) $(DF_TGT) -o $@ -i $< COMMAND_INSTALL = ./build/install.sh -m $1 $2 -d $3 COMMAND_RM = rm -f $1 COMMAND_IN = ./build/process.sh $1 $2 ifeq ($(verbose),yes) DO_CC = $(COMMAND_CC) DO_CXX = $(COMMAND_CXX) DO_LD = $(COMMAND_LD) DO_LDX = $(COMMAND_LDX) DO_CCLD = $(COMMAND_CCLD) DO_CXXLD = $(COMMAND_CXXLD) DO_AR = $(COMMAND_AR) DO_RC = $(COMMAND_RC) DO_INSTALL = $(COMMAND_INSTALL) DO_RM = $(COMMAND_RM) DO_IN = $(COMMAND_IN) SHELL_LINE_PREFIX = else DO_CC = @echo -e " CC \t$@"; $(COMMAND_CC) DO_CXX = @echo -e " CXX \t$@"; $(COMMAND_CXX) DO_LD = @echo -e " LD \t$@"; $(COMMAND_LD) DO_LDX = @echo -e " LD \t$@"; $(COMMAND_LDX) DO_CCLD = @echo -e " CCLD \t$@"; $(COMMAND_CCLD) DO_CXXLD = @echo -e " CXXLD \t$@"; $(COMMAND_CXXLD) DO_AR = @echo -e " AR \t$@"; $(COMMAND_AR) DO_RC = @echo -e " RC \t$@"; $(COMMAND_RC) DO_INSTALL = @echo -e " CP \t$2"; $(COMMAND_INSTALL) DO_RM = @echo -e " RM \t$1"; $(COMMAND_RM) DO_IN = @echo -e " MAKE \t$2"; $(COMMAND_IN) SHELL_LINE_PREFIX = @ endif # # Define the implicit rules. # %.o: %.c $(DO_CC) %.o: %.cc $(DO_CXX) %.o: %.cpp $(DO_CXX) %.o: %.rc $(DO_RC) %: %.o $(DO_LD) %: %.c $(DO_CCLD) %: %.cc $(DO_CXXLD) %: %.cpp $(DO_CXXLD) %.a: %.o $(DO_AR) %: %.in $(call DO_IN,$<,$@) # # Define the phony targets. # .PHONY: clean clean: $(SHELL_LINE_PREFIX)files='$(CLEAN)'; for file in $$files; \ do \ $(call remove_silencer,$(call DO_RM,$$file)); \ done .PHONY: distclean distclean: clean $(call DO_RM,config.mk) .PHONY: all_ all_: $(BINARIES) $(MANPAGES) .PHONY: install install: all $(SHELL_LINE_PREFIX)files='$(DATAFILES)'; for file in $$files; \ do \ full=`echo "$$file" | cut -d\; -f1`; \ base=`echo "$$file" | cut -d\; -f2`; \ $(call remove_silencer,$(call DO_INSTALL,644,$$full,$(DESTDIR)$(datadir)$$base)); \ done $(SHELL_LINE_PREFIX)files='$(BINARIES)'; for file in $$files; \ do \ $(call remove_silencer,$(call DO_INSTALL,755,$$file,$(DESTDIR)$(bindir))); \ done $(SHELL_LINE_PREFIX)files='$(MANPAGES)'; for file in $$files; \ do \ $(call remove_silencer,$(call DO_INSTALL,644,$$file,$(DESTDIR)$(mandir))); \ done .PHONY: uninstall uninstall: $(SHELL_LINE_PREFIX)files='$(BINARIES)'; for file in $$files; \ do \ base="/`basename $$file`"; \ $(call remove_silencer,$(call DO_RM,$(DESTDIR)$(bindir)$$base)); \ done $(SHELL_LINE_PREFIX)files='$(DATAFILES)'; for file in $$files; \ do \ full="`echo "$$file" | cut -d\; -f1`"; \ base="`echo "$$file" | cut -d\; -f2`/`basename $$full`"; \ $(call remove_silencer,$(call DO_RM,$(DESTDIR)$(datadir)$$base)); \ done # # Prevent make from removing any build targets. # .SECONDARY: $(CLEAN)