удалить шаблонный префикс из списка в gnu make - PullRequest
0 голосов
/ 09 ноября 2018

Если у меня есть список файлов:

files := xx_foo1.c yy_foo2.c zz_bar1.c aa_bb_bar2.c

Есть ли способ удалить все до последнего подчеркивания из списка, чтобы получить foo1.c foo2.c bar1.c bar2.c?

Я искал использование patsubst, но мне нужно было бы два % - один для игнорирования первой части и один для сохранения последней.

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018

Это можно сделать, но это немного брутто. Вы хотите что-то вроде этого:

final := $(foreach F,$(files),$(word $(words $(subst _, ,$F)),$(subst _, ,$F)))

Здесь говорится, что для каждого элемента в files мы конвертируем _ в пробел, теперь мы можем использовать наши функции для каждого слова, чтобы манипулировать им: извлечь последнее слово в списке слов.

ETA Ниже указано, что это можно упростить, используя lastword:

final := $(foreach F,$(files),$(lastword $(subst _, ,$F)))
0 голосов
/ 12 ноября 2018

Как я понимаю, вы используете подчеркивание как разделительный символ между иерархическими именами. GNUmake хорошо оснащен для работы с такой схемой, если символ /: имя файла функционирует.

Так что ваш пример должен просто сводиться к

$(notdir $(subst _,/,$(files))
0 голосов
/ 10 ноября 2018

Используйте внешнюю программу - sed - и наслаждайтесь всей ее мощью

files := xx_foo1.c yy_foo2.c zz_bar1.c aa_bb_bar2.c
f := `echo $(files) | sed -e "s/[[:alnum:]]*_//g"`

all:
    echo $(f)
...