### The build commands and verbosity # If we are verbose, we will show commands prefixed by $(Q) (which acts as # @ in the non-verbose mode), and we will show the "real" cmds instead of # their quiet versions (which are used in the non-verbose mode). # Inspired by the Linux kernel build system. ifdef V Q = quiet = mquiet = masq_ else Q = @ quiet = quiet_ mquiet = quiet_ endif CURPATH = $(shell pwd) TOPPATH = $(shell cd $(path_to_top) && pwd) RELPATH = $(shell echo '$(CURPATH)' | sed 's,$(TOPPATH),,;s,^/,,;s,\([a-z0-9]\)$$,\1/,') # Show the command (quiet or non-quiet version based on the assignment # just above) and then execute it. ncmd = $(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1)) cmd = @$(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1)) mcmd = @$(if $($(mquiet)cmd_$(1)),echo $($(mquiet)cmd_$(1)) &&) $(cmd_$(1)) quiet_cmd_compile = ' [CC] $(RELPATH)$<' masq_cmd_compile = $(COMPILE) -c $< cmd_compile = $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< # Rule to compile a set of .o files into one .o file quiet_cmd_ld_objs = " [LD] $(RELPATH)$@" cmd_ld_objs = $(LD) -r -o $@ $(filter $(OBJS), $^) quiet_cmd_link = ' [LINK] $(RELPATH)$@' cmd_link = $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) # Recursive make quiet_cmd_recmake = "[MAKE $$target] $(RELPATH)$$subdir" cmd_recmake = $(MAKE) -C $$subdir $$target quiet_cmd_installdata = " [INSTALL] $(RELPATH)$(2) -> $(3)" cmd_installdata = $(INSTALL_DATA) $(2) $(3) quiet_cmd_installprog = " [INSTALL] $(RELPATH)$(2) -> $(3)" cmd_installprog = $(INSTALL_PROGRAM) $(2) $(3) ### Internal build rules DEP_FILES_1 = $(foreach src,$(OBJS),.deps/$(src)) DEP_FILES = $(DEP_FILES_1:%.o=%.P) DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) ifdef OBJS -include $(DEP_FILES) endif %.o: %.c $(call mcmd,compile) @-cp .deps/$(*F).pp .deps/$(*F).P; \ tr ' ' '\012' < .deps/$(*F).pp \ | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ >> .deps/$(*F).P; \ rm .deps/$(*F).pp ifdef SUBDIRS-yes SUBDIRS += $(SUBDIRS-yes) endif ifdef OBJS-yes OBJS += $(OBJS-yes) endif ifdef SUBDIRS # Apparently wildcard won't expand *.o files so check if there are any *.c # files and use that to magically add the lib.o file of the subdirectory. subobjs := $(strip $(foreach subdir,$(sort $(filter-out src,$(SUBDIRS))), \ $(if $(wildcard $(subdir)/*.c),$(subdir)/lib.o))) endif ifneq ($(subobjs),) OBJS += $(subobjs) endif ifdef OBJS lib.o: $(sort $(OBJS)) $(call cmd,ld_objs) LIB_O = lib.o CLEAN += $(OBJS) $(LIB_O) endif CLEAN += $(PROG) all-default: $(LIB_O) $(PROGS) $(MAN1) $(MAN5) clean-default: -test -z "$(CLEAN)" || $(RM) $(CLEAN) install-default: all-default ifdef PROGS $(MKINSTALLDIRS) $(DESTDIR)$(bindir) $(foreach file,$(PROGS), \ $(call ncmd,installprog,$(file),$(DESTDIR)$(bindir));) endif ifdef MAN1 $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man1 $(foreach file,$(MAN1), \ $(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man1);) endif ifdef MAN5 $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man5 $(foreach file,$(MAN5), \ $(call ncmd,installdata,$(file),$(DESTDIR)$(mandir)/man5);) endif # Recursion: .PHONY: all-recursive install-recursive clean-recursive all-recursive install-recursive clean-recursive: ifdef SUBDIRS @target=`echo $@ | sed s/-recursive//`; \ for subdir in $(sort $(SUBDIRS)); do \ $(call ncmd,recmake) || exit 1; \ done endif all: all-recursive all-default all-local install: install-recursive install-default install-local clean: clean-recursive clean-default clean-local all-local: install-local: clean-local: # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: # vim:syntax=make