我一直在阅读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
我没有到这里来的是什么?
答案 0 :(得分:3)
重点是不存在或过时的对象不需要依赖列表。无论如何它都是重建的。
由于.P
和.c
文件的相关先决条件相同,因此它们的相关性始终相同,因此我们不必单独保留它们,只需在构建对象时构建依赖项文件
当目标先决条件发生更改时,将重新构建对象,并将依赖关系列表更新为副作用。我们不需要此make运行中的列表,仅在下一个,因为我们无论如何都要在此运行中重新构建对象。
make
的第一次调用不需要依赖列表,纯粹基于每个对象进行操作。作为生成对象的副作用,会生成依赖关系列表,并且下一个make
运行会找到它们。
依赖项文件如下所示:
list.o : list.cc list.h debug.h
由于上述原因,根本不需要提及依赖文件。