Вы можете заставить рецепт 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 (обратите внимание, что стадо защищает только одну оболочку, поэтому вам придется свернуть свои рецепты в одну строку, защищенную стадом, чтобы это работало).