作者:覃维欢 | 来源:互联网 | 2024-11-28 12:01
我们正在使用GNUMake来构建我们的系统,在makefile文件的末尾,我们通过一个名为Makedepends的包含来生成一系列的.d文件。然而,当文件被删除或移动时,依赖关系会中断,我们需要寻找一种方法来优雅地处理这种情况。
在我们的系统构建过程中,我们采用了GNU Make工具。在每个makefile文件的结尾,我们通过一个名为Makedepends的指令来生成多个.d文件,这些文件是通过gcc的-MM选项生成的。接着,我们使用include $(CXXFILES:.cc=.d)语句为每个.cc文件包含相应的.d文件。然而,当文件被删除或移动时,依赖关系检查步骤会出现问题,导致我们需要手动删除.d文件,即便是执行make clean也无法解决,因为依赖项检查失败导致整个过程无法正常进行。
是否存在一种方法,可以在生成或包含这些依赖.d文件时,优雅地处理文件的删除或重定位?
例如:假设我有一个serial.cc文件,makefile会生成一个serial.d文件,该文件声明了一个对buffer.h的依赖。之后,我对代码进行了修改,不再需要buffer.h,并且删除了这个文件。下一次运行make时,由于serial.d文件中仍然存在对buffer.h的依赖,这将导致构建过程失败。
解决方案
#2
有两种可能的解决方案:
第一种,你可以在Makefile中添加一条规则来运行依赖关系生成步骤:
.SUFFIXES: .d
%.d::
makedepend_command_here
如果上述方法不可行,根据GNU Make的文档中的“最后手段”部分,可以尝试以下方法:
例如,在测试makefile时,你可能不关心源文件是否包含实际数据,只关心它们是否存在。这时可以这样做:
%::
touch $@
这样可以自动创建所有作为先决条件的源文件。
这种方法是否可以为你创建空的.d文件呢?
#3
如果你使用makepp工具,并启用--rm-stale选项,它可以识别出无法构建的文件并将其删除。如果这是一个常见的需求,你可以将此选项添加到构建树根目录下的.makepprc文件中,以便每次构建时都使用它。
此外,makepp能够自行处理所有的依赖关系检测,因此你无需在makefile中添加复杂的依赖关系管理。它甚至优于传统的gcc -MM方法,能够在编译器需要之前及时生成必要的头文件。
makepp的功能远不止于此。除了具备GNU make的所有功能外,还提供了许多其他有用的特性,甚至支持通过Perl编程来扩展makefile。