CMake + Ninja构建不跨库并行化

R.M*_*.M. 4 c++ build cmake ninja

我们有一个(C++)程序,它被设置为一系列具有嵌套层次结构的共享库.也就是说,libB.so使用函数from并因此链接libA.so,libC.so使用函数和libB.so和libA.so等链接.

对于我们当前的CMake + Ninja构建系统,我注意到并行构建似乎不会发生在库中.也就是说,虽然Ninja通常会使用12个内核来构建,但如果我从libA触及单个源文件但在libC中触及多个,ninja将仅使用单个处理器来构建libA源文件,直到libA.so被链接,此时它将使用12个处理器来编译libC源文件. - 如果libA源代码中的编译出错,它甚至不会尝试将libC文件编译成目标文件,即使我将-k传递给ninja也是如此.

当然,libC.so的链接需要延迟,直到libA.so被链接,但是源文件到libC源的目标文件的编译不需要为了链接libA而延迟.

我是否缺少关于设置CMake文件以表达库之间依赖关系的最佳方法?或者这是忍者如何运作的不可逾越的限制?

Cra*_*ott 6

最近在CMake邮件列表上询问了这个问题.其中一个开发人员的回复确认您报告的行为是故意的:

遗憾的是,这对于获取CMake项目的正确构建是必要的,因为我们支持在库"foo"中使用add_custom_command以生成在编译时链接到"foo"的库"bar"中包含的头文件的情况,但是我们除了bar对foo的排序依赖之外,没有好的方法表达这种依赖.

虽然在某些情况下可以改进CMake以放宽该约束,但这似乎还没有完成(从CMake 3.6开始).这里有一个开放式门票在Kitware问题跟踪已经为这一点.

更新:这似乎已在CMake 3.9.0中得到修复,尽管该更改导致了回归,随后在3.12.03.11.2 中修复.