Parallel processing 警告";“强行进入潜艇”;并行执行make
当我运行Parallel processing 警告";“强行进入潜艇”;并行执行make,parallel-processing,cmake,makefile,Parallel Processing,Cmake,Makefile,当我运行make-j3并行构建时,我得到 warning: -jN forced in submake: disabling jobserver mode. 在中,我发现发出了警告 如果make在上检测到与并行处理相关的错误条件 子制造商可以通信的系统 这些错误情况是什么?我可以做些什么来修复它们或抑制错误消息 makefile是从CMake生成的,因此我无法(=我不想)编辑makefile。如果从makefile而不是通过变量$(make)调用make,通常会出现此消息 例如: 改变 foo
make-j3
并行构建时,我得到
warning: -jN forced in submake: disabling jobserver mode.
在中,我发现发出了警告
如果make在上检测到与并行处理相关的错误条件
子制造商可以通信的系统
这些错误情况是什么?我可以做些什么来修复它们或抑制错误消息
makefile是从CMake生成的,因此我无法(=我不想)编辑makefile。如果从makefile而不是通过变量$(make)调用make,通常会出现此消息 例如: 改变 foo: cd foo/ && make foo 傅: cd-foo/&制作foo 到 傅: cd foo&$(制作)foo
使用较新版本的GNU make(4.0)和CMake(2.8.6和3.3),我无法再重现警告。其中一个同时得到了修复。这与多线程make功能有关。当已经是多线程的make进程中还有另一个多线程make时,就会发生这种情况。由于存在第二级多线程make,因此内部同步不可用 可以通过-j参数修复此问题
make -j 1
上面的代码将避免多线程,并将删除警告
同样,我们也可以在makefile中使用-j
参数
target:
$(MAKE) -j 1 -C ${SUBDIR} $@
上述规则不会为
submake
生成线程,它将避免警告。您可以为顶级Makefile调用make-j3
,这意味着最多可以同时构建3个目标(make使用3个线程来构建)。您的顶级Makefile(由CMake生成)运行另一个make(称为子make)。在这个调用中,使用了另一个-jN
选项。因此,sub make没有为两个make使用公共jobserver,而是使用另外N个线程来构建其目标。因此,总共有多达3+N
个线程用于构建。这就是这个警告的目的
要为父品牌和子品牌启用通用jobserver,有2个要求:
- 显式
选项不得传递给子制造商。不带此参数调用sub make-jN
- 必须使用
表达式调用子make(而不仅仅是普通的$(make)
)。或者,可以在make
命令之前添加make
前缀。有关详细信息,请参阅+
如果这两个要求都得到满足,那么,当您为顶级Makefile运行
make-jN
时,父make和子make使用N个线程共同构建。我没有自己编写Makefile,它是由CMake自动生成的。CMake通常会正确地执行此操作,也许您是从CmakeList.txwell调用make,就我而言,这正是我所说的潜艇。我有一个函数sub\u make=$(make)-C$(TOPDIR)/subdir/$(1)$(2)
,然后我做了例如$(调用subproject,all)
。所以,正如你所说,它是$(MAKE)
。但我还是得到了警告。好吧。事实证明,由于某种原因,$(MAKE)
调用在MAKE函数中调用时无法正常工作。在这种情况下,函数必须在等号后有@+
符号。因此,在我前面的示例中,为了使其工作,我必须将其声明为sub_make=@+$(make)-C$(TOPDIR)/subdir/$(1)$(2)
感谢分享这些见解。但是使用CMake生成makefile,我无法控制它们。由于它似乎在上游CMake和/或GNU make中得到了修复,我对这个主题很满意。如何在CMakeLists.txt中运行子Makefile?我认为只有CMake在调用make和submake。但在你提出问题后,我不再100%确定。
target:
$(MAKE) -j 1 -C ${SUBDIR} $@