Makefile:并行运行特定目标

问题描述 投票:0回答:1

我正在学习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”不起作用。有指针吗?

makefile parallel-processing dependencies target
1个回答
0
投票

您可以这样获得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 cd

或者,(我不推荐这样做),您可以使用一些手动锁定机制,例如flock,以防止a,c和d并行运行(请注意,该羊群仅保护单个外壳,因此您可以必须将您的食谱折叠到受羊群保护的一行中才能起作用)。

© www.soinside.com 2019 - 2024. All rights reserved.