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