需要一个可以处理丢失文件的makefile依赖关系规则
-
04-07-2019 - |
题
我们为我们的系统使用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。