web-dev-qa-db-fra.com

Comment changer l'extension de chaque fichier dans une liste avec plusieurs extensions dans GNU make?

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

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

FILES_IN=file1.doc file2.xls

Et je voudrais construire cette variable dans mon makefile à partir de FILES_IN variable:

FILES_OUT=file1.docx file2.xlsx

C'est possible ? Comment ?

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

74
TheFrancisOne

Substituer des extensions dans une liste de noms de fichiers séparés par des espaces est une exigence courante, et il existe des fonctionnalités intégrées pour cela. Si vous souhaitez ajouter un x à la fin de chaque nom de la liste:

FILES_OUT = $(FILES_IN:=x)

La forme générale est $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Ceci prend la valeur de VARIABLE et remplace OLD_SUFFIX À la fin de chaque mot qui se termine par ce suffixe par NEW_SUFFIX (Les mots qui ne correspondent pas restent inchangés). GNU make appelle cette fonctionnalité (qui existe dans chaque implémentation de make)) références de substitution .

Si vous souhaitez simplement changer .doc En .docx Et .xls En .xlsx À l'aide 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 la syntaxe légèrement plus générale $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Cette fonctionnalité n’est pas propre à GNU make, mais elle n’est pas aussi portable que la substitution de changement de suffixe simple.

Il existe également une fonctionnalité GNU make qui permet d’enchaîner plusieurs substitutions sur la même ligne: la fonction patsubst _) .

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