我有一个顶层的makefile,其中指定-jn为并行构建。这个顶层makefile调用了许多不同的组件makefile,不同的组件来自不同的仓库,有些支持并行构建,有些则不支持。不同的组件来自不同的仓库,其中一些支持并行构建,而另一些不支持。我可以在顶层指定-j1来使所有组件工作。但有没有一种方法可以在顶层指定-jn,让标志层叠到一些组件,但对其他组件执行-j1?如果我在选定的下层makefile中使用NOTPARALLEL phony target,会不会只对这些组件执行-j1?
如果我在选定的下层makefile中使用NOTPARALLEL phony target,会不会只对这些组件执行-j1?
是的,如果我使用NOTPARALLEL假目标,会不会只对这些组件执行-j1?从 GNU Make Special Targets 页面中可以看到。
.NOTPARALLEL
如果提到 .NOTPARALLEL 是一个目标,那么即使给出了 '-j' 选项,make 的调用也会被串行运行。任何递归调用的make命令仍然会并行运行配方(除非它的makefile也包含这个目标)。
值得一提的是,对于那些讨厌的第三方库,它们自己没有正确地设置.NOTPARALLEL,有一种方法可以通过递归make命令传递多个文件来实现。
$(MAKE) -f lib.mk -f notparallel.mk
这将确保 .NOTPARALLEL 被提到作为 make 调用的目标,而无需修改库本身。
创建一个文件,其中有一行
.NOTPARALLEL:
话说 notparallel.mk
像Andreas提议的那样。然而,不要简单地把它包含在对第一个子makefile的调用中,因为并行性问题会随着下一级子makefile被这个makefile调用而重新出现。而是将它添加到特殊变量 MAKEFILES
中包含的makefile列表,这些makefile在每次调用 make
从此,。
MAKEFILES += notparallel.mk
maintarget:
$(MAKE) -f sub-makefile.mk