2009-10-19 7 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] 

EDITしてみてください:wgetの-nオプションは、リモートファイルの方が新しい場合を除き何かをダウンロードするからwgetのを防ぐ​​ことができます

+2

「推測」という言葉と別の間違った言葉による別の答え。 –

+0

鈍いのは申し訳ありませんが、そのようなあいまいな質問はたくさんの推測を得るでしょう。 – JesperE

+0

@Pavel:どうやってその間違いを知っていますか? – JesperE

6

Makefileあなたがダウンロードしたファイルは、hello.cです(欠落している場合のみ)。おそらくあなたは何か間違っているのでしょうか?例えば参照:

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

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

そして:Makefileのが希望として活躍しなければならないので

% 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コマンドが実行されなかった2回目)

+0

愚かな(しかし、それはまだもちろん、リモートファイルのタイムスタンプをチェックします。)私は、この簡単なテストを実行するのを忘れてしまった。 wgetがファイルの日付を乱していたようです...ありがとう! – abbot

+0

これは機能を壊すことはありません。 –

6

を、あなたがチェックする必要があります万一の場合がほとんどありません。

1)ソースファイルに言及している.PHONYルールがないことを確認してください。

2)ソースターゲット名が、ダウンロードするファイルパスと一致することを確認します。

また、make -dを実行して、makeがソースファイルを「再ビルド」する必要があると思われる理由を確認することもできます。

+0

また、 'wget'が失敗しないこと、' -O'の後の名前がターゲットにマッチすることを確認してください。さらに良い方法は、 'wget'コマンドで' hello.c'の代わりに '$ @'を使うことです。 – proski

関連する問題