使用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的情況下,情況並不是那麼好。
這真的是個問題嗎?你跟蹤多少個依賴關係?現在建造需要多長時間? – n8wrl 2012-08-09 20:29:25
是的,文件I/O是一個問題,它很慢。我們的源代碼大小爲2.5G,對於典型的C文件,我們有大約800個依賴關係。通常需要3-4個小時才能建成。但當然,這不是我們唯一的問題,當然也不是最大的問題,我們只是想嘗試不同的選擇。 – wei 2012-08-09 20:42:22
如果它總是相同的.h文件,你是否已經嘗試過'a.o,b.o:h1.h h2.h'? – 2012-08-09 20:43:00