从源代码和可执行文件生成Makefile?

时间:2011-07-27 21:27:11

标签: build-process makefile build-automation cmake

我有一个很大的代码库,可以使用旧的自定义构建系统构建,使用大量的bash脚本和简单的Makefile共同组合拼凑在一起。

如何使用现代版本的GNU make重新构建构建系统? (或其他一些工具。)

代码库很大,分成许多子目录,并且具有非平凡的跨子文件夹依赖性和系统库链接要求。

由于我可以使用当前构建系统构建一组启用调试的可执行文件,是否有任何方法可以反省这些文件构建一组新的构建和链接规则?

谢谢

2 个答案:

答案 0 :(得分:3)

没有任何魔法会为你解开这个构建系统。清理它将需要缓慢,细致的工作(自然地进行测试)。

如果您还没有,请在GNUMake下开始运行makefile。逐渐清理它们,合并它们,将bash脚本的功能吸收到它们中。绘制这些“非平凡的跨子文件夹依赖关系”;看看Make如何处理依赖关系,当你感觉到它时,在一个沙箱中尝试Advanced Auto-Dependency Generation;一开始理解起来有点棘手,但是一旦你开始使用它,你就会喜欢它。

你可能很想独自离开。毕竟,构建系统按原样工作。麻烦的是,它正在徘徊在Schwartzschild极限上。现在你可以清理它 - 这并不容易,但它将在你的能力范围内。但是,如果不这样做,对代码库进行小的更改将需要对构建系统进行少量更改,始终添加,而不是减少。构建系统将在规模和复杂程度上增长,清理工作将逐渐变得更加困难,直到它超越你的视野,之后你将无法比它增长更快地减少混乱(并且仍然可以完成所有其他工作你必须要做的事情)。这是a well-known anti-pattern

答案 1 :(得分:0)

我用来使GNU进行任何自省的两种技术是:

  • 对于静态GNU make依赖性分析:将“ -d -p”标志注入 现有(正在工作的)制造流程,然后使用 awk / sed / python生成带有graphviz / dot输出的调用图。
  • 用于动态GNU make进程/目标分析:使用“ make SHELL =〜bin / make_introspect.sh”可以检测并发出在makefile调用配方的边界处的记录(如命令行,目标,进程ID,配方),和makefile调用其他makefile

很抱歉,答案的一般性质,到目前为止,我还没有概括过仅在特定项目中使用过的那些技术