2

我一直在阅读此网页上的 make 手册第 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)

但是,如果我们知道目标先决条件已更改,我们是否不必更新该目标的依赖关系列表?这不正是第一次调用make时所做的吗?我的理解是包含语句中包含的文件看起来像:

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

我没有得到什么?

4

1 回答 1

3

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

由于.P.c文件的依赖项由于其相同的先决条件而始终相同,因此我们不必将它们分开保存,而只需在构建对象时构建依赖项文件。

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

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

依赖文件如下所示:

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

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

于 2013-02-13T13:20:42.387 回答