2009-10-19 13 views
5

Próbuję napisać plik Makefile, który powinien pobrać niektóre źródła wtedy i tylko wtedy, gdy ich brakuje.Jak napisać regułę Makefile, aby pobrać plik tylko wtedy, gdy go brakuje?

Coś jak:

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

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

Ale oczywiście to powoduje hello.c należy pobrać za każdym razem wprowadzać polecenia uruchomienia. Chciałbym, aby hello.c został pobrany przez ten plik Makefile tylko, jeśli go brakuje. Czy jest to możliwe dzięki GNU make i jak to zrobić, jeśli tak jest?

Odpowiedz

8

Domyślam się, że wget nie aktualizuje znacznika czasu w hello.c, ale zachowuje zdalny znacznik czasu. To powoduje, że make wierzy, że hello.c jest stary i próbuje pobrać go ponownie. Spróbuj

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

EDIT: N opcja wget uniemożliwi wget z pobierania czegokolwiek, chyba że zdalny plik jest nowszy

+2

Kolejna odpowiedź ze słowem "zgadnij", a druga błędna. –

+0

Przepraszam za bycie tępym, ale takie niejasne pytanie będzie miało mnóstwo domysłów. – JesperE

+0

@Pavel: skąd znasz jego błąd, BTW? – JesperE

6

The Makefile napisałeś do pobrania hello.c tylko, jeśli go brakuje. Być może robisz coś złego? Patrz na przykład:

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

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

oraz:

% 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 

(komenda echo nie został wykonany po raz drugi)

+0

Silly (ale to jeszcze sprawdzić timestamp zdalnego pliku, oczywiście). ja, zapomniałem uruchomić ten prosty test. Wyglądało na to, że wget borykał się z datami plików ... Dzięki! – abbot

+0

To nie łamie funkcjonalności. –

6

Ponieważ Makefile powinno działać jak chcesz, trzeba sprawdzić kilka mało prawdopodobnych przypadków:

1) Sprawdź, czy nie masz żadnych reguł odnoszących się do pliku źródłowego: .

2) Sprawdź, czy docelowa nazwa źródłowa jest zgodna ze ścieżką do pliku, który pobierasz.

Możesz także spróbować uruchomić make -d, aby przekonać się, dlaczego producent uważa, że ​​musi "odbudować" plik źródłowy.

+0

Upewnij się również, że 'wget' nie zawiedzie, a nazwa po' -O' pasuje do celu. Co więcej, użyj '$ @' zamiast 'hello.c' w poleceniu' wget'. – proski

Powiązane problemy