Как изменить расширение каждого файла в списке с несколькими расширениями в 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, но она не так переносима, как простая замена суффикса.
существует также функция GNU make, которая позволяет вам связывать несколько подстановки на одной строке:patsubst
функции.
FILES_OUT = $(patsubst %.xls,%.xlsx,$(patsubst %.doc,%.docx,$(FILES_IN)))