2009-10-19 6 views
5

J'essaye d'écrire un Makefile qui devrait télécharger certaines sources si et seulement si elles sont manquantes.Comment écrire une règle Makefile pour télécharger un fichier seulement s'il est manquant?

Quelque chose comme:

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

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

Mais bien sûr, cela provoque hello.c à télécharger à chaque fois que la commande make est exécuté. Je voudrais que hello.c soit téléchargé par ce Makefile seulement s'il est manquant. Est-ce possible avec GNU make et comment le faire si c'est le cas?

Répondre

8

Je suppose que wget ne met pas à jour l'horodatage de hello.c, mais conserve l'horodatage distant. Cela provoque make à croire que hello.c est vieux et tente de le télécharger à nouveau. Essayez

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

EDIT: L'option -N wget empêchera wget de télécharger quoi que ce soit à moins que le fichier distant est plus récent

+2

Une autre réponse avec le mot "deviner" et un autre faux. –

+0

Désolé d'être contondant, mais une vague question comme celle-là va vous donner un tas de suppositions. – JesperE

+0

@Pavel: comment savez-vous son mauvais, BTW? – JesperE

6

Le Makefile que vous avez écrit télécharge hello.c uniquement s'il est manquant. Peut-être que vous faites quelque chose d'autre? Voir par exemple:

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

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

Et:

% 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 

(la commande echo n'a pas été exécuté la deuxième fois)

+0

Silly (mais ça va toujours vérifier l'horodatage du fichier distant, bien sûr.) moi, j'ai oublié d'exécuter ce test simple. Il est apparu que wget était en train de jouer avec les dates de fichier ... Merci! – abbot

+0

Cela ne casse pas la fonctionnalité. –

6

Depuis le Makefile devrait fonctionner comme vous le souhaitez, vous devez vérifier une 1) Vérifiez que vous n'avez aucune règle .PHONY mentionnant le fichier source.

2) Vérifiez que le nom de la cible source correspond au chemin du fichier que vous téléchargez.

Vous pouvez également essayer d'exécuter make -d pour savoir pourquoi il est nécessaire de "reconstruire" le fichier source.

+0

Assurez-vous également que 'wget' n'échoue pas et que le nom après' -O' correspond à la cible. Mieux encore, utilisez '$ @' au lieu de 'hello.c' dans la commande' wget'. – proski

Questions connexes