我的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非常简单,只包含构建指令,没有任何技巧。
答案 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
等