【问题标题】:How can I use .NOTPARALLEL in makefile only on specific targets?如何仅在特定目标上在 makefile 中使用 .NOTPARALLEL?
【发布时间】:2018-12-27 06:56:40
【问题描述】:

我在 Makefile 中有 5 个标签:

all: label1 label2 label3 label4 last_label

我希望last_label 最后完成,我想使用make -j。如果我使用.NOTPARALLEL,它会全部变成NOTPARALLEL,有什么建议吗?

【问题讨论】:

标签: linux makefile


【解决方案1】:

如果last_label 需要最后运行的原因是它需要来自其他标签的数据,最好的方法是告诉make 该依赖关系:

all: last_label

last_label: label1 label2 label3 label4

如果不存在真正的依赖关系(即,如果您不希望 last_label 在其他之一发生更改时重新构建),并且如果您使用的是 GNU Make,则可以将它们指定为“仅订购” " dependencies--make 只会确保它们在 last_label 构建之前存在:

all: last_label

last_label: | label1 label2 label3 label4

【讨论】:

  • 准确地说是order-only dependency
  • 这应该解决基本要求 - 因此,即使它分叉了许多进程,即使不使用非并行选项,它也必须确保目标的完成顺序! , +1 @laindir
  • 这不适用于 -j7 ,因为它忽略了我认为的一切
  • 这适用于任意数量的作业,因为我们已经明确告诉make last_label 在其他标签完成之前不得运行。
【解决方案2】:

创建一个目标,指定可以并行执行的四个目标并在all 目标中包含这个和last_label

intermediate: label1 label2 label3 label4

all:
        $(MAKE) intermediate
        $(MAKE) last_label

这将并行执行intermediate 中指定的目标,但intermediatelast_label 将被强制连续执行。

(注意$(MAKE) 之前的前导空格是TAB 字符。)

【讨论】:

  • 是的。该解决方案将并行工作,而与同时作业的数量无关。
  • 我假设intermediate 目标应该在all 之后,否则它将成为默认目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2010-10-10
  • 2014-01-01
  • 1970-01-01
相关资源
最近更新 更多