Jak zmienić rozszerzenie każdego pliku na liście z wieloma rozszerzeniami w marce GNU?

84

Zastanawiam się, czy w pliku makefile GNU jest możliwe utworzenie listy plików wyjściowych z nowymi rozszerzeniami z wejściem listy plików.

Na wejściu otrzymuję tę listę:

FILES_IN=file1.doc file2.xls

Chciałbym zbudować tę zmienną w moim pliku makefile ze zmiennej FILES_IN :

FILES_OUT=file1.docx file2.xlsx

Czy to możliwe ? W jaki sposób ?

Jest to dość trudne, ponieważ muszę przeanalizować listę plików i wykryć każde rozszerzenie (.doc, .xls), aby zastąpić je poprawnym rozszerzeniem.

TheFrancisOne
źródło

Odpowiedzi:

141

Zastępowanie rozszerzeń na liście nazw plików oddzielonych białymi znakami jest powszechnym wymaganiem i są do tego wbudowane funkcje. Jeśli chcesz dodać xna końcu każdej nazwy na liście:

FILES_OUT = $(FILES_IN:=x)

Ogólna forma to $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Przyjmuje wartość VARIABLEi zamienia OLD_SUFFIXna końcu każdego słowa, które kończy się tym przyrostkiem NEW_SUFFIX(słowa niepasujące pozostają niezmienione). GNU wywołuje tę funkcję (która istnieje w każdej implementacji make) odniesienia do zastępowania .

Jeśli chcesz tylko do zmian .docw .docxi .xlsdo .xlsxkorzystania z tej funkcji, należy użyć zmiennej pośredniej.

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

Możesz także użyć nieco bardziej ogólnej składni $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Ta funkcja nie jest unikalna dla make GNU, ale nie jest tak przenośna jak zwykłe podstawianie zmieniające sufiksy.

Istnieje również funkcja GNU make, która pozwala łączyć wiele podstawień w tej samej linii: patsubstfunkcja .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
Gilles 'SO- przestań być zły'
źródło
3
Lub po prostu, FILES_OUT := $(patsubst %,%x,$(FILES_IN))jeśli reguła naprawdę może być tak ogólna.
tripleee
Jak nazywa się ten operator? Chcę sprawdzić instrukcje, ale nie mogę znaleźć właściwej nazwy.
rph
1
@rkioji Jaki operator? Podaję link do podręcznika tworzenia GNU $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX), do czego jeszcze się odnosisz?
SO- Gilles 'SO- przestań być zły'
@Gilles o tak, nie widziałem linku. Odniosłem się do „substytucji”. Dzięki!
rph