2008-10-27 31 views
3

我们使用GNU让我们的系统。在我们的makefile结尾,我们有一个名为Makedepends的包含,它使用gcc上的-MM开关生成一堆.d文件。然后,我们使用include $(CXXFILES:.cc = .d)行包含每个.cc文件的.d文件。但是,当我们删除文件或移动文件时,依赖性步骤中断,我们必须手动删除.d文件(即使清理不起作用,因为依赖关系失败)需要一个makefile依赖关系规则,能够处理丢失的文件

有没有办法生成这些依赖关系。 d文件还是包含这些依赖性.d文件,它们将优雅地处理文件删除或重定位?

编辑:例如:我有serial.cc和makefiles生成一个serial.d文件,它有一个依赖于buffer.h,但然后我改变它,所以我不需要buffer.h了,我删除buffer.h。下一次我运行make时,它会窒息,因为它包含仍然会使serial.o依赖于buffer.h的.d文件。

回答

0

两种可能性:

首先,你能添加一个规则,以你的Makefile运行依赖步:

.SUFFIXES: .d 

%.d:: 
    makedepend_command_here 

如果没有,那么从info页面为GNU的Last Resort部分品牌:

例如,测试 生成文件时,你可能不关心,如果 源文件包含真实的数据,上它们存在。然后,你可以做 此:

%:: 
     touch [email protected] 

使所有需要的 (如先决条件)的源文件被自动创建 。

这个工作是否会为你创建空的.d文件?

+0

它没有那么多,.d文件丢失,但如果.cc文件被删除,相应的.d文件仍然悬挂在先前的make上,并且会导致make失败,因为它取决于.c文件。 – MattSmith 2008-10-27 03:57:52

+0

然后我推荐wnoise的链接:如他所说,滚动第一部分到“有用”部分。并尝试“信息制作”或找到一本好书,了解详情和示例。你永远不会“完成”学习......总会有另一颗宝石!祝你好运! – 2008-10-27 04:02:08

0

如果使用makepp与选项--rm-stale,它会发现它不再是可建文件并删除它们。如果这是您的正常用例,那么您可以将该选项放置在构建树的根目录下,并且将始终使用该选项.makepprc

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

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