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

Як називається цей оператор? Я хочу перевірити інструкції, але не можу знайти правильну назву.
rph

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

@Gilles о так, не бачив посилання. Я мав на увазі "заміщення". Дякую!
rph
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.