summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPiotr Jaroszyński2010-07-29 15:17:30 +0200
committerMichael Brown2010-08-16 18:26:20 +0200
commit2d98d4a0182caf51cd4be7f8aa5ec604c42e1f4d (patch)
tree3f7a257f9683bcc1d5ecd7e9e1198f7bbcb5f1c0
parent[build] Build pcbios specific drivers only on pcbios (diff)
downloadipxe-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/Makefile1
-rw-r--r--src/Makefile.housekeeping22
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