在递归的make中,防止-j级联下来。

问题描述 投票:0回答:2

我有一个顶层的makefile,其中指定-jn为并行构建。这个顶层makefile调用了许多不同的组件makefile,不同的组件来自不同的仓库,有些支持并行构建,有些则不支持。不同的组件来自不同的仓库,其中一些支持并行构建,而另一些不支持。我可以在顶层指定-j1来使所有组件工作。但有没有一种方法可以在顶层指定-jn,让标志层叠到一些组件,但对其他组件执行-j1?如果我在选定的下层makefile中使用NOTPARALLEL phony target,会不会只对这些组件执行-j1?

gnu-make
2个回答
0
投票

如果我在选定的下层makefile中使用NOTPARALLEL phony target,会不会只对这些组件执行-j1?

是的,如果我使用NOTPARALLEL假目标,会不会只对这些组件执行-j1?从 GNU Make Special Targets 页面中可以看到。

.NOTPARALLEL

如果提到 .NOTPARALLEL 是一个目标,那么即使给出了 '-j' 选项,make 的调用也会被串行运行。任何递归调用的make命令仍然会并行运行配方(除非它的makefile也包含这个目标)。

值得一提的是,对于那些讨厌的第三方库,它们自己没有正确地设置.NOTPARALLEL,有一种方法可以通过递归make命令传递多个文件来实现。

  1. 创建一个内容为".NOTPARALLEL "的文件,例如notparallel.mk。
  2. 在制作库的配方中,可以这样做。$(MAKE) -f lib.mk -f notparallel.mk

这将确保 .NOTPARALLEL 被提到作为 make 调用的目标,而无需修改库本身。


1
投票

创建一个文件,其中有一行

.NOTPARALLEL:

话说 notparallel.mk 像Andreas提议的那样。然而,不要简单地把它包含在对第一个子makefile的调用中,因为并行性问题会随着下一级子makefile被这个makefile调用而重新出现。而是将它添加到特殊变量 MAKEFILES 中包含的makefile列表,这些makefile在每次调用 make 从此,。

MAKEFILES += notparallel.mk

maintarget:
      $(MAKE) -f sub-makefile.mk
© www.soinside.com 2019 - 2024. All rights reserved.