4

我们为我们的系统使用 GNU Make。在我们的 makefile 的末尾,我们有一个名为 Makedepends 的包含,它使用 gcc 上的 -MM 开关生成一堆 .d 文件。然后,我们使用 include $(CXXFILES:.cc=.d) 行为每个 .cc 文件包含 .d 文件。但是当我们删除文件或移动文件时,依赖步骤会中断,我们必须手动删除 .d 文件(即使 make clean 也不起作用,因为依赖项失败)

有没有办法生成这些依赖 .d 文件或包含这些依赖 .d 文件,从而优雅地处理文件删除或重定位?

编辑:例如:我有serial.cc,makefiles生成一个serial.d文件,它依赖于buffer.h,但后来我改变了它,所以我不再需要buffer.h,我删除了buffer.h。下次我运行 make 时,它​​会阻塞,因为它包含仍然使 serial.o 依赖于 buffer.h 的 .d 文件。

4

3 回答 3

7

http://make.mad-scientist.net/papers/advanced-auto-dependency-generation描述了这个确切的问题,以及解决它的几种方法。第一个有点误导,但“高级”基本上是正确的。

于 2008-10-27T03:50:49.250 回答
0

两种可能:

首先,您能否在 Makefile 中添加一条规则来运行依赖步骤:

.SUFFIXES: .d

%.d::
   makedepend_command_here

如果没有,那么从GNU Make 页面的Last Resort部分:info

例如,在测试 makefile 时,您可能不关心源文件是否包含真实数据,只关心它们是否存在。然后你可以这样做:

 %::
         touch $@

使所有需要的源文件(作为先决条件)自动创建。

这会为您创建空.d文件吗?

于 2008-10-27T03:43:33.523 回答
0

如果您将makepp与 option 一起使用--rm-stale,它将注意到不再可构建的文件并将其删除。如果这对您来说是一个正常的用例,您可以将该选项放在.makepprc构建树的根目录中,并且将始终使用它。

但是,makepp 当然会自己处理所有这些依赖项检测,因此您不需要弄乱您的 makefile。它甚至比您的方法更好,因为它可以及时生成所需的标头以供编译器拾取,而哪里gcc -MM会失败。

makepp 还有很多。除了做 GNU make 能做的几乎所有事情,还有很多有用的东西,你甚至可以用一些 Perl 编程来扩展你的 makefile。

于 2013-04-15T13:36:22.713 回答