【问题标题】:Debugging CMake/Make dependencies for a parallel build为并行构建调试 CMake/Make 依赖项
【发布时间】:2012-07-26 09:56:26
【问题描述】:

我管理一个复杂的 C++ 项目,其构建定义是用CMake 编写的,而构建本身是通过调用make 获得的。源码树由多个模块组成,并行度高。

线性构建总是成功的,而并行构建大多数时候都是成功的。当在这样的构建过程中遇到依赖问题时,我通常会去修复它,但我想以编程方式测试依赖关系,而不是在问题发生时修复它们。

理想的解决方案是遍历CMake 中的所有依赖项并修复它们,但这在实践中并不总是可行,因为我们大量使用自定义宏来处理特定于我们的源树的某种依赖项(我无法详细说明,抱歉)。因此,我正在考虑以不同的方式(并且可能更有效地)解决问题,尝试尽可能多地重用标准工具。

  1. 我的第一个想法是在Make 作业调度中注入某种“随机性”,因此构建机器可以通过重建树来无限期地尝试使用不同的编译路径,直到遇到故障。另一个问题(here),不过指出Make没有这个功能。

  2. 1234563当然,这种解决方案的缺点是增加了编译时间。
    然而,这种部分解决方案有一个根本性的缺陷:如果发现问题,则证明缺少依赖项,但如果没有产生错误,则无法证明所有依赖项都是正确的。

你怎么看?我怎样才能实现我的目标?我更喜欢重用标准工具并可以应用于广泛受众的解决方案。

谢谢。

【问题讨论】:

  • 当构建失败时,再次运行它不会解决问题吗?
  • @arrowdodger 是的,但我想一劳永逸地完成构建。
  • 是否将 make 调用包装到调用 make 的脚本中,直到成功算作一次性?
  • @arrowdodger 我知道这个解决方案,但我不喜欢它;这是一个解决问题的技巧,但没有解决它。

标签: dependencies makefile cmake parallel-builds


【解决方案1】:

如果你真的想有效地解决这个问题,我认为你需要使用更好的make。 Electric Make(ElectricAccelerator 的一部分)是make 的 GNU make 兼容变体,它在构建期间监控文件系统访问,并自动 detect and correct problems caused by out-of-order execution。此外,ElectricMake 可以生成一个annotated build log,它将向您显示构建中的每个作业访问了哪些文件,以及作业之间的依赖关系(显式和隐式),您可以使用它来纠正您的 makefile 中缺少的依赖关系.

您可以下载并试用 ElectricAccelerator 的免费增值版 ElectricAccelerator Huddle

免责声明:我是 ElectricAccelerator 的架构师和技术主管。

【讨论】:

  • 谢谢。我来看看。
【解决方案2】:

您可以尝试分析依赖项本身。 Cmake 可以很容易地在 dot/graphviz 中生成依赖图: http://www.cmake.org/Wiki/CMake:For_CMake_Hackers

一些图论可能有助于您的分析: http://en.wikipedia.org/wiki/Graph_theory

【讨论】:

    猜你喜欢
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-24
    • 2013-04-25
    相关资源
    最近更新 更多