diff options
author | Piotr Jaroszyński | 2010-07-29 15:17:30 +0200 |
---|---|---|
committer | Michael Brown | 2010-08-16 18:26:20 +0200 |
commit | 2d98d4a0182caf51cd4be7f8aa5ec604c42e1f4d (patch) | |
tree | 3f7a257f9683bcc1d5ecd7e9e1198f7bbcb5f1c0 | |
parent | [build] Build pcbios specific drivers only on pcbios (diff) | |
download | ipxe-2d98d4a0182caf51cd4be7f8aa5ec604c42e1f4d.tar.gz ipxe-2d98d4a0182caf51cd4be7f8aa5ec604c42e1f4d.tar.xz ipxe-2d98d4a0182caf51cd4be7f8aa5ec604c42e1f4d.zip |
[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 <p.jaroszynski@gmail.com>
Modified-by: Michael Brown <mcb30@ipxe.org>
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/Makefile.housekeeping | 22 |
2 files changed, 17 insertions, 6 deletions
diff --git a/src/Makefile b/src/Makefile index 94a701b7..950a13f6 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 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 |