Объединение элементов списка в GNU Make - PullRequest
20 голосов
/ 09 октября 2009

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

DIRS = /usr /usr/share/ /lib

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

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

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

Ответы [ 3 ]

34 голосов
/ 09 октября 2009

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

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

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

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

Эрик Мелски

9 голосов
/ 27 февраля 2012

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

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

Примечания:

  • Превращение его в псевдофункцию делает намерение более ясным, чем выполнение кучей тайных манипуляций со строками.
  • Я включил функцию $ (подстановочный знак), потому что вы почти всегда используете их вместе при указании пути к классу
  • Убедитесь, что после запятых не ставятся лишние пробелы, иначе вы получите что-то вроде ":: a: b: c: d: e".
0 голосов
/ 09 июля 2018

Вы используете ':' в качестве разделителя, поэтому вы находитесь в Linux. Рассмотрите возможность использования цепочки инструментов bash для замены непрерывных пробелов одним двоеточием

PATH := $(shell echo $(DIRS) | sed "s/ \+/:/g")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...