如何在 Makefile 中指定 运行 的默认作业数?

How can I specify the default number of jobs to run from in a Makefile?

考虑以下设计的 Makefile:

.PHONY: all one two
SLEEP = 2

all: one two

one two:
    @sleep $(SLEEP)
    @echo $@

运行 这与 make -j 2 all 可以在 运行 其中一个所需的时间内完成两项工作,因为它们都是 运行 并行的。如果您控制 make 的调用并记住每次都这样做,这会很好用,但如果您只控制 Makefile,则效果不佳。

设置MAKEFLAGS环境变量也可以控制这个:

$ export MAKEFLAGS="-j 2"
$ make all

但是在 Makefile 中设置这个值似乎不起作用:

MAKEFLAGS = -j 2

失败。

export MAKEFLAGS="-j 2"

失败。

同样设置JOBS似乎没有任何效果。有什么方法可以从 Makefile 中控制默认作业数 运行?

请注意,我知道我可以使用虚拟配方并从其中调用递归 make,但这会引入大量混乱,因为我需要为一大堆可能的目标进行设置,并且我正在处理不一定适合递归的包含的 Makefile。

在 GNU Make 4.3(2020 年 1 月 19 日发布)之前,这是不可能的。在 news file 中有这个项目:

  • Makefiles can now specify the '-j' option in their MAKEFLAGS variable and this will cause make to enable that parallelism mode.

现在应该可以解决问题(当然您也可以硬编码一个值):

MAKEFLAGS := --jobs=$(shell nproc)

您可能希望将其与缓冲命令输出并将结果一起输出的选项结合使用(而不是可能混合的行):

MAKEFLAGS += --output-sync=target