X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=Makefile;h=95ed652182519087c4f7a07274c73df624013ff5;hp=0ca002bb5f83e3bf44be6818d82d517e70531833;hb=51069fee9139ab8d14ecc80dffbe5deecb73d9e0;hpb=6b0a0d0efafe34d48ab344fca3b479553bd4e62c diff --git a/Makefile b/Makefile index 0ca002b..95ed652 100644 --- a/Makefile +++ b/Makefile @@ -4,42 +4,47 @@ # Use this file with make to compile and install Yoink. # # This makefile supports these targets: -# all, install, clean, cleandist, run, debug +# all, install, clean, distclean, run, debug, dist, dist-gzip, dist-bzip2 # # This build system incorporates the ideas written by Emile van Bergen: # 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 `true' to echo each build command in full. +verbose := false # # 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:@%=%) # @@ -60,28 +65,58 @@ include $(dir)/rules.mk # 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 -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 $@"; +# Include current directory to allow sources to #include "config.h". +CFLAGS += -I. +CXXFLAGS += -I. + +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),true) +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 " CC $@"; $(COMMAND_CC) +DO_CXX = @echo " CXX $@"; $(COMMAND_CXX) +DO_LD = @echo " LD $@"; $(COMMAND_LD) +DO_LDX = @echo " LD $@"; $(COMMAND_LDX) +DO_CCLD = @echo " CCLD $@"; $(COMMAND_CCLD) +DO_CXXLD = @echo " CXXLD $@"; $(COMMAND_CXXLD) +DO_AR = @echo " AR $@"; $(COMMAND_AR) +DO_RC = @echo " RC $@"; $(COMMAND_RC) +DO_INSTALL = @echo " CP $2"; $(COMMAND_INSTALL) +DO_RM = @echo " RM $1"; $(COMMAND_RM) +DO_IN = @echo " MAKE $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) @@ -91,54 +126,81 @@ DO_RC += $(WINDRES) $(DDEFINES) $(DF_TGT) -o $@ -i $< $(DO_CXX) %.o: %.rc $(DO_RC) -%: %.o +%$(EXEEXT): %.o $(DO_LD) -%: %.c +%$(EXEEXT): %.c $(DO_CCLD) -%: %.cc +%$(EXEEXT): %.cc $(DO_CXXLD) -%: %.cpp +%$(EXEEXT): %.cpp $(DO_CXXLD) %.a: %.o $(DO_AR) - - -# -# Stuff. -# - -#TGT_BIN := $(addsuffix $(EXEEXT),$(TGT_BIN)) +%: %.in config.sed + $(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 + +.PHONY: dist-bzip2 +dist-bzip2: + $(SHELL_LINE_PREFIX)git archive HEAD --prefix='$(TARNAME)/' | bzip2 > "$(TARNAME).tar.bz2" + +.PHONY: dist-gzip +dist-gzip: + $(SHELL_LINE_PREFIX)git archive HEAD --prefix='$(TARNAME)/' | gzip > "$(TARNAME).tar.gz" + +.PHONY: dist +dist: dist-bzip2 #