2010-07-18 4 views
15

Je suis en train de dire « le téléchargement du dépôt git ne fonctionnera que si le répertoire Yank/existe Si le répertoire Yank/n'existe pas alors le faire. »Un makefile peut-il avoir un répertoire en tant que cible?

yank/gist.el/gist.el : yank 
    cd yank ; git clone http://github.com/defunkt/gist.el.git 

yank: 
    mkdir yank 

J'utilise makepp - http://makepp.sf.net et je suis obtenir l'erreur:

[[email protected] ~/edan/pkg/gist.el] makepp 
makepp: Loading makefile `/home/metaperl/edan/pkg/gist.el/Makeppfile' 
makepp: Entering directory `/home/metaperl/edan/pkg/gist.el' 
mkdir yank 
mkdir: cannot create directory `yank': File exists 
makepp: error: Failed to build target `/home/metaperl/edan/pkg/gist.el/yank' [1] 
makepp: 0 files updated, 0 phony targets built and 1 target failed 
[[email protected] ~/edan/pkg/gist.el] 

Mais pourquoi serait-il essayer de faire le répertoire Yank si elle existe? La "source" a déjà été créée ...

+0

Nous avons déjà discuté de la création de répertoires: http://stackoverflow.com/questions/1950926/create-directories-using-make-file. Vous pouvez également vouloir savoir que [la façon dont vous créez des répertoires n'est pas adaptée aux threads] (http://stackoverflow.com/questions/1894427/makefile-with-directory-tree-creation-suitable-for-parallel-j- construire). –

+0

@Pavel: la façon dont le répertoire est créé est correcte, car c'est une dépendance du fichier. Dans l'exemple que vous citez, le problème est précisément que le répertoire n'est pas une dépendance des cibles qui l'utilisent mais d'une autre cible, ce qui ne sert à rien. – Gilles

+0

@Gilles, ok, vous avez raison, j'ai mêlé les problèmes. Je voulais juste vous persuader que les répertoires comme cibles ne sont pas une bonne option ... –

Répondre

16

Oui, un Makefile peut avoir un répertoire comme cible.

Votre problème pourrait être que le cd ne fait pas ce que vous voulez: il fait cd et la git clone est effectuée dans le répertoire d'origine (celui que vous cd ed de, pas celui que vous cd ed à) . En effet, pour chaque commande du Makefile, un shell supplémentaire est créé. Une solution de contournement consiste à exécuter cd et à cloner en tant qu'une commande avec && du shell.

Cela devrait fonctionner:

bla/f: dir 
    cd dir && touch f 

dir: 
    mkdir dir 
+1

Vrai, et sur les principes généraux, makefiles devrait toujours '&&' plutôt que ';'. Cependant, ceci ne peut pas être un problème ici: 'cd' ne s'exécute qu'après * la cible' yank' a été refaite. – Gilles

+6

J'utilise généralement une cible de 'dir/.dirstamp' au lieu de' dir' avec une règle de 'mkdir -p dir && touch $ @'. Les horodatages sur les répertoires dans unix changent lorsque le contenu du répertoire change empêchant l'exécution des règles dépendantes. –

1

Votre makefile devrait faire ce que vous attendez. Puisque yank n'a aucune dépendance, il ne sera pas refait s'il existe. Donc, cela ressemble à un bug dans makepp. Vous pouvez le confirmer en essayant votre makefile avec une implémentation traditionnelle de make.

+0

J'ai essayé, et il n'a pas été reproduit. –

Questions connexes