用“ make -jn”的Cmake和平行建筑物
-
05-10-2019 - |
题
我正在尝试为我的源树设置基于CMAKE的构建,但是当我发行时
$ cmake .
$ make -j2
我得到:
jobserver unavailable: using -j1. Add '+' to parent make rule
作为警告。有人知道是否有可能以某种方式修复它?
解决方案
看来这不是CMAKE问题,而是仅出现。
其他提示
在生成的makefile中,当打电话给子蛋糕时,需要使用$(make)(不仅仅是'make'),否则用a +在线之前。也就是说,规则应该像这样:
mysubdir:
$(MAKE) -C mysubdir
或这样:
mysubdir:
+make -C mysubdir
如果您不这样做这两种方式之一,则会给您警告。
我对Cmake一无所知,所以也许它会产生不正确的伪像。或者,也许您在尽头做了不正确的事情。
在我的情况下(与Cmake 3.5.2) cd build && cmake .. && make -j5
工作正常。
但是,我确实得到了 不可用的求职者 通过构建自定义目标(作为其他目标的依赖项)的错误 cmake --build . --target foo
成语。
像这样:
add_custom_target(buildroot
COMMAND ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
- 以便用户可以 make deb
而且它只是有效的。 cmake将在需要时再生makefiles,运行汇编, install
一切都与 make install
, ,然后运行我的自定义脚本以将填充的Buildroot包装到我需要的任何形状或形式中。
果然,我想 make -j15 deb
- 但这失败了。
现在,为 解释了 在cmake devs的邮件列表上,gnu make中的根本原因是,令人惊讶的是(或没有);有解决方法。
根本原因是 make
不会将其工作人员环境传递给儿童流程,以为不是 make
.
为了说明,这是一个过程树(ps -A f
) 分支:
…
\_ bash
\_ make -j15 deb
\_ make -f CMakeFiles/Makefile2 deb
\_ make -f CMakeFiles/buildroot.dir/build.make CMakeFiles/buildroot.dir/build
\_ /usr/bin/cmake --build . --target install ⦿
\_ /usr/bin/gmake install
…
在⦿点, make
丢弃工作人员环境,最终导致单线程汇编。
这 解决方法 在链接的电子邮件中赠送的那样,对我来说效果很好,是将所有自定义命令前缀 +env
. 。像这样:
add_custom_target(buildroot
#-- this ↓↓↓ here -- https://stackoverflow.com/a/41268443/531179
COMMAND +env ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
最后,这出现在规则中 buildroot
在适当的makefile中(cmake会产生其中一堆),并导致GNU行为和尊重 -j
.
希望这可以帮助。
仅通过谷歌搜索,看起来您正在使用Distcc(例如 这里)