【问题标题】:GNU make - accelerate non-parallel makefile without modificationGNU make - 无需修改即可加速非并行 makefile
【发布时间】:2016-06-01 19:48:12
【问题描述】:

我有一个项目,其中包含一组无法使用 make --jobs=N 运行的 makefile,因为没有足够严格地指定依赖项,make 无法以正确的顺序正确执行配方(即我得到了竞争条件)。

我目前正在使用 Electric-Cloud.com 的 Huddle,它完全符合我的需要:它解析 makefile,然后并行执行作业并考虑未指定的依赖项。

问题:有没有免费或免费的东西可以做到这一点?

是的,我知道我可以重新编写 makefile,但项目管理人员说“不行”。

更新 #1

我知道我必须做一些工作才能获得类似于 Electric-Cloud 的功能。

我知道 Electric-Cloud 会解析 makefile(s) 以查找依赖项,所以使用 makedepend 不会完成同样的事情吗?

我在想:

  1. 在现有的 makefile 上运行 makedepend
  2. 使用include <makedepend.output> 输入输出
  3. make all --jobs=64

更新 2

原来makedepend 是特定于 C/C++ 的:它只是在源文件上运行预处理器并解析任何 #include 语句;不是我需要的。

我需要这个人的要求: Build a makefile dependency / inheritance tree

更新 3

makefile“依赖图生成器”实际上已经存在

http://plindenbaum.blogspot.com/2012/11/visualizing-dependencies-of-makefile.html?m=1

但这对我没有帮助。

我的许多配方创建了其他目标配方使用的目录,有效地使它们成为隐含的​​先决条件。

上述 URL 上的图依赖工具通过解析构建日志的语句来工作,但这些语句并不表示隐式依赖。

即使我尝试使用 --dry-run 运行我的 makefile,构建也会失败,因为某些未执行的配方 - 因为它是空运行 - 创建 make 的其他调用只需要“假装”的目录执行'一个食谱。

更新 4

Electric-Cloud 让 Huddle - 4 个本地核心,非集群 - 任何人都永远免费。 此外,它们会输出一个 .xml 文件,其中列出了每个作业的依赖项,因此我可以使用它来修复我的 makefile 兼容问题,以便它们与 --jobs 选项兼容。

【问题讨论】:

  • 你不必重写现有的makefile来添加依赖信息。如果您可以手动指定信息(或自动生成),您可以将所有这些添加到一个或多个附加的 makefile 中。这可以是“自动的”,因为您可以聪明地发现依赖关系。最终,这就是 Electric Cloud 投入大量时间/工作的工作,从内部制作过程中整理出这些细节。
  • @EtanReisner 如何自动生成它?
  • 完全取决于依赖项是什么以及如何发现它们。我相信至少 EC 的一些工具通过逐字追踪open/etc 来解决这个问题。在构建过程中调用系统调用来构建一个配置文件,并在一些假的然后是真实的上执行此操作,然后重新运行构建以确保它们正确。如果您可以解析文件的依赖关系,那是一回事。如果您需要为此运行它们(动态插件、资产等),那就另当别论了。这里没有“简单”的解决方案(这就是 EC 有一个有意义的产品的原因)。
  • @EtanReisner 我尝试运行 'make --dry-run' 但它失败了,因为某些配方创建的目录实际上是其他目标的隐式先决条件。是的。我猜 Electric-Cloud 肯定很特别。
  • 在这种情况下,任何目标都不应该运行,因此不会因为缺少目录/先决条件而失败。自动生成的makefile/等。仍然需要运行他们的规则,以便那些可能失败,即使使用--dry-run,如果他们真的写得不好。

标签: c++ build makefile gnu-make


【解决方案1】:

我目前正在使用 Electric-Cloud.com 的 Huddle,它完全符合我的需要:它解析 makefile,然后并行执行作业并考虑未指定的依赖项。

我其实不知道这些工具,但是你能不能提供一个super makefile在你的控制之下,明确各个目标的内部依赖关系?

您可能只需要为这些(导入的?)项目目录结构和另一个 Makefile 添加一些间接级别。

【讨论】:

  • 可能。但是 Electric-Cloud 无需提供任何附加功能即可工作。我正在寻找这样的工具。
  • @Adrian 好吧,您以某种方式为该工具引入了一个 main makefile,不是吗?
  • 是的,有一个主 makefile 。 . .但我正在做的唯一工作是将make all 替换为emake all。我接受我必须做一些额外的工作才能获得比 Electric-Cloud 更免费的解决方案。 @EtanReisner 对我的主要问题的评论是正确的:我需要一个工具来自动生成依赖项,然后将其输入到我的 makefile 中。
  • 我尝试编辑您的答案,但猜想它被拒绝了,但添加以下内容,我会接受。 “是的,我一直都知道这是我必须做的;问题是如何使用工具而不是手动获取该信息。答案是 Electric-Cloud Huddle:对于每项工作,它都会输出依赖关系,但更重要的是,即使是隐式依赖关系和更具体地说,文件系统 I/O 依赖项。我可以使用此信息手动添加作业间依赖项,这样我就可以 make 并行运行我的构建“
猜你喜欢
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
相关资源
最近更新 更多