我正在开发一个使用 cmake+ninja 构建的 C++ 项目,在 64 线程计算机上有大约 1200 个构建目标。
有一个翻译单元需要 10 分钟来编译,大多数其他单元都相对较快,因此所有其他目标的构建一起只需要大约 9 分钟(在所有线程上构建)。慢速翻译单元与其余单元相当独立,因此不必延迟安排,但事实证明默认情况下会延迟安排,这样完整的构建需要我 15 到 20 分钟,并且在最后只有一个线程与几乎所有其他目标一起工作。如果首先安排缓慢的翻译单元,阻塞一个线程大约 10 分钟,而所有其他线程处理项目的其余部分,并且整个项目在 10 分钟内构建,那么构建对我来说会更快。
cmake 或 ninja 中是否有一种方法可以改变调度的优先级,以指出缓慢或“请尽早”的目标,而不会弄乱依赖关系?
As of 2021 年 2 月 27 日, 答案是no。有一些未解决的问题(#232 https://github.com/ninja-build/ninja/issues/232, #376 https://github.com/ninja-build/ninja/issues/376)和一个废弃的 PR(#1333 https://github.com/ninja-build/ninja/pull/1333)在 GitHub 上请求基础 Ninja 中的此功能。 CMake 也不提供任何方法来确定目标的优先级(至少到 3.20 为止)。
搞乱依赖关系(甚至仅顺序)在这里没有帮助(正如您可能知道的那样),因为这只会迫使较小的目标完全在长目标之前或完全之后启动。优先提示是这里真正需要的。
我能想到的唯一解决方法(这不是一个很好的方法),是将你的长目标分成一个单独的外部项目 https://cmake.org/cmake/help/latest/module/ExternalProject.html并创建一个同时构建大型目标和独立部分的超级构建。这需要进行重大重组,并且对于许多项目来说是不可能的。不过,如果您因为这个问题而损失了大量的开发时间,那么这种痛苦可能是值得的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)