并行make:将-j8设置为默认选项

Max*_*rai 36 linux makefile build gnu-make parallel-builds

我可以使用-j参数为构建过程设置线程数.例如,我有4个核心+4虚拟.当我写:make -j8速度增加4倍.

是否可以将该值设置为默认值?(例如,在Linux Gentoo中,在配置文件中,可以设置此默认值).

ps我有Arch Linux

Raf*_*cki 38

您的问题不是关于线程,而是关于make执行的进程(作业).

设置此方法的简单方法是,从控制台使用make时添加:

alias make="/usr/bin/make -j 8"
Run Code Online (Sandbox Code Playgroud)

到你的.profile文件.

您也可以使用setenv MAKEFLAGS '-j 8',但MAKEFLAGS在某些情况下可以忽略此参数,因为保持所需数量的进程需要与递归make调用进行通信.令人高兴的是,此方法适用于当前版本的GNU Make.

  • 由于提到"递归制作"并没有停止,我想再次指出http://aegis.sourceforge.net/auug97.pdf ...此外,make文件需要写得很好甚至允许平行制作.通常,尤其是自动化方法,忽略实际的依赖关系并导致多次构建目标等等... (7认同)
  • 如果该链接将来不起作用,该论文的标题是“递归生成有害”,应该很容易找到。值得一读。 (2认同)

Mat*_*ton 30

setenv MAKEFLAGS '-j8'
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 请注意,“setenv”属于“(t)csh”,在“bash”中不可用(请参阅 https://unix.stackexchange.com/a/85100/200009)。 (3认同)

gtr*_*ina 13

这是我如何做到的:

CORES ?= $(shell sysctl -n hw.ncpu || echo 1)

all:; @$(MAKE) _all -j$(CORES)
_all: install lint test
.PHONY: all _all
…
Run Code Online (Sandbox Code Playgroud)

我基本上将我的默认目标"别名" all为"私有" _all.确定核心数量的命令是特定于OSX的AFAIK,因此如果愿意的话,您可以将其改进为更多跨平台.并且由于?=赋值,我们可以在需要时使用和env变量覆盖它.

编辑:

您也可以MAKEFLAGS从makefile本身附加到您的内容,如下所示:

CPUS ?= $(shell sysctl -n hw.ncpu || echo 1)
MAKEFLAGS += --jobs=$(CPUS)
…
Run Code Online (Sandbox Code Playgroud)

  • 这是恕我直言,比其他解决方案更好,因为你可以根据Makefile定制. (2认同)