Как изменить расширение каждого файла в списке с несколькими расширениями в GNU make?


в GNU makefile мне интересно, можно ли с помощью ввода списка файлов сделать вывод списка файлов с новыми расширениями.

во входных данных, я получаю этот список:

FILES_IN=file1.doc file2.xls

и я хотел бы построить эту переменную в моем makefile из FILES_IN переменной:

FILES_OUT=file1.docx file2.xlsx

это возможно ? Как ?

это довольно сложно, потому что мне нужно разобрать список файлов и обнаружить каждое расширение (.доктор. ,xls), чтобы заменить его, чтобы исправить расширение.

1 65

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