操纵忍者/ cmake中独立目标的构建顺序

时间:2019-03-18 16:33:45

标签: cmake ninja

我正在使用cmake + ninja构建的c ++项目,在64线程计算机上具有大约1200个构建目标。

有一个翻译单元需要10分钟的时间来编译,大多数其他翻译单元的速度都相当快,因此所有其他目标的构建在一起(在所有线程上构建)仅需9分钟。慢速翻译单元与其余部分完全无关,因此不必将其安排得很晚,但事实证明,默认情况下,它是被安排为迟到的,因此完整的构建需要15到20分钟,在最后,只有一个线程可以完成几乎所有其他目标。如果我先安排慢速翻译单元,阻塞一个线程大约10分钟,而所有其他线程在项目的其余部分上工作,则整个构建在10分钟内完成。

cmake或忍者中是否有办法改变调度的优先级,以指出慢速目标或“请及早”目标而又不弄乱依赖项?

1 个答案:

答案 0 :(得分:1)

截至 2021 年 2 月 27 日,答案是。 GitHub 上有一些未解决的问题 (#232, #376) 和一个废弃的 PR (#1333) 要求在 base Ninja 中使用此功能。 CMake 也不提供任何方法来确定目标的优先级(至少到 3.20)。

处理依赖项(甚至仅订单)在这里没有帮助(您可能知道),因为这只会迫使较小的目标完全在长目标之前或之后完全启动。这里真正需要的是优先提示。

我能想到的唯一解决方法(这不是一个好方法)是将您的长目标拆分为单独的 ExternalProject 并创建一个同时构建大目标和独立部分的超级构建时间。这将需要进行重大的重组,并且对于许多项目来说都是不可能的。不过,如果您为此问题损失了大量开发时间,那么这可能是值得的。