# http://www.xs4all.nl/~evbergen/nonrecursive-make.html
#
-#
-# Define some options.
-#
-
-# Set this to `yes' to echo each build command.
-verbose := no
+# 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:
- @echo "You must run the configure script before you can make anything."
- @exit 1
+ $(error You must run the configure script before you can make anything)
endif
#
-# Some standard stuff.
+# Declare the default targets and implicit rules.
#
+.PHONY: all
+all: all_
+
.SUFFIXES:
-.SUFFIXES: .a .c .cc .cpp .o .rc
+.SUFFIXES: .a .c .cc .cpp .in .o .rc
+
-all: targets
+#
+# Define some useful functions.
+#
+
+add_exe_suffix = $(addsuffix $(EXEEXT),$1)
+remove_silencer = $(1:@%=%)
#
# Define some common rules.
#
-CC_WRAPPER = ./build/compile.sh $(CC)
-CXX_WRAPPER = ./build/compile.sh $(CXX)
+ifeq ($(DEP_TRACKING),true)
+COMPILE = ./tools/compile.lua
+endif
+
+COMMAND_CC = $(COMPILE) $(CC) $(CFLAGS) $(CF_TGT) -o $@ -c $<
+COMMAND_CXX = $(COMPILE) $(CXX) $(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 = $(COMPILE) $(CC) $(CFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS)
+COMMAND_CXXLD = $(COMPILE) $(CXX) $(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 = ./tools/install.sh -m $1 $2 -d $3
+COMMAND_RM = rm -f $1
+COMMAND_IN = sed -f config.sed <"$1" >"$2"
-ifeq ($(verbose),no)
-DO_CC = @echo " CC $@";
-DO_CXX = @echo " CXX $@";
-DO_LD = @echo " LD $@";
-DO_LDX = @echo " LD $@";
-DO_CCLD = @echo " CCLD $@";
-DO_CXXLD = @echo " CXXLD $@";
-DO_AR = @echo " AR $@";
-DO_RC = @echo " RC $@";
+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
-DO_CC += $(CC_WRAPPER) $(CFLAGS) $(CF_TGT) -o $@ -c $<
-DO_CXX += $(CXX_WRAPPER) $(CXXFLAGS) $(CF_TGT) -o $@ -c $<
-DO_LD += $(CC_WRAPPER) $(LDFLAGS) $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS)
-DO_LDX += $(CXX_WRAPPER) $(LDFLAGS) $(LF_TGT) -o $@ $^ $(LL_TGT) $(LIBS)
-DO_CCLD += $(CC_WRAPPER) $(CFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS)
-DO_CXXLD += $(CXX_WRAPPER) $(CXXFLAGS) $(CF_TGT) $(LDFLAGS) $(LF_TGT) -o $@ $< $(LL_TGT) $(LIBS)
-DO_AR += $(AR) rcs $@ $^; $(RANLIB) $@
-DO_RC += $(WINDRES) $(DDEFINES) $(DF_TGT) -o $@ -i $<
+
+#
+# Define the implicit rules.
+#
%.o: %.c
$(DO_CC)
$(DO_CXXLD)
%.a: %.o
$(DO_AR)
-
-
-#
-# Stuff.
-#
-
-#TGT_BIN := $(addsuffix $(EXEEXT),$(TGT_BIN))
+%: %.in
+ $(call DO_IN,$<,$@)
#
# Define the phony targets.
#
-.PHONY: targets
-targets: $(TGT_BIN) $(TGT_LIB)
-
.PHONY: clean
clean:
-ifeq ($(verbose),yes)
- rm -f $(CLEAN)
-else
- @echo " CLEAN"; rm -f $(CLEAN)
-endif
+ $(SHELL_LINE_PREFIX)files='$(CLEAN)'; for file in $$files; \
+ do \
+ $(call remove_silencer,$(call DO_RM,$$file)); \
+ done
.PHONY: distclean
distclean: clean
-ifeq ($(verbose),yes)
- rm -f config.mk
-else
- @rm -f config.mk
-endif
+ $(call DO_RM,config.h)
+ $(call DO_RM,config.mk)
+ $(call DO_RM,config.sed)
+
+.PHONY: all_
+all_: $(BINARIES) $(MANPAGES)
.PHONY: install
-install: targets
- $(INSTALL) $(TGT_BIN) -m 755 -d $(DESTDIR)$(bindir)
- $(INSTALL) $(TGT_DATA) -m 644 -d $(DESTDIR)$(datadir)
- $(INSTALL) $(TGT_LIB) -m 750 -d $(DESTDIR)$(libdir)
- $(INSTALL) $(TGT_MAN) -m 644 -d $(DESTDIR)$(mandir)
+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
#