生成文件并行运行目标



我有以下makefile,有两个规则。

有没有办法并行运行这两个规则,我的意思是最大化 核心的能力?我看到了这一部分,但不确定我是否知道如何将其用于我的目的,因为我想在 makefile 中而不是从命令行处理它。

即并行运行模块 1 和 2 目标。

这是生成文件:

all: module1 module2
.PHONY: module1
module1:
@echo "run module 1"
DIR=$(PWD)
@echo $(DIR)
.PHONY: module2
module2:
@echo "run module2”
cleanup: 
fzr clean $(DIR)

您可以设置通常通过 makefile 本身中的命令行调用传递make选项。将此行添加到生成文件

MAKEFLAGS += -j2

你可以在没有-j标志的情况下调用make,当它们不相互依赖时,它仍然会生成两个进程来并行构建目标。要自动确定要生成的作业数量,您可以在 Linux 上使用它

NPROCS = $(shell grep -c 'processor' /proc/cpuinfo)
MAKEFLAGS += -j$(NPROCS)

和在 MacOS 上

NPROCS = $(shell sysctl hw.ncpu  | grep -o '[0-9]+')
MAKEFLAGS += -j$(NPROCS)

如果您的规则有"::"而不是":",即使是MAKEFLAGS += -j$(NPROCS)不起作用,如 Git 2.25.2(2020 年 3 月(中的最新修复所示

请参阅提交 2607d39(2020 年 2 月 18 日(,作者:Jeff King (peff(。
(由 Junio C Hamano --gitster-- 合并于 提交 29b09c5, 02 Mar 2020(

doc-diff:在渲染生成文件时使用单冒号规则

签名者:杰夫·金

当通过"man"将troff手册页渲染为文本时,我们创建一个临时的Makefile并将其提供给"make"。
这里的目的有两个:

  • 重用同一树先前中断渲染的结果
  • 使用 make 的-j选项并行构建

但是第二部分似乎不起作用(至少在我的GNU make版本4.2.1中(。它一次只运行一个渲染。

我们对每个文件使用双冒号"all"规则,例如:

all:: foo
foo:
...actual render recipe...
all:: bar
bar:
...actual render recipe...
...and so on...

正是这个双冒号似乎抑制了并行性
我们可以切换到常规的单冒号规则。

尽管我们在这里确实有多个针对"all"的规则,但我们没有任何针对"all"执行的配方(我们只关心触发其依赖项(,因此区别无关紧要。

最新更新