2

我正在玩弄制作文件和 VPATH 变量。基本上,我从几个不同的地方(由 VPATH 指定)获取源文件,然后使用我想要的 .o 文件列表将它们编译到当前目录中。

到目前为止一切顺利,现在我将依赖信息生成到一个名为“.depend”的文件中,并将其包括在内。如果包含文件不存在,Gnmake 将尝试使用到目前为止定义的规则来创建包含的文件,所以没关系。基本上,我的 makefile 看起来像这样。

VPATH=A/source:B/source:C/source

objects=first.o second.o third.o

executable: $(objects)

.depend: $(objects:.o=.c)
    $(CC) -MM $^ > $@

include .depend

现在对于真正的问题,我可以以任何方式抑制 .depend 文件的生成吗?我目前正在一个 clearcase 环境中工作-> sloooow,所以我希望在更新依赖信息时对其进行更多控制。

这或多或少是一个学术练习,因为我可以在执行 make 之前将它包装在一个触及 .depend 文件的脚本中(从而使其比任何源文件都更新),但如果我能以某种方式知道它会很有趣使用“纯”制作压制它。

我无法删除对源文件的依赖(即简单地使用.depend:),因为我依赖于$^变量来为我做 VPATH 解析。

如果有任何方法可以仅因更新#include指令而更新依赖项,那当然会更好..但我并没有为此屏住呼吸.. :)

4

1 回答 1

2

如果你不想每次都重制 .depend,你就不能有一个规则。请注意,当您确实需要重新制作依赖文件时,您还必须重新制作一个目标文件(这不是我的见解,它来自Advanced Auto-Dependency Generation,我花了一些时间来掌握它)。因此,使用 PHONY 目标在链接规则中构造 .depend :

DEPEND_FILE = .depend
# put this command in the executable rule
    $(MAKE) DEPENDENCIES

.PHONY: DEPENDENCIES
DEPENDENCIES: $(objects:.o=.c)
    $(CC) -MM $^ > $(DEPEND_FILE)

-include $(DEPEND_FILE)

您可以通过使用单独的依赖文件来提高效率,每个对象一个,这样当一个更改时您不必重新计算所有对象的依赖关系:

# put this command in the %.o rule
    $(CC) -MM $< > $*.d

-include *.d

(编辑:刚刚纠正了一个愚蠢的错误。)

于 2010-03-16T12:27:52.633 回答