如何在 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
考虑以下设计的 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