[gPXE-devel] [PATCH 3/4] [build] Properly handle multiple goals per BIN directory
Piotr Jaroszyński
p.jaroszynski at gmail.com
Sun Aug 15 17:29:13 EDT 2010
When building multiple targets per BIN with multiple jobs, for example:
$ make -j6 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.jaroszynski at gmail.com>
---
src/Makefile.housekeeping | 23 +++++++++++++++++++----
1 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
index 1ddabb1..fe8480a 100644
--- a/src/Makefile.housekeeping
+++ b/src/Makefile.housekeeping
@@ -175,7 +175,12 @@ endif
#
BIN_GOALS := $(filter bin/% bin-%,$(MAKECMDGOALS))
BIN_GOAL_BINS := $(foreach BG,$(BIN_GOALS),$(firstword $(subst /, ,$(BG))))
-NUM_BINS := $(words $(sort $(BIN_GOAL_BINS)))
+BIN_GOAL_UNIQUE_BINS := $(sort $(BIN_GOAL_BINS))
+# Take the first goal from each BIN directory
+BIN_GOALS_REPS := $(foreach B,$(BIN_GOAL_UNIQUE_BINS),$(firstword $(filter $(B)/%,$(BIN_GOALS))))
+# Rest of the goals
+BIN_GOALS_REST := $(filter-out $(BIN_GOALS_REPS),$(BIN_GOALS))
+NUM_BINS := $(words $(BIN_GOAL_UNIQUE_BINS))
ifeq ($(NUM_BINS),0)
@@ -203,9 +208,19 @@ else # NUM_BINS == 1
# 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 /, ,$@)) $@
-.PHONY : BIN_RECURSE
+
+# The recipe for each of the reps actually builds all goals from each BIN directory
+$(BIN_GOALS_REPS) :
+ $(Q)$(MAKE) --no-print-directory BIN=$(firstword $(subst /, ,$@)) \
+ $(filter $(firstword $(subst /, ,$@))/%, $(BIN_GOALS))
+# Run always
+.PHONY : $(BIN_GOALS_REST)
+
+# Do nothing for the rest of the goals as they are covered by the recipe above
+$(BIN_GOALS_REST) :
+ $(Q)true
+# Run always to avoid a "nothing to be done" messages
+.PHONY : $(BIN_GOALS_REPS)
endif # NUM_BINS == 1
endif # NUM_BINS == 0
--
1.7.1
More information about the gPXE-devel
mailing list