/ / GNU Make et wildcards - fichiers manquants - Makefile, gnu-make

GNU Make et wildcards - fichiers manquants - Makefile, gnu-make

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 № 1

Cela 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.