2009-10-19 16 views
5

Estoy tratando de escribir un archivo Makefile que debería descargar algunas fuentes si y solo si faltan.¿Cómo escribir una regla Makefile para descargar un archivo solo si falta?

Algo así como:

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

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

Pero por supuesto, esto hace que hello.c a ser descargados cada vez que se ejecuta comandos hacen. Me gustaría que el archivo Makefile descargue hello.c solo si faltara. ¿Es esto posible con GNU make y cómo hacer esto si es así?

Respuesta

8

Supongo que wget no actualiza la marca de tiempo en hello.c, pero conserva la marca de tiempo remota. Esto hace que make crea que hello.c es antiguo e intenta descargarlo de nuevo. Trate

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

EDIT: La opción -N para wget wget evitará la descarga de nada menos que el archivo remoto es más reciente

+2

Otra respuesta con la palabra "adivinar" y otra incorrecta. –

+0

Lo siento por ser franco, pero una pregunta vaga como esa va a tener un montón de conjeturas. – JesperE

+0

@Pavel: ¿cómo sabes que está mal, por cierto? – JesperE

6

El Makefile escribiste descargas hello.c solo si falta. Quizás estás haciendo algo más mal? Véase, por ejemplo:

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

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

Y:

% 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 

(el comando echo no se ejecutó la segunda vez)

+0

tonto (pero todavía va a comprobar la marca de tiempo del archivo remoto, por supuesto.) yo, olvidé ejecutar esta prueba simple. Parece que wget estaba jugando con fechas de archivo ... ¡Gracias! – abbot

+0

Eso no rompe la funcionalidad. –

6

Desde el Makefile debería estar trabajando como desee, es necesario comprobar una pocos casos poco probables:

1) Compruebe que no tenga ninguna regla .PHONY que mencione el archivo de origen.

2) Compruebe que el nombre del objetivo de origen coincida con la ruta del archivo que está descargando.

También podría intentar ejecutar make -d para ver por qué cree que necesita 'volver a compilar' el archivo fuente.

+0

También asegúrese de que 'wget' no falle y que el nombre después de' -O' coincida con el destino. Mejor aún, use '$ @' en lugar de 'hello.c' en el comando' wget'. – proski

Cuestiones relacionadas