【问题标题】:manipulate build order for independent targets in ninja/cmake操纵 ninja/cmake 中独立目标的构建顺序
【发布时间】:2023-03-27 09:45:01
【问题描述】:

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

编译一个翻译单元需要 10 分钟,大多数其他翻译单元的编译速度相当快,因此构建所有其他目标一起(在所有线程上构建)只需大约 9 分钟。慢速翻译单元与其他单元相当独立,因此不必安排延迟,但事实证明默认安排延迟,这样一个完整的构建需要我在 15 到 20 分钟之间,并且在最后只有一个线程可以处理几乎所有其他目标。如果首先安排慢速翻译单元,阻塞一个线程大约 10 分钟,而所有其他线程都在项目的其余部分工作,整个项目在 10 分钟内构建,那么构建对我来说会更快。

在 cmake 或 ninja 中是否有一种方法可以改变调度的优先级以指出缓慢或“请早点”的目标而不会弄乱依赖关系?

【问题讨论】:

  • 我也想知道这个问题的答案。我也有类似的需求。

标签: cmake ninja


【解决方案1】:

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

弄乱依赖关系(甚至是仅顺序)在这里没有帮助(正如您可能知道的那样),因为这只会迫使较小的目标完全在长目标之前或完全之后开始。优先提示是这里真正需要的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2019-06-25
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多