78 votes

makefile change la liste des fichiers

Dans un makefile GNU, je me demande s’il est possible, avec une entrée de liste de fichiers, d’obtenir une sortie de liste de fichiers avec de nouvelles extensions.

En entrée, je reçois cette liste:

 FILES_IN=file1.doc file2.xls
 

Et j'aimerais construire cette variable dans mon makefile à partir de la variable FILES_IN :

 FILES_OUT=file1.docx file2.xlsx
 

C'est possible ? Comment ?

C'est assez difficile parce que je dois analyser la liste de fichiers et détecter chaque extension (.doc, .xls) pour la remplacer afin de corriger l'extension.

134voto

Gilles Points 37537

La substitution des extensions dans une liste d'espaces séparés les noms de fichiers est une exigence commune, et il y a des fonctions intégrées pour cela. Si vous souhaitez ajouter un x à la fin de chaque nom dans la liste:

FILES_OUT = $(FILES_IN:=x)

La forme générale est - $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Cela prend la valeur de VARIABLE et remplace OLD_SUFFIX à la fin de chaque mot qui se termine avec ce suffixe NEW_SUFFIX (non-mots correspondants sont laissés inchangés). GNU faire des appels de cette fonction (qui existe en tout faire de la mise en œuvre) des références de substitution.

Si vous souhaitez simplement modifier l' .doc en .docx et .xls en .xlsx l'utilisation de cette fonctionnalité, vous devez utiliser une variable intermédiaire.

FILES_OUT_1 = $(FILES_IN:.doc=.docx)
FILES_OUT = $(FILES_OUT_1:.xls=.xlsx)

Vous pouvez également utiliser un peu plus en général de la syntaxe $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Cette fonctionnalité n'est pas unique à GNU make, mais il n'est pas aussi portable que la plaine suffixe-changement de substitution.

Il y a aussi un GNU make fonctionnalité qui vous permet de chaîner plusieurs substitutions sur la même ligne: l' patsubst fonction.

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X