当我运行make -j3
并行构建时,我得到了
warning: -jN forced in submake: disabling jobserver mode.
在documentation我发现警告已发出
如果make检测到与并行处理相关的错误条件 子品牌可以沟通的系统。
这些错误情况是什么?我该怎么做才能治愈它们或抑制错误信息?
makefile是从CMake生成的,所以我不能(=我不想)编辑makefile。
答案 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个线程用于建筑。