在make的并行执行中警告“强制执行submake”

时间:2014-07-18 05:54:24

标签: parallel-processing cmake makefile

当我运行make -j3并行构建时,我得到了

warning: -jN forced in submake: disabling jobserver mode.

documentation我发现警告已发出

  

如果make检测到与并行处理相关的错误条件   子品牌可以沟通的系统。

这些错误情况是什么?我该怎么做才能治愈它们或抑制错误信息?

makefile是从CMake生成的,所以我不能(=我不想)编辑makefile。

4 个答案:

答案 0 :(得分:6)

如果您从Makefile调用make而不是变量$(MAKE)

,则通常会出现此消息

示例:

更改

foo:
     cd foo/ && make foo

foo:
     cd foo && $(MAKE) foo

答案 1 :(得分:1)

使用较新版本的GNU make(4.0)和CMake(2.8.6和3.3),我无法再重现警告。其中一个在此期间得到修复。

答案 2 :(得分:1)

这与多线程make功能有关。当make进程中有另一个多线程make已经是多线程的时候会发生这种情况。由于存在第二级多线程make,因此内部同步不可用。

可以通过-j参数修复此问题。

make -j 1

上面的代码将避免多个线程,它将删除警告。

同样,我们也可以在makefile中使用-j参数。

target:
    $(MAKE) -j 1 -C ${SUBDIR} $@

上述规则不会为submake生成线程,并且会避免警告。

答案 3 :(得分:1)

您为顶层Makefile调用make -j3,这意味着最多可以同时构建3个目标( make 使用3个线程来构建)。您的顶级Makefile(由 CMake 生成)运行另一个 make (称为子make)。在此调用中,使用了另一个-jN选项。因此,子make使用另一个N个线程来构建其目标,而不是对两个 makes 使用通用的作业服务器。因此总共总共使用3 + N个线程进行构建。这就是这个警告。

要为父级 make 和子make启用公共作业服务器,有两个要求:

  • 不得将显式-jN选项传递给sub-make。调用不带该参数的子品牌。
  • 必须使用$(MAKE)表达式(不仅仅是普通的make)来调用子make。或者,可以在+命令之前添加make前缀。有关详细信息,请参见this answer

如果两个要求都得到满足,那么当您为顶级Makefile运行make -jN时,父 make 和子 make 会使用N个线程用于建筑。