【发布时间】: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 不会完成同样的事情吗?
我在想:
- 在现有的 makefile 上运行
makedepend - 使用
include <makedepend.output>输入输出 -
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