make中的高级自动依赖项

时间:2013-02-13 12:42:42

标签: makefile dependency-management

我一直在阅读this web page制作手册第4.14节“自动生成先决条件”和“高级自动依赖”。

我想我理解制作手册中的部分,但有一件事我无法在我链接的网页上包围:

  

如果你考虑一下,这个重新调用真的是不需要的。由于我们知道目标的某些先决条件已更改,因此我们并不需要此构建中的更新先决条件列表。我们已经知道我们将重建目标,拥有更新的列表不会影响该决定。

所以不要这样做:

  %.P : %.c
          $(MAKEDEPEND)
          @sed 's/\($*\)\.o[ :]*/\1.o $@ : /g' < $*.d > $@; \
             rm -f $*.d; [ -s $@ ] || rm -f $@

  include $(SRCS:.c=.P)

他们这样做:

  %.o : %.c
          @$(MAKEDEPEND)
          $(COMPILE.c) -o $@ $<

  -include $(SRCS:.c=.P)

但是如果我们知道目标先决条件已经改变,那么我们不必更新该目标的de依赖列表吗?并不是在第一次调用make时完成了什么?我的理解是include语句中包含的文件看起来像:

list.o list.P : list.cc list.h debug.h

我没有到这里来的是什么?

1 个答案:

答案 0 :(得分:3)

重点是不存在或过时的对象不需要依赖列表。无论如何它都是重建的。

由于.P.c文件的相关先决条件相同,因此它们的相关性始终相同,因此我们不必单独保留它们,只需在构建对象时构建依赖项文件

当目标先决条件发生更改时,将重新构建对象,并将依赖关系列表更新为副作用。我们不需要此make运行中的列表,仅在下一个,因为我们无论如何都要在此运行中重新构建对象。

make的第一次调用不需要依赖列表,纯粹基于每个对象进行操作。作为生成对象的副作用,会生成依赖关系列表,并且下一个make运行会找到它们。

依赖项文件如下所示:

list.o : list.cc list.h debug.h

由于上述原因,根本不需要提及依赖文件。