如何在Makefile中解决依赖关系是常见的做法?

4
我看到许多方法被用于解决Makefile中的依赖关系,比如使用 gcc -MMsed 命令,或者使用 include 指令(加上一点Perl魔法),或者是 qmakeautomakeinfo make 等等。
面对这么多选择,我感到非常困惑,不知道应该选择哪一个。因此,我想知道现在解决Makefile依赖关系的常见方式是什么?如何最好地应对这个问题?
附注:针对C/CPP项目。

这取决于具体情况,您能否稍微解释一下您的Makefile问题,以便我们更好地帮助您? - pyCthon
这也可能取决于您需要支持哪些平台(您需要多么可移植)。 - Jirka Hanika
@pyCthon其实问题很简单,是依赖关系问题。比如当一个头文件被修改后,重新运行make命令只会重新生成对应的目标文件。我想知道解决这个问题的“最佳”或“常见”方法。谢谢。 - injoy
@Jirka Hanika 如果我只想在Linux上部署我的项目怎么办? - injoy
@injoy 始终包括一个清理选项是一个简单的提示。 - pyCthon
3个回答

1
一般来说,如果你只关心支持GNU make和gcc的系统(如所有的Linux变种和大多数类Unix系统),你可以使用gcc的各种-M标志生成依赖关系,然后在Makefile中使用-include引入它们。这个问题 链接 中有一些好的信息,通常不需要使用sed或任何更复杂的工具。

0

如果您只需要支持许多Linux发行版(如您在评论中所述),那么我建议使用automake/autoconf套件。

此答案假定您只是一般性地提问,而且您还不知道需要解决什么具体问题。

编辑

GNU make可以单独处理项目内的依赖关系生成。

autoconf处理第三方库、工具或系统功能的可选或替代依赖项。automake提供,即使您在没有automake的情况下使用autoconf,其中一些宏有时也很有用。

直接从automake开始的一个附带好处是,您的makefile将以完全可预测的方式(按照惯例和可移植性)运行,而不需要过多的注意力投入。

因此,这是我的谦虚建议。


automake/autoconf 只有在需要支持非 Linux 系统时才是必需的。如果您只关心 Linux,只需使用 GNUmake 即可。 - Chris Dodd
@ChrisDodd - 对你的回答点赞。在你帮助我更好地理解这个问题的重点后,我扩展了我的回答。我怀疑我的回答可能基于有些过时的个人经验,但我会让社区来评判。 - Jirka Hanika

0

有几种方法可以为C/C++项目生成与make兼容的依赖项:

  • gcc -M,它有几个版本,准确性方面是“黄金标准”,因为它使用实际编译器来生成依赖项,而谁比编译器本身更了解如何处理#include语句呢?
  • makedepend,通常不鼓励使用,而是推荐使用由编译器生成的依赖项。
  • fastdep,另一个第三方依赖项生成器,声称比gcc -M更快。
  • ElectricAccelerator具有名为autodep的内置功能,它使用构建中调用的命令的文件系统使用活动来生成依赖关系信息。 autodep相对于其他替代方案的优点在于它非常快速,并且完全独立于工具和编程语言--而其他替代方案都与C/C++绑定或需要使用特定的编译器,autodep适用于所有类型的构建工具。

我之前做过几个选项的性能比较

免责声明:我是ElectricAccelerator的架构师和首席开发人员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接