Подтвердить что ты не робот

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

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

На вкладке я получаю этот список:

FILES_IN=file1.doc file2.xls

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

FILES_OUT=file1.docx file2.xlsx

Возможно ли это? Как?

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

4b9b3361

Ответ 1

Подстановка расширений в списке имен файлов, разделенных пробелами, является общим требованием, и для этого есть встроенные функции. Если вы хотите добавить x в конце каждого имени в списке:

FILES_OUT = $(FILES_IN:=x)

Общий вид $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX). Это принимает значение VARIABLE и заменяет OLD_SUFFIX в конце каждого слова, которое заканчивается этим суффиксом на NEW_SUFFIX (несогласованные слова остаются неизменными). GNU вызывает эту функцию (которая существует в каждой реализации 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)))