When building multiple targets per BIN with multiple jobs, for example: make -j16 bin-i386-efi/gpxe.efi{,drv,rom} bin-x86_64-efi/gpxe.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 <p.jaroszyn...@gmail.com> Modified-by: Michael Brown <mc...@ipxe.org> Signed-off-by: Michael Brown <mc...@ipxe.org> --- src/Makefile | 1 + src/Makefile.housekeeping | 22 ++++++++++++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Makefile b/src/Makefile index bbd169b..e23737e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -21,6 +21,7 @@ CP := cp ECHO := echo PRINTF := printf PERL := perl +TRUE := true CC := $(CROSS_COMPILE)gcc CPP := $(CC) -E AS := $(CROSS_COMPILE)as diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping index 1ddabb1..b5f7705 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 -- 1.7.2.1 _______________________________________________ gPXE-devel mailing list gPXE-devel@etherboot.org http://etherboot.org/mailman/listinfo/gpxe-devel