2010-03-16 60 views
2

我正在玩make文件和VPATH變量。基本上,我從幾個不同的地方(由VPATH指定)獲取源文件,並使用我想要的.o文件列表將其編譯到當前目錄中。使用VPATH的Makefile欺騙和包括

到目前爲止很好,現在我將依賴信息生成一個名爲'.depend'的文件幷包含它。如果Gnumake不存在,Gnumake將嘗試使用迄今爲止定義的規則來創建包含的文件,所以沒關係。基本上,我的makefile看起來像這樣。

VPATH=A/source:B/source:C/source 

objects=first.o second.o third.o 

executable: $(objects) 

.depend: $(objects:.o=.c) 
    $(CC) -MM $^ > [email protected] 

include .depend 

現在對於真正的問題,我可以用任何方式抑制.depend文件的生成嗎?我目前正在一個清晰的環境中工作 - > sloooow,所以我更願意在更新依賴信息時有更多的控制權。

這或多或少是一種學術活動,因爲我可以在執行make之前接觸.depend文件的腳本中包裝這個東西(因此使它比任何源文件更新),但知道它會有趣如果我能以某種方式用'純粹'製造來壓制它。

我無法刪除對源文件的依賴關係(即僅使用.depend:),因爲我依賴於$^變量來爲我執行VPATH分辨率。

如果有會是沒有辦法只更新相關的更新#include指令的結果,會是更好的,當然。但我不會拿着我的呼吸爲一個.. :)

+0

爲什麼不包'的.depend:...'目標變成'if'指導工作? – 2010-03-16 12:26:31

+0

@Pavel:有趣的是,我從來沒有想到這一點。 – falstro 2010-03-16 13:44:55

回答

2

如果您不想每次都重新制作.depend,那麼您一定不會有任何規則。請注意,無論何時您確實需要重新創建依賴項文件,您還必須重新創建一個目標文件(這不是我的見解,它來自Advanced Auto-Dependency Generation,並且花了我一些時間來掌握它)。因此,構建的.depend的關聯規則,利用假目標:

DEPEND_FILE = .depend 
# put this command in the executable rule 
    $(MAKE) DEPENDENCIES 

.PHONY: DEPENDENCIES 
DEPENDENCIES: $(objects:.o=.c) 
    $(CC) -MM $^ > $(DEPEND_FILE) 

-include $(DEPEND_FILE) 

可以讓事情更高效的具有單獨的依賴文件,每一個對象,所以,當一個人改變你不必重新計算所有對象的依賴關係:

# put this command in the %.o rule 
    $(CC) -MM $< > $*.d 

-include *.d 

(編輯:剛剛修正的愚蠢的錯誤。)

+0

噢..最後一件事是非常好的想法。有一個標誌gcc(-MD)在編譯時生成依賴文件,所以你不需要通過預處理器運行兩次。 – falstro 2010-03-16 13:44:17

+0

我已經接受了這個,因爲它激勵我去做我所做的事情,那就是爲每個對象都分開的.d文件,用-MMD編譯每個對象。和'-include * .d'。這會導致重新編譯在需要時觸發,從而產生依賴關係作爲副產品。不需要時不做工作。優秀! – falstro 2010-03-16 14:02:59