makefile并行运行目标

时间:2018-07-03 07:35:24

标签: bash shell makefile

我有以下带有两个规则的文件。

  

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

即并行运行module1&2目标。

这是makefile:

all: module1 module2

.PHONY: module1
module1:
    @echo "run module 1"
    DIR=$(PWD)
    @echo $(DIR)

.PHONY: module2
module2:
    @echo "run module2”

cleanup: 
    fzr clean $(DIR)

2 个答案:

答案 0 :(得分:9)

您可以设置make选项,这些选项通常是通过makefile本身的命令行调用传递给make的。将此行添加到您的makefile中

MAKEFLAGS += -j2

并且您可以调用make而不使用-j标志,当它们彼此不依赖时,它们仍将产生两个进程来并行构建目标。要自动确定要产生的作业数量,可以在linux上使用

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

和MacOS

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

答案 1 :(得分:0)

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

请参见commit 2607d39Jeff King (peff)(2020年2月18日)。
(由Junio C Hamano -- gitster --commit 29b09c5中合并,2020年3月2日)

doc-diff:在渲染Makefile中使用单冒号规则

签名人:杰夫·金

当通过“ 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...

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

即使我们在这里为“全部”设置了多个规则,我们也没有针对“全部”执行任何配方(我们只关心触发其依赖性),因此区别是无关紧要的。