Makefile欺骗使用VPATH和include

时间:2010-03-16 10:51:56

标签: makefile gnu-make vpath

我正在玩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指令而有任何方式只更新依赖关系,那当然会更好..但我不会屏住呼吸......: )

1 个答案:

答案 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

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