需要一个可以处理丢失文件的makefile依赖关系规则

时间:2008-10-27 03:25:23

标签: dependencies makefile gnu-make

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

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

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

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

两种可能性:

首先,您可以向Makefile添加规则以运行依赖步骤:

.SUFFIXES: .d

%.d::
   makedepend_command_here

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

  

例如,在测试时   makefile,你可能不在乎   源文件仅包含实际数据   他们存在。然后你可能会这样做   这样:

 %::
         touch $@
     

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

这可以为您创建空的.d文件吗?

答案 2 :(得分:0)

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

但是当然makepp会处理所有这些依赖检测本身,所以你不需要弄乱你的makefile。它甚至比你的方法更好,因为它可以及时生成所需的头文件,以便编译器选择,gcc -MM将失败。

makepp还有很多。除了做几乎所有GNU make之外,还有更多有用的东西,你甚至可以通过一些Perl编程扩展你的makefile。