Как изменить расширение каждого файла в списке с несколькими расширениями в GNU make?
в GNU makefile мне интересно, можно ли с помощью ввода списка файлов сделать вывод списка файлов с новыми расширениями.
во входных данных, я получаю этот список:
FILES_IN=file1.doc file2.xls
и я хотел бы построить эту переменную в моем makefile из FILES_IN переменной:
FILES_OUT=file1.docx file2.xlsx
это возможно ? Как ?
это довольно сложно, потому что мне нужно разобрать список файлов и обнаружить каждое расширение (.доктор. ,xls), чтобы заменить его, чтобы исправить расширение.
1 ответ:
замена расширений в списке разделенных пробелами имен файлов является общим требованием, и для этого есть встроенные функции. Если вы хотите добавить
x
В конце каждого имени в списке:FILES_OUT = $(FILES_IN:=x)
общая форма
$(VARIABLE:OLD_SUFFIX=NEW_SUFFIX)
. Это принимает значениеVARIABLE
и заменяетOLD_SUFFIX
в конце каждого слова, которое заканчивается этот суффиксNEW_SUFFIX
(несоответствующие слова остаются без изменений). GNU make вызывает эту функцию (которая существует в каждом make реализация)замена ссылок.если вы просто хотите изменить
.doc
на.docx
и.xls
на.xlsx
используя эту функцию, вы должны использовать промежуточную переменную.FILES_OUT_1 = $(FILES_IN:.doc=.docx) FILES_OUT = $(FILES_OUT_1:.xls=.xlsx)
вы также можете использовать немного более общий синтаксис
$(VARIABLE:OLD_PREFIX%OLD_SUFFIX=NEW_PREFIX%NEW_SUFFIX)
. Эта функция не является уникальной для GNU make, но она не так переносима, как простая замена суффикса.появилась функция операционной системы, которая позволяет многократные цепи замены в одной строке: the
patsubst
функции.FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))