如何为使用makefile构建的整个项目生成一个大的依赖关系图?

时间:2010-05-03 00:49:19

标签: c++ linux makefile

我有一个使用makefile构建的巨大项目。没有文件更改时(即只是遍历项目并检查更新的文件),在项目的根目录下运行make需要20多分钟。

我想创建一个依赖关系图,它会根据更改的文件告诉我需要运行'make'的目录。我已经有了一个可以从我的版本控制系统获得的更新文件列表,我想跳过20分钟的遍历并直接进入需要重新编译的位置。

该项目混合使用多种语言和自定义工具,因此理想情况下这与语言无关(即它只处理所有makefile以生成依赖项)。我也会考虑使用特定于C / C ++的解决方案,因为大多数项目都是用C ++编写的。该项目建立在Linux上。

[编辑 - 澄清,对评论的回应]

该项目确实是巨大的,它只需要20分钟,因为它的大小以及下面链接中描述的所有内容(“递归使得考虑有害”)。不幸的是,这个项目是由来自许多不同地方的许多作品组合在一起的,并且我可以用低级Makefiles做的事情几乎没有灵活性......将这些部分组合在一起的顶级部分是我可以控制的部分。

2 个答案:

答案 0 :(得分:2)

你可以找到的一件事是“makefile graph” - 有一些项目可以从大型makefile项目中创建依赖树。这是一个:http://sailhome.cs.queensu.ca/~bram/makao/index.html。我认为这将创建一个漂亮的图形,并实际构建东西。

如果你想要自己的Makefile解析器,并用你自己的自定义脚本替换make,我的建议是“不要”。但是有一组Perl模块:Makefile::Parser。它声称“通过51%的GNU Make测试套件”。

如果您只想查看花了这么长时间,可以打开Make的调试输出。它的位通常有点无用,比如Make的页面和页面决定是否应用隐式规则,但也许会发生一些不需要发生的明显事情。如果你想这样做,你可以看看remake,“GNU Make with comprehensible tracing and a debugger”。

答案 1 :(得分:0)

如果没有更新的简单制作需要20分钟,那一定是一个巨大的项目!考虑到您的makefile配置没问题,您可以尝试类似ccache的内容。

请注意,即使您获得了刚刚需要编辑的文件列表,您仍可能需要从项目的根目录运行make,因为更改必须链接回主二进制文件。因此,如果ccache还不够好,并且您坚持自己解决这个问题,那么您仍然需要跟踪哪些二进制文件需要再次与“ld”重新链接