我们有一个(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源代码编译中出现错误,即使我将-k传递给ninja,它甚至不会尝试将libC文件编译成目标文件。
当然,libC.so的链接需要延迟直到libA.so被链接,但是源文件到libC源的目标文件的编译不应该被延迟以便链接libA
我是否缺少关于设置CMake文件以表达库之间依赖关系的最佳方法?或者这是Ninja如何运作的不可逾越的限制?
答案 0 :(得分:6)
最近在CMake邮件列表上询问了这个问题。来自其中一个开发者的response确认您报告的行为是故意的:
遗憾的是,这对于获取CMake项目的正确构建是必要的 通常是因为我们支持使用add_custom_command的情况 在库“foo”中生成一个包含在其中的头文件 在库“bar”中编译链接到“foo”,但我们没有好处 除了bar的排序依赖之外,表达这种依赖的方法 在foo。
虽然在某些情况下可以改进CMake以放宽该约束,但这似乎还没有完成(从CMake 3.6开始)。已经在Kitware问题跟踪器中有open ticket。
更新:这似乎是fixed in CMake 3.9.0,虽然这种变化导致了随后的fixed in 3.12.0或possibly 3.11.2的回归。