我正在尝试使用make文件和VPATH变量。基本上,我从几个不同的地方抓取源文件(由VPATH指定),并使用我想要的.o文件列表将它们编译到当前目录中。
到目前为止一切顺利,现在我正在将依赖项信息生成到一个名为'.depend‘的文件中,并将其包含在内。如果包含文件不存在,Gnumake将尝试使用到目前为止定义的规则来创建包含文件,所以这是可以的。基本上,我的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环境->中工作,所以当我更新依赖信息时,我更愿意让它处于更好的控制之下。
这或多或少是一个学术练习,因为我可以在执行make之前将它封装在一个接触.depend文件的脚本中(从而使它比任何源文件都要新),但如果我能以某种方式使用‘纯’make来抑制它,这将是一件有趣的事情。
我不能删除对源文件的依赖(例如,简单地使用.depend:),因为我依赖于$^变量来为我执行VPATH解析。
如果有任何方法可以只更新依赖项作为更新的#include指令的结果,那当然会更好。但我不会屏息等待的.:)
发布于 2010-03-16 20:27:53
如果你不想每次都重写.depend,你就不能有一个规则。请注意,当您确实需要重新生成依赖文件时,还必须重新生成一个目标文件(这不是我的见解,它来自Advanced Auto-Dependency Generation,我花了一些时间才掌握它)。因此,使用伪目标在链接规则中构造.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(编辑:刚刚更正了一个愚蠢的错误。)
https://stackoverflow.com/questions/2453689
复制相似问题