Sometimes you want to build potential goals of nested make files, i.e. make files that reside in a different folder. The best method I’ve been able to come up with so far was this one:
# Declare some (immediate) constants (uppercase) and # (deferred) local variables (lowercase) NEED_GMAKE_VERSION := 3.80 3.81 MAKE_VERSION_MAJOR := $(word 1, $(subst ., ,$(MAKE_VERSION))) MAKE_VERSION_MINOR := $(word 2, $(subst ., ,$(MAKE_VERSION))) # Do not allow to run on versions of GMAKE whose # capabilities we don't know $(if $(filter $(MAKE_VERSION),$(NEED_GMAKE_VERSION)),,\ $(error This makefile requires one of the following GNU make \ versions: $(NEED_GMAKE_VERSION))) # The goals MAKE_DIRECTORIES = folder1 folder2 .PHONY: all all: $(MAKE_DIRECTORIES) .PHONY: $(MAKE_DIRECTORIES) $(MAKE_DIRECTORIES): @$(MAKE) --keep-going --directory=$@ $(MAKECMDGOALS) # All goals "forward" the make into the individual directories .PHONY: $(MAKECMDGOALS) $(MAKECMDGOALS): $(MAKE_DIRECTORIES)
Even if you don’t know the available goals in nested make files, this top-level make file will go into folder1 and folder2 and do its job. No matter whether you told it to make clean
, make all
or simply make
.
// Oliver
PS: Of course you need not hard code the folders … they could also be retrieved by a find
call.