我正在玩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文件的生成吗?我目前正在一个清晰的环境中工作 - > sloooow,所以我更愿意在更新依赖信息时控制它。
这或多或少是一个学术练习,因为我可以将这个东西包装在一个脚本中,该脚本在执行make之前触及.depend文件(从而使它比任何源文件更新),但是知道是否有趣我可以用'纯'制作来抑制它。
我无法删除对源文件的依赖(即只使用.depend:
),因为我依赖于$^
变量为我做VPATH解析。
如果由于更新的#include
指令而有任何方式只更新依赖关系,那当然会更好..但我不会屏住呼吸......: )
答案 0 :(得分: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
(编辑:刚刚纠正了一个愚蠢的错误。)