2009-10-09 2 views
17

В моей Makefile У меня есть переменная со списком каталогов, например:Объединение элементов списка в GNU Make

DIRS = /usr /usr/share/ /lib 

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

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

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

+0

+1 У меня ТОЧНО тот же вопрос ... вы бы подумали, что это будет легко. –

ответ

30

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

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

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

Надежда, что помогает,

Eric Melski

+0

Ничего себе, работает как шарм, огромное спасибо! Борьба с ним часами! –

+1

Вы также можете использовать '$ (eval)' вместо '$ (noop)', тем самым устраняя необходимость в определении noop. –

+2

+1 для поиска такой черной магии. –

8

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

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: е».
+0

Одна вещь, которую я добавил бы: теперь, когда Java поддерживает синтаксис «-cp lib/*», вы можете избежать использования $ (wildcard $ 1), что, вероятно, хорошо, поскольку тенденция к Java-проектам использовать тонна JAR может привести к случаям, когда вы превышаете пределы длины на определенных платформах. –

+1

Более общая форма: joinwith = $ (subst $ (eval), $ 1, $ 2) $ (вызов joinwith, -o, $ (list_of_files_separated_by_spaces)) –

Смежные вопросы