【问题标题】:Makefile: Running a specific target in parallelMakefile:并行运行特定目标
【发布时间】:2020-04-30 15:09:43
【问题描述】:

我正在学习 Makefile 并尝试实现并行性。我知道“-j”选项。但是,例如具有以下生成文件(在 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”并行运行。使用“b”的构建规则传递 -j 选项不起作用。任何指针?

【问题讨论】:

  • 我假设您使用的是 GNU make,因为它提供了-j 选项(这不是 POSIX 对 make 定义的一部分)。除了先决条件之外,GNU make 无法控制允许并行运行的作业。因此,如果您不希望ac 并行运行,您必须声明一个依赖关系,例如a: c。如果您不希望重新构建 c 来强制重新构建 a,则可以查看仅订单规则。

标签: makefile parallel-processing dependencies target


【解决方案1】:

你可以让 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 完成后才会启动...这当然意味着您必须构建@987654328 @ 如果您构建 a cd

或者,(我不建议这样做)您可以使用一些手动锁定机制,例如 flock 来防止 a、c 和 d 并行运行(请注意,flock 只保护单个外壳,所以你必须将你的食谱折叠成一个受羊群保护的单行才能工作)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2017-03-11
    相关资源
    最近更新 更多