J'ai un Makefile avec le type de règle suivant:
%.html:
./generate-images.py > $@
make $(patsubst %.png,%.gif,$(wildcard *.png))
le generate-images
le script écrit non seulement le fichier HTML (sur stdout) mais plusieurs fichiers .png dans le répertoire courant. Le but ici est de les convertir en .gif. (pas vraiment, mais c'est un exemple)
Cela fonctionne si je l'invoque directement. Le problème est: si je l'invoque à partir d'une autre règle où foo.html
est une dépendance, l'instruction générique ne trouve aucun fichier. En d'autres termes, il vient d'appeler make
sans arguments, ce qui n'est pas ce que je veux ici.
Quel est le problème avec le caractère générique? Ou, existe-t-il une meilleure façon de procéder?
Réponses:
1 pour la réponse № 1Cela ressemble à l'évaluation de tous les $()
expressions comme il traite le Makefile
, plutôt que lors de l'exécution de chaque règle. Vous pouvez ajouter une règle à votre makefile comme ceci:
images: $(patsubst %.png,%.gif,$(wildcard *.png))
.PHONY: images
puis changez votre exemple d'extrait de code en
%.html:
./generate-images.py > $@
make images
afin que Make évalue le glob au bon moment. C'est quelque chose sur lequel la vérification du manuel pourrait être utile.
3 pour la réponse № 2
Bien que votre problème puisse être quelque chose de différent, j'en vois clairement un.
Tout le texte de tout les commandes de la règle sont traitées simultanément afin que les fonctions et les variables de make soient développées. Supposons que vous .png
fichiers dans le répertoire, et vous appelez make pour qu'il devrait les régénérer: a.png
et b.png
. Ensuite, après avoir appelé make, le texte de la règle ressemblerait effectivement à ceci:
file.html:
./generate-images.py > file.html
make
car au moment de la lecture du makefile, il n'y avait pas .png
des dossiers! Une fois la première ligne exécutée, les fichiers s'affichent, mais la ligne suivante a déjà été généré être juste "faire".
Et ce n'est que lorsque vous invoquerez votre makefile pour la deuxième fois,
file.html:
./generate-images.py > file.html
make a.gif b.gif
Ce n'est pas ce que tu veux. Je suggère donc de le faire de la bonne façon.
# If you have batch conversion program, this may be helpful
images.stamp: *.png
convert_all_images $?
touch images.stamp
# OR, if you want convert one-by-one with means of make
images.stamp: $(wildcard *.png)
touch images.stamp
%.gif: %.png
convert_one --from=$^ --to=$@
# HTML would look like
%.html:
./generate-images.py > $@
make images.stamp
Donc, quand vous invoquez make all
, il génère des fichiers HTML et convertit les images nouvellement générées. Notez que il ne convertira que les images mises à jourc'est ce que tu veux
Grâce à Bêta pour signaler le désordre avec les extensions gif / png.