2009-10-19 64 views
5

我想寫一個Makefile,它應該下載一些來源當且僅當它們丟失。如何編寫Makefile規則以僅在文件丟失時下載文件?

喜歡的東西:

hello: hello.c 
    gcc -o hello hello.c 

hello.c: 
    wget -O hello.c http://example.org/hello.c 

但是,當然,這將導致hello.c被下載每次使運行命令。我希望hello.c只有在缺失的情況下才能由此Makefile下載。這是可能的GNU make和如何做到這一點,如果它是?

回答

8

我的猜測是wget不更新hello.c上的時間戳,但保留了遠程時間戳。這導致make認爲hello.c已舊,並嘗試再次下載它。嘗試

hello.c: 
     wget ... 
     touch [email protected] 

編輯:-N選項的wget將阻止wget的從網上下載任何東西,除非遠程文件較新

+2

另一個答案與單詞「猜」和另一個錯誤的。 – 2009-10-19 11:12:04

+0

不好意思,但這樣一個模糊的問題會得到一堆猜測。 – JesperE 2009-10-19 11:32:19

+0

@Pavel:你怎麼知道它錯了,BTW? – JesperE 2009-10-19 11:32:51

6

您寫的Makefile只有當它缺少時才下載hello.c。也許你做錯了什麼?例如見:

hello: hello.c 
     gcc -o hello hello.c 

hello.c: 
     echo 'int main() {}' > hello.c 

和:

% make 
echo 'int main() {}' > hello.c 
gcc -o hello hello.c 
% rm hello 
% make 
gcc -o hello hello.c 
% rm hello* 
% make 
echo 'int main() {}' > hello.c 
gcc -o hello hello.c 

(沒有執行echo命令第二次)

+0

傻(但它仍然會檢查過程中的遠程文件的時間戳。)我忘了跑這個簡單的測試。看起來wget正在搞文件日期......謝謝! – abbot 2009-10-19 13:13:45

+0

這不會破壞功能。 – 2009-10-19 13:15:12

6

由於Makefile中應該是工作,只要你想,你需要檢查幾個不太可能的情況:

1)檢查你沒有任何.PHONY規則提及源文件。

2)檢查源目標名稱是否與您正在下載的文件路徑匹配。

您也可以嘗試運行make -d以瞭解爲什麼make認爲它需要「重新構建」源文件。

+0

還要確保'wget'不會失敗,'-O'後面的名字與目標匹配。更好的是,在'wget'命令中使用'$ @'而不是'hello.c'。 – proski 2015-02-20 17:57:28