ThisMake := $(lastword $(MAKEFILE_LIST)) TOP := $(dir $(ThisMake)) ifeq ($(S),) %: mkdir -p $(TOP)$(ObjDir) ; $(MAKE) -C $(TOP)$(ObjDir) VPATH=.. S=../ -f ../Makefile $* all: else # This is included at the end of each subdir makefile # We need to make each target from its objs all : $(if $(HaveCommon),,$(eval include $(D)../MakeCommon)) D2 := $(if $(D),$(D),nothing) define TargetTemplate all : targets/$(1) targets/$(1) : $(D)$(1) mkdir -p targets ; cp $(D)$(1) targets/$(1) toclean += $(D)$(1) $(D)$(1) : $(patsubst $(D2)../%,%, $(addprefix $(D),$(obj-$(1)))) $$(CC) -o $$@ $$^ $$(LDLIBS) $$(lib-$(1)) -include $(patsubst %.o,$(D)%.c.d,$(filter %.o,$(obj-$(1)))) endef $(foreach t,$(target),$(eval $(call TargetTemplate,$(t)))) define LibraryTemplate all : $(D)$(1) toclean += $(D)$(1) $(D)$(1) : $(patsubst $(D2)../%,%,$(addprefix $(D),$(obj-$(1)))) $$(AR) cr $$@ $$^ endef $(foreach l,$(lib),$(eval $(call LibraryTemplate,$(l)))) define DirTemplate D := $(1) include $$(S)$$(D)Makefile tocleandirs += $(1) endef dtmp := $(dirs-y) dirs-y := $(foreach dir,$(dtmp),$(eval $(call DirTemplate,$(dir)))) target := lib := endif