Wie ändere ich die Erweiterung jeder Datei in einer Liste mit mehreren Erweiterungen in GNU make?

82

In einem GNU-Makefile frage ich mich, ob es mit einer Dateilisteneingabe möglich ist, eine Dateilistenausgabe mit neuen Erweiterungen zu erstellen.

Bei der Eingabe erhalte ich diese Liste:

FILES_IN=file1.doc file2.xls

Und ich möchte diese Variable in meinem Makefile aus der Variablen FILES_IN erstellen :

FILES_OUT=file1.docx file2.xlsx

Ist es möglich ? Wie ?

Es ist ziemlich schwierig, weil ich die Dateiliste analysieren und jede Erweiterung (.doc, .xls) erkennen muss, um sie durch die richtige Erweiterung zu ersetzen.

TheFrancisOne
quelle

Antworten:

141

Das Ersetzen von Erweiterungen in einer Liste von durch Leerzeichen getrennten Dateinamen ist eine häufige Anforderung, und dafür gibt es integrierte Funktionen. Wenn Sie xam Ende jedes Namens in der Liste einen hinzufügen möchten :

FILES_OUT = $(FILES_IN:=x)

Die allgemeine Form ist $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Dies nimmt den Wert von an VARIABLEund ersetzt ihn OLD_SUFFIXam Ende jedes Wortes, das mit diesem Suffix endet, durch NEW_SUFFIX(nicht übereinstimmende Wörter bleiben unverändert). GNU make ruft diese Funktion (die in jeder make Implementierung vorhanden) Referenzen Substitution .

Wenn Sie nur ändern wollen .docin .docxund .xlsin der .xlsxVerwendung dieser Funktion benötigen Sie eine Zwischengröße zu verwenden.

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

Sie können auch die etwas allgemeinere Syntax verwenden $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Diese Funktion ist nicht nur für GNU make verfügbar, aber nicht so portabel wie die einfache Substitution, die das Suffix ändert.

Es gibt auch eine GNU-Make-Funktion, mit der Sie mehrere Substitutionen in derselben Zeile verketten können: die patsubstFunktion .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
Gilles 'SO - hör auf böse zu sein'
quelle
3
Oder nur, FILES_OUT := $(patsubst %,%x,$(FILES_IN))wenn die Regel wirklich so allgemein gehalten werden kann.
Tripleee
Wie heißt dieser Operator? Ich möchte die Handbücher überprüfen, kann aber den richtigen Namen nicht finden.
rph
1
@rkioji Welcher Operator? Ich gebe einen Link zum GNU make-Handbuch für $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX), worauf beziehen Sie sich sonst noch?
Gilles 'SO - hör auf böse zu sein'
@ Gilles oh yeah, habe den Link nicht gesehen. Ich bezog mich auf "Substitution". Vielen Dank!
rph