2017-01-31 2 views
0

У меня есть

$(foreach ___project___, $(UNIT_TEST_STUBS),$(MAKE) -C ../../$(___project___) $(UT_CMD) || exit 1;)

Я хочу make быть параллельны друг в submake, но я не хочу, чтобы submakes быть выполнены параллельно.

Как это сделать?

+0

Было бы легче ответить, если бы вы предоставили полное правило, по крайней мере. Однако, предполагая, что вы указали здесь, это содержимое рецепта, это будет вести себя так, как вы хотите: каждый под-make будет вызываться последовательно, и в каждом суб-make цели будут построены параллельно. – MadScientist

+0

@MadScientist, тогда как бы это было написано, если бы я хотел, чтобы подпрограммы выполнялись параллельно? – Adrian

+1

Вы не можете сделать это из одной цели/рецепта. Вам нужно будет написать одну цель для каждого суб-макета, поэтому make может правильно распараллелить их. Например: http://stackoverflow.com/questions/17834582/run-make-in-each-subdirectory/17845120#17845120 – MadScientist

ответ

2

Как указывает @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: 
Смежные вопросы