我有以下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"执行的配方(我们只关心触发其依赖项(,因此区别无关紧要。