2013-02-13 26 views
2

我一直在阅读make手册第4.14节“自动生成先决条件”和“高级自动依赖项”this web pagemake中的高级自动依赖关系

我想我明白从化妆手册中的部分,但有一两件事,我不能在我链接的网页绕到我的头:

如果你仔细想想,这个重新调用真的不需要。由于我们知道目标的某些先决条件已更改,因此我们确实不需要此版本中更新的先决条件列表。我们已经知道我们要重建目标,并且拥有更新的列表不会影响该决定。

所以不是这样做的:

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

    include $(SRCS:.c=.P) 

他们这样做:

%.o : %.c 
      @$(MAKEDEPEND) 
      $(COMPILE.c) -o [email protected] $< 

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

但是,如果我们知道一个目标的先决条件已经改变,我们不都去为依赖列表更新目标?这不正是在第一次调用make时做了什么?我的理解是包含在包括语句看起来就像文件:

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

什么我没有得到吗?

回答

3

问题是,一个不存在或过时的对象不需要依赖列表。无论如何它都会重建。

由于.P.c文件的依赖关系由于它们具有相同的先决条件而始终保持一致,因此我们无需单独保留它们,只要构建该对象就构建该依赖关系文件。

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

make的第一次调用不需要依赖项列表,并且纯粹以每个对象为基础进行操作。作为生成对象的副作用,将生成相关性列表,然后运行下一个make运行。

的相关文件看起来像:

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

没有必要提及在那里所有的依赖文件,出于上述原因。

+0

“.P和.c文件”是否指.P和.o文件? – evading 2013-02-13 13:44:59

+0

此外,如果不需要依赖文件来构建对象,我需要什么?无论如何,链接在每个可执行文件的明确目标中指定。 – evading 2013-02-24 10:12:50

+0

@refuser:当然,.P和.o文件,对不起。您需要依赖文件来确保在* next *运行中不需要重建。 – thiton 2013-02-25 16:44:05