【问题标题】:Makefile trickery using VPATH and include使用 VPATH 和包含的 Makefile 诡计
【发布时间】:2010-03-16 10:51:55
【问题描述】:

我正在玩弄制作文件和 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 指令来更新依赖项,那当然会更好.. 但我不会为此屏住呼吸.. :)

【问题讨论】:

  • 为什么将.depend: ... 目标包装到if 指令中不起作用?
  • @Pavel:有趣,我从没想过。

标签: makefile gnu-make vpath


【解决方案1】:

如果您不想每次都重新制作 .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

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

【讨论】:

  • 哦.. 最后一件事是很好的想法。 gcc (-MD) 有一个标志可以在编译时生成依赖文件,所以你不需要通过预处理器运行它两次。
  • 我接受了这一点,因为它启发了我去做我所做的事情,即为每个对象创建单独的 .d 文件,并使用 -MMD 编译每个对象。还有-include *.d。这会导致在需要时触发重新编译,从而产生依赖项作为副产品。不需要时不做任何工作。太棒了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多