Jak zmienić rozszerzenie KAŻDEGO pliku na liście z wieloma rozszerzeniami w GNU make?

W pliku GNU Makefile, zastanawiam się, czy jest możliwe, z wejściem listy plików, aby zrobić wyjście listy plików z nowymi rozszerzeniami.

In input, I get this list:

FILES_IN=file1.doc file2.xls

I chciałbym zbudować tę zmienną w moim pliku makefile zFILES_IN zmiennej:

FILES_OUT=file1.docx file2.xlsx
Czy to możliwe ? Jak ?

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

1 answers

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

FILES_OUT = $(FILES_IN:=x)

Ogólna forma to $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Przyjmuje wartość VARIABLE i zastępuje OLD_SUFFIX na końcu każdego słowa kończącego się tym przyrostkiem przez NEW_SUFFIX (niepasujące słowa pozostają bez zmian). GNU make wywołuje tę funkcję (która istnieje w każdej implementacji make) zastąpienie Bibliografia .

Jeśli chcesz zmienić .doc na .docx i .xls na .xlsx używając tej funkcji, musisz użyć zmiennej pośredniej.

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

Można również użyć nieco bardziej ogólnej składni $(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX). Ta funkcja nie jest unikalna dla GNU make, ale nie jest tak przenośna jak zwykła substytucja zmieniająca przyrostek.

Istnieje również funkcja GNU make, która pozwala na łączenie wielu podstawień w tej samej linii: patsubst function .

FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))
 116
Author: Gilles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-22 11:18:22