### 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 # 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] $<' 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] $@" cmd_ld_objs = $(LD) -r -o $@ $(filter $(OBJS), $^) quiet_cmd_link = ' [LINK] $@' cmd_link = $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) # Recursive make quiet_cmd_recmake = "[MAKE $$target] $$subdir" cmd_recmake = $(MAKE) -C $$subdir $$target ### 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 $(SUBDIRS)),$(if $(wildcard $(subdir)/*.c),$(subdir)/lib.o))) endif ifneq ($(subobjs),) OBJS += $(subobjs) endif ifdef OBJS CLEAN += $(OBJS) clean-local: $(RM) lib.o $(CLEAN) lib.o: $(sort $(OBJS)) $(call cmd,ld_objs) all-local: lib.o 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-local install: install-recursive install-local clean: clean-recursive clean-local all-local: install-local: clean-local: # vim:syntax=make