2012-08-09 131 views
1

我們目前爲每個.o生成一個依賴文件。但是當增量構建時,Make會從依賴文件中讀取每個.o的依賴關係。是否要檢查這些相關文件的時間戳並將其與.o進行比較?如果是這樣,是否可以緩存依賴關係的狀態以避免由於每個對象文件的重複狀態檢查而導致I/O命中過多?gnu如何處理依賴關係?

for example, 
a.o: h1.h h2.h 
    gcc... 
b.o: h1.h h2.h 
    gcc... 

如果我們緩存h1.h當它建立a.o h2.h的狀態,做我們保存兩個檢查時構建B.O?

我對make系統並不熟悉,但目前正在尋找方法來改善其在大型傳統C項目上的性能。

+1

這真的是個問題嗎?你跟蹤多少個依賴關係?現在建造需要多長時間? – n8wrl 2012-08-09 20:29:25

+0

是的,文件I/O是一個問題,它很慢。我們的源代碼大小爲2.5G,對於典型的C文件,我們有大約800個依賴關係。通常需要3-4個小時才能建成。但當然,這不是我們唯一的問題,當然也不是最大的問題,我們只是想嘗試不同的選擇。 – wei 2012-08-09 20:42:22

+0

如果它總是相同的.h文件,你是否已經嘗試過'a.o,b.o:h1.h h2.h'? – 2012-08-09 20:43:00

回答

2

使用strace用於這一目的:

... 
stat("a.o", 0x7fff70c35f00)    = -1 ENOENT (No such file or directory) 
stat("h1.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
stat("h2.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
touch a.o 
stat("b.o", 0x7fff70c35f00)    = -1 ENOENT (No such file or directory) 
touch b.o 

而第二次運行(增量編譯):

... 
stat("a.o", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
stat("h1.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
stat("h2.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
stat("b.o", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0 
make: Nothing to be done for `all'. 

strace -e trace=stat make --touch 

第一次運行(全力打造)的輸出如您所見,GNU Make緩存時間戳,避免不必要的stat系統調用。不過,我想,在使用遞歸make的情況下,情況並不是那麼好。

+0

謝謝,太糟糕了,我們有遞歸make,但至少我們現在知道GNU Make會緩存。 – wei 2012-08-09 23:31:25