如何为使用 makefile 构建的整个项目生成一个大型依赖映射?
Posted
技术标签:
【中文标题】如何为使用 makefile 构建的整个项目生成一个大型依赖映射?【英文标题】:How to generate one large dependency map for the whole project that builds with makefiles? 【发布时间】:2010-05-03 00:49:19 【问题描述】:我有一个使用 makefile 构建的巨大项目。如果没有文件发生变化(即只是遍历项目并检查更新的文件),在项目的根目录运行 make 需要 20 多分钟。
我想创建一个依赖映射,它会根据更改的文件告诉我需要在哪些目录中运行“make”。我已经有一个可以从我的版本控制系统获得的更新文件列表,我想跳过 20 分钟的遍历,直接进入需要重新编译的位置。
该项目混合了多种语言和自定义工具,因此理想情况下它是独立于语言的(即它只会处理所有 makefile 以生成依赖项)。我也会选择特定于 C/C++ 的解决方案,因为该项目的大部分内容都是 C++。该项目基于 Linux 构建。
[编辑 - 澄清,对 cmets 的回应]
这个项目确实是巨大的,仅仅因为它的大小和下面链接中描述的所有内容(“递归使认为有害”),它需要 20 分钟。不幸的是,该项目是由来自许多不同地方的许多部分组合在一起的,而且我可以使用低级 Makefile 做什么几乎没有灵活性……将这些部分组合在一起的***文件是我可以控制的。
【问题讨论】:
20 分钟听起来很长。有多少个文件?您现在使用什么方法来生成依赖项? 您是否阅读过“Recursive Make Considered Harmful”并应用其中的思想? 20 分钟只是为了检查事情似乎尖叫着构建存在结构性问题。 链接:miller.emu.id.au/pmiller/books/rmch 我最近在找一个相关的任务,发现了这个:sailhome.cs.queensu.ca/~bram/makao/index.html @rescdsk:这看起来像是一个答案而不是评论:如果提出完全按照斯坦的要求去做。 【参考方案1】:您可以寻找“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 tracking and a debugger”。
【讨论】:
【参考方案2】:如果一个没有更新的简单制作需要 20 分钟,那一定是一个巨大的工程!考虑到你的 makefile 配置没问题,你可以试试ccache。
请注意,即使您获得了只需要编译的文件列表,您可能仍需要从项目的根目录运行 make,因为必须将更改链接回主二进制文件。因此,如果 ccache 还不够好,而您坚持自己解决该问题,您仍然需要使用“ld”再次跟踪哪些二进制文件需要重新链接
【讨论】:
ccache 有助于不必要的重新编译。尽管它解决了偶尔出现的子树中的特定问题,但它无助于快速遍历项目。事实上,它增加了大约 2-3 分钟到“没有文件更改”make :(.以上是关于如何为使用 makefile 构建的整个项目生成一个大型依赖映射?的主要内容,如果未能解决你的问题,请参考以下文章