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


84

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

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

FILES_IN=file1.doc file2.xls

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

FILES_OUT=file1.docx file2.xlsx

Является ли это возможным ? Как ?

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

Ответы:


141

Подстановка расширений в список имен файлов, разделенных пробелами, является обычным требованием, и для этого есть встроенные функции. Если вы хотите добавить 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)))

3
Или просто, FILES_OUT := $(patsubst %,%x,$(FILES_IN))если правило действительно можно сделать таким общим.
Tripleee

Как зовут этого оператора? Я хочу проверить руководство, но не могу найти правильного имени.
rph

1
@rkioji Какой оператор? Я даю ссылку на руководство GNU make $(VARIABLE:OLD_SUFFIX=NEW_SUFFIX), о чем еще вы говорите?
Жиль 'SO- перестань быть злом'

@Gilles о да, не видел ссылки. Я имел в виду «подмену». Благодаря!
rph
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.