我正在学习Makefile并尝试实现并行性。我知道“ -j”选项。但是,例如,具有以下makefile(在Windows上)-
all: a b c d
a:
# some build rule
b:
# some build rule with parallelism
c:
# some build rule
d:
#some build rule
我正在尝试仅在目标“ b”并行运行的情况下运行make all
。将-j选项与构建规则一起传递给“ b”不起作用。有指针吗?
您可以这样获得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,以防止a,c和d并行运行(请注意,该羊群仅保护单个外壳,因此您可以必须将您的食谱折叠到受羊群保护的一行中才能起作用)。