我们为我们的系统使用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。

有帮助吗?

解决方案

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

其他提示

两种可能性:

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

.SUFFIXES: .d

%.d::
   makedepend_command_here

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

  

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

 %::
         touch $@
     

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top