2013-02-13 47 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