From 2d98d4a0182caf51cd4be7f8aa5ec604c42e1f4d Mon Sep 17 00:00:00 2001 From: Piotr Jaroszyński Date: Thu, 29 Jul 2010 15:17:30 +0200 Subject: [build] Properly handle multiple goals per BIN directory When building multiple targets per BIN with multiple jobs, for example: make -j16 bin-i386-efi/ipxe.efi{,drv,rom} bin-x86_64-efi/ipxe.efi{,drv,rom} we would invoke a make subprocess for each goal in parallel resulting in multiple makes running in a single BIN directory. Fix by grouping goals per BIN directory and invoking only one make per BIN. It is both safer and faster. Signed-off-by: Piotr Jaroszyński Modified-by: Michael Brown Signed-off-by: Michael Brown --- src/Makefile.housekeeping | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'src/Makefile.housekeeping') diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping index 7278c283..8f0c87f3 100644 --- a/src/Makefile.housekeeping +++ b/src/Makefile.housekeeping @@ -174,8 +174,9 @@ endif # make goals. # BIN_GOALS := $(filter bin/% bin-%,$(MAKECMDGOALS)) -BIN_GOAL_BINS := $(foreach BG,$(BIN_GOALS),$(firstword $(subst /, ,$(BG)))) -NUM_BINS := $(words $(sort $(BIN_GOAL_BINS))) +BIN_GOALS_BINS := $(sort $(foreach BG,$(BIN_GOALS),\ + $(firstword $(subst /, ,$(BG))))) +NUM_BINS := $(words $(BIN_GOALS_BINS)) ifeq ($(NUM_BINS),0) @@ -191,20 +192,29 @@ ifeq ($(NUM_BINS),1) # If exactly one BIN directory was specified, set BIN to match this # directory. # -BIN := $(firstword $(BIN_GOAL_BINS)) +BIN := $(firstword $(BIN_GOALS_BINS)) else # NUM_BINS == 1 # More than one BIN directory was specified. We cannot handle the # latter case within a single make invocation, so set up recursive -# targets for each BIN directory. +# targets for each BIN directory. Use exactly one target for each BIN +# directory since running multiple make invocations within the same +# BIN directory is likely to cause problems. # # Leave $(BIN) undefined. This has implications for any target that # depends on $(BIN); such targets should be made conditional upon the # existence of $(BIN). # -$(BIN_GOALS) : % : BIN_RECURSE - $(Q)$(MAKE) --no-print-directory BIN=$(firstword $(subst /, ,$@)) $@ +BIN_GOALS_FIRST := $(foreach BGB,$(BIN_GOALS_BINS),\ + $(firstword $(filter $(BGB)/%,$(BIN_GOALS)))) +BIN_GOALS_OTHER := $(filter-out $(BIN_GOALS_FIRST),$(BIN_GOALS)) + +$(BIN_GOALS_FIRST) : % : BIN_RECURSE + $(Q)$(MAKE) --no-print-directory BIN=$(firstword $(subst /, ,$@)) \ + $(filter $(firstword $(subst /, ,$@))/%, $(BIN_GOALS)) +$(BIN_GOALS_OTHER) : % : BIN_RECURSE + $(Q)$(TRUE) .PHONY : BIN_RECURSE endif # NUM_BINS == 1 -- cgit v1.2.3-55-g7522