Объединение элементов списка в GNU Make

В моем make файле у меня есть переменная со списком каталогов, например:

DIRS = /usr /usr/share/ /lib

Теперь мне нужно создать из него переменную PATH, которая в основном такая же, но использует точку с запятой как разделитель:

PATH = /usr:/usr/share/:/lib

Как мне это сделать? Я имею в виду, как мне присоединиться к элементам списка DIRS с точкой с запятой, а не пробелами?

Ответы

Ответ 1

Вы можете использовать команду $(subst) в сочетании с небольшим трюком, чтобы получить переменную, которая имеет значение одного пробела:

p = /usr /usr/share /lib
noop=
space = $(noop) $(noop)

all:
        @echo $(subst $(space),:,$(p))

Надеюсь, что это поможет,

Эрик Мельский

Ответ 2

Самая чистая форма (которую я могу найти):

classpathify = $(subst $(eval) ,:,$(wildcard $1))
cp = a b c d/*.jar

target:
    echo $(call classpathify,$(cp))
# prints a:b:c:d/1.jar:d/2.jar

Примечания:

  • Включение его в псевдофункцию делает намерение более ясным, чем создание связки линейных манипуляций строк inline.
  • Я включил функцию $(wildcard), потому что вы почти всегда используете эти два вместе при указании пути к классам
  • Не забудьте добавить лишние пробелы после запятых или вы получите что-то вроде ":: a: b: c: d: e".