Makefile: параллельное выполнение заданной цели c - PullRequest
0 голосов
/ 14 января 2020

Я изучаю Makefile и пытаюсь реализовать параллелизм. Мне известна опция "-j". Однако, например, имея следующий make-файл (на Windows) -

all: a b c d

a: 
 # some build rule

b:
 # some build rule with parallelism

c:
 # some build rule

d:
 #some build rule 

Я пытаюсь запустить make all только с целью "b", работающей параллельно. Передача опции -j с правилом сборки для "b" не работает. Есть указатели?

1 Ответ

0 голосов
/ 14 января 2020

Вы можете заставить рецепт b запускаться в фоновом режиме следующим образом:

all: a b c d
        @echo running $@

.PHONY: a b c d all

a c d: | b
        @echo -n _$@0 && \
         sleep 1 && echo -n _$@1 && \
         sleep 1 && echo _$@2

b:
        @(echo -n _$@0 && \
          sleep 2 && echo -n _$@1 && \
          sleep 2 && echo -n _$@2\
         ) &

Который выводит:

_b0_a0_a1_b1_a2
_c0_c1_b2_c2
_d0_d1_d2
running all

Зависимость только для заказа от b составляет b запускается первым, иначе он не запустится до тех пор, пока a не завершится с -j1 ... Это, конечно, означает, что вам нужно собрать b, если вы соберете либо a c, либо d.

В качестве альтернативы (и я не рекомендую этого) вы можете использовать некоторый механизм ручной блокировки, такой как flock , чтобы предотвратить параллельное выполнение *, 1020 * и d (обратите внимание, что стадо защищает только одну оболочку, поэтому вам придется свернуть свои рецепты в одну строку, защищенную стадом, чтобы это работало).

...