## Copyright 2017 Chris Johns ## ## The following builds in parallel. The subdirectories are ## expanded into separate rules and all the targets are listed ## and make runs as many as it can. ## ## A macro is defined and evaluated once for each directory. This ## creates the instance of the rule. Use $(info ...) to print them. ## SUBDIRS_dot = $(filter .,$(_SUBDIRS)) SUBDIRS_no_dot = $(filter-out .,$(_SUBDIRS)) SUBDIRS_no_dot_no_wrapup = $(filter-out wrapup,$(SUBDIRS_no_dot)) SUBDIRS_no_dot_no_testsuites = $(filter-out testsuites,$(SUBDIRS_no_dot)) SUBDIRS_no_dot_no_wrapup_no_testsuites = $(filter-out testsuites,$(SUBDIRS_no_dot_no_wrapup)) SUBDIRS_wrapup = $(filter wrapup,$(SUBDIRS_no_dot)) SUBDIRS_testsuites = $(filter testsuites,$(SUBDIRS_no_dot)) define CPUKITDIR .PHONY: $1 $1: @+set fnord $(MAKEFLAGS); amf=$$$$2; \ subdir=$(2); \ target=`echo $(MAKECMDGOALS) | sed s/-recursive//`; \ if test "$$$$target" = "all-local-am"; then \ target="all-am"; \ fi; \ if test "$$$$target" = "all-local"; then \ target="all"; \ fi; \ echo "Making $$$$target in $$$$subdir"; \ if test "$$$$subdir" != "."; then \ cd $$$$subdir; \ $(MAKE) $(AM_MAKEFLAGS) $$$$target; \ fi; endef # # This GNU make syntax is being used to stop automake thinking the code is for # it. # $(if "$(SUBDIRS_dot)" ".",$(eval $(call CPUKITDIR,dot,.))) $(foreach D,$(SUBDIRS_no_dot),$(eval $(call CPUKITDIR,$(D),$(D)))) # # If there is a wrapup make it depend on all other directories except the # testsuite so it is not entered until everything but the testsuite has # finished. # $(if "$(SUBDIRS_wrapup)" "wrapup",wrapup: dot $(SUBDIRS_no_dot_no_wrapup_no_testsuites)) # # If there is a testsuite make it depend on all other directories so it is not # entered until everything else has finished. # $(if "$(SUBDIRS_testsuites)" "testsuites",testsuites: dot $(SUBDIRS_no_dot_no_testsuites)) # # The general build all rule for automake. # all-local: $(if "$(SUBDIRS_dot)" ".",dot) $(SUBDIRS_no_dot) clean-local: $(if "$(SUBDIRS_dot)" ".",dot) $(SUBDIRS_no_dot)