У меня есть
$(foreach ___project___, $(UNIT_TEST_STUBS),$(MAKE) -C ../../$(___project___) $(UT_CMD) || exit 1;)
Я хочу make
быть параллельны друг в submake, но я не хочу, чтобы submakes быть выполнены параллельно.
Как это сделать?
У меня есть
$(foreach ___project___, $(UNIT_TEST_STUBS),$(MAKE) -C ../../$(___project___) $(UT_CMD) || exit 1;)
Я хочу make
быть параллельны друг в submake, но я не хочу, чтобы submakes быть выполнены параллельно.
Как это сделать?
Как указывает @Michael Livshin, вы уже, кажется, ответили на свой вопрос. Может быть, опереться на сделать вместо синтаксиса оболочки, чтобы связать нагрузку команд вместе. В основном вы хотите сделать увидеть что-то вроде этого:
.PHONY: all
all:
${MAKE} -C ../../foo/ -j9 ut-cmd
${MAKE} -C ../../bar/ -j9 ut-cmd
${MAKE} -C ../../bum/ -j9 ut-cmd
Авто поколение из списка довольно прямо вперед.
submakes := foo bar bum
define generate-submake
${MAKE} -C ../../$1/ ut-cmd
endef
.PHONY: all
all: ; $(foreach _,${submakes},$(call generate-submake,$1))
Обратите внимание на пустую строку в определении generate-submake
. Это важно. Запустите это с помощью make -j9
.
Если вы действительно хотите, чтобы все в этом make-файле запускалось серийно (но суб-элементы должны быть параллельными), тогда просто введите цель .NOTPARALLEL
.
.NOTPARALLEL:
Было бы легче ответить, если бы вы предоставили полное правило, по крайней мере. Однако, предполагая, что вы указали здесь, это содержимое рецепта, это будет вести себя так, как вы хотите: каждый под-make будет вызываться последовательно, и в каждом суб-make цели будут построены параллельно. – MadScientist
@MadScientist, тогда как бы это было написано, если бы я хотел, чтобы подпрограммы выполнялись параллельно? – Adrian
Вы не можете сделать это из одной цели/рецепта. Вам нужно будет написать одну цель для каждого суб-макета, поэтому make может правильно распараллелить их. Например: http://stackoverflow.com/questions/17834582/run-make-in-each-subdirectory/17845120#17845120 – MadScientist