如何使用make的--jobs与子目录?

时间:2017-11-08 17:46:23

标签: makefile jobs

我的C ++项目的构建时间非常长。它由一堆子项目(库)组成,在文件系统文件夹中构建。我想用make的--jobs(-j)参数进行并行构建来加速它。这样做的正确方法是什么?文档说有一些与子目录进行并行构建的技巧。

根目录中的Makefile如下所示:

...
all:
    $(MAKE) -C DirA
    $(MAKE) -C DirB
...

DirA中的Makefile:

all:
    $(MAKE) -C SubDirA
    $(MAKE) -C SubDirB
    $(MAKE) -C SubDirC

在DirB:

all:
    $(MAKE) -C SubDirD
    $(MAKE) -C SubDirE
    $(MAKE) -C SubDirF

等等。叶子文件夹中的Makefile非常简单,只包含构建指令,没有任何技巧。

1 个答案:

答案 0 :(得分:2)

您可以按原样使用这些makefile将-j添加到make,并且您将获得一些并行性,但您将无法获得最大并行度。问题是make只对目标进行并行化:显然它不能(通常)在同一目标中并行运行多个命令!

因此,在顶级制作中,系列将会连续$(MAKE) -C DirA然后$(MAKE) -C DirB。当make build DirA时,它将首先连续运行$(MAKE) -C SubDirA,然后$(MAKE) -C SubDirB等。然后当make进入SubDirA时,它将并行地构建目标。这很好,如果构建目录的顺序很重要,你可能需要做的事情,除了有时候make可以开始在SubDirB目标上工作但不会,直到所有目标都在{{1完成。

处理子目录的更好方法是使用make rules:

SubDirA

和子目录同上。请注意,必须包含SUBDIRS := DirA DirB all: $(SUBDIRS) $(SUBDIRS): $(MAKE) -C $@ .PHONY: $(SUBDIRS)

由于每个目录都是一个单独的目标,如果您使用.PHONY,现在make可以并行调用它们。

哦,如果某些子目录的某些内容依赖于其他子目录,您可以在makefile中明确声明该依赖关系,以便了解它:

-j