Как изменить расширение каждого файла в списке с несколькими расширениями в 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)))