Commandes Makefile conditionnelles au fichier existant

J’ai un certain nombre de fichiers latex et je veux pouvoir les comstackr tous de manière pratique. Mon makefile est actuellement comme suit.

targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex)) .PHONY: all all: $(targets) .SECONDEXPANSION: %.pdf: %.tex $$(wildcard $$*_inc/*.*) pdflatex $< 

De cette façon, si un dossier include existe, tout dans ce dossier sera traité comme une dépendance.

Cependant, je souhaite également automatiser l’exécution des scripts Python dépendants. Celles-ci peuvent être la création de tracés ou le calcul des valeurs à inclure. J’ai essayé de faire la modification suivante.

 targets := $(patsubst %.tex, %.pdf, $(wildcard *.tex)) all: $(targets) .PHONY: all run_% .SECONDEXPANSION: %.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py)) pdflatex $< run_%: % $< 

Cependant, cela ne fonctionne pas comme prévu. J’ai la structure de dossier suivante.

 | |-Makefile |-paper.tex |-paper_inc/ |---a.txt |---b.py 

Je m’attendrais à ce que b.py s’exécute, puis lancez pdflatex paper.tex . Cependant, b.py n’est pas exécuté. Si je regarde les dépendances créées, je constate que paper_inc/a.txt et paper_inc/b.py sont des dépendances de paper.pdf , mais non run_paper_inc/b.py

Je ne suis pas tout à fait certain du problème, car il semble que cela devrait fonctionner. De plus, j’ai aussi essayé les lignes suivantes pour la règle %.pdf .

 %.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(addprefix run_,$$(wildcard $$*_inc/*.py)) %.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | sed 's/^/run/') %.pdf: %.tex $$(wildcard $$*_inc/*.*) $$(shell ls $$*_inc/*.py | awk '{print "prefix "$0}') 

Avec chacune de ces règles, cependant, je reçois le message d’erreur make: *** No rule to make target 'paper.pdf'. Stop. make: *** No rule to make target 'paper.pdf'. Stop.

Que faut-il faire pour corriger cette erreur ou, au contraire, que dois-je utiliser à la place de make ?

Vous avez deux problèmes.

Premier:

 run_%: % $< 

A partir du manuel :

Lorsque le motif cible ne contient pas de barre oblique (et il ne le fait généralement pas), les noms de répertoire dans les noms de fichiers sont supprimés du nom de fichier avant sa comparaison avec le préfixe et le suffixe cibles. Après la comparaison du nom de fichier au modèle cible, les noms de répertoires, ainsi que la barre oblique qui les termine, sont ajoutés aux noms de fichiers prérequirejs générés à partir des modèles de prérequirejs de la règle de modèle et du nom de fichier.

C'est un peu difficile à suivre, mais lorsque Make essaie de créer run_paper_inc/b.py , il recherche une règle de modèle qui correspond à b.py La règle ci-dessus ne correspond pas. Mais cela fait:

 %.py: $(subst run_,,$@) 

Seconde:

 .SECONDEXPANSION: %.pdf: ... $$(patsubst %, run_%, $$(wildcard $$*_inc/*.py)) ... 

L'une des principales lacunes de Make est sa faible manipulation des caractères génériques. Dans ce cas, % ne peut pas travailler pour la règle de modèle et le patsubst en même temps. Mais il y a un moyen:

 .SECONDEXPANSION: %.pdf: ... $$(addprefix run_,$$(wildcard %_inc/*.py)) ...