【问题标题】:Generate a Makefile from source and executable?从源代码和可执行文件生成 Makefile?
【发布时间】:2011-10-14 15:39:22
【问题描述】:

我有一个大型代码库,可以使用旧的自定义构建系统构建良好的代码库,该系统使用一堆 bash 脚本和递归组合的简单 Makefile 拼凑在一起。

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

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

既然我可以使用当前的构建系统构建一组启用调试的可执行文件,那么有没有办法自省这些文件,构建一组新的构建和链接规则?

谢谢

【问题讨论】:

    标签: build-process makefile build-automation cmake


    【解决方案1】:

    没有什么魔法可以为您解开这个构建系统。清理它需要缓慢而仔细的工作(自然是一路测试)。

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

    您可能很想独自离开。毕竟,构建系统按原样工作。问题是它在 Schwartzschild 极限上摇摇欲坠。现在你可以把它清理干净——这并不容易,但在你的能力范围内。但如果你不这样做,对代码库的小改动将需要对构建系统进行小的改动,总是添加,从不减少。构建系统会在规模和复杂性上增长,清理工作将逐渐变得更加困难,直到它超出你的视野,之后你将无法以比它增长更快的速度减少混乱(并且仍然会做所有其他你必须做的事情)。这是a well-known anti-pattern

    【讨论】:

      【解决方案2】:

      我用来让 GNU make 进行任何类型的内省的两种技术是:

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

      对不起,答案的一般性质,到目前为止,我从未概括这些技术只是在特定项目中使用它们

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-11-14
        • 2017-10-12
        • 1970-01-01
        • 2017-07-26
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        相关资源
        最近更新 更多