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)))
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