2009-10-19 19 views
5

Ich versuche, ein Makefile zu schreiben, das einige Quellen herunterladen sollte, wenn und nur wenn sie fehlen.Wie schreibt man eine Makefile-Regel, um eine Datei nur herunterzuladen, wenn sie fehlt?

Etwas wie:

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

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

Aber natürlich führt dies hello.c Befehl jedes Mal machen heruntergeladen werden ausgeführt. Ich möchte hello.c von diesem Makefile nur heruntergeladen werden, wenn es fehlt. Ist das mit GNU make möglich und wie geht das, wenn es so ist?

Antwort

8

Meine Vermutung ist, dass wget den Zeitstempel auf hello.c nicht aktualisiert, aber den Remote-Zeitstempel beibehält. Dies verursacht make zu glauben, dass hello.c alt ist und versucht, es erneut herunterzuladen. Versuchen

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

EDIT: Die Option -N zu wget wird verhindert, dass wget von etwas herunterzuladen, wenn die Remote-Datei neuer ist

+2

Eine andere Antwort mit dem Wort "raten" und eine andere falsche. –

+0

Entschuldigen Sie, dass Sie unverblümt sind, aber eine vage Frage wie diese wird eine Menge Vermutungen bekommen. – JesperE

+0

@Pavel: Woher weißt du, dass es falsch ist, BTW? – JesperE

6

Die Makefile Sie schrieb Downloads hello.c nur, wenn es fehlt. Vielleicht machst du etwas anderes falsch? Siehe zum Beispiel:

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

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

Und:

% 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 

(der echo Befehl wurde zum zweiten Mal nicht ausgeführt)

+0

Silly (aber es wird immer noch den Zeitstempel der Remote-Datei überprüfen, natürlich.) Ich habe vergessen, diesen einfachen Test zu machen. Es stellte sich heraus, dass wget mit Dateiterminen herumhantierte ... Danke! – abbot

+0

Das bricht die Funktionalität nicht. –

6

Da das Makefile sollte arbeiten, wie Sie wollen, müssen Sie ein prüfen, einige unwahrscheinliche Fälle:

1) Vergewissern Sie sich, dass Sie keine .PHONY Regeln haben, die die Quelldatei erwähnen.

2) Überprüfen Sie, ob der Quellzielname mit dem Dateipfad übereinstimmt, den Sie herunterladen.

Sie könnten auch versuchen, make -d ausgeführt, um zu sehen, warum make denkt, es muss die Quelldatei neu erstellen.

+0

Stellen Sie außerdem sicher, dass 'wget' nicht fehlschlägt und dass der Name nach' -O' dem Ziel entspricht. Besser noch, benutze '$ @' anstelle von 'hello.c' im' wget' Befehl. – proski

Verwandte Themen