Извлечь слова из переменной среды в две строки - PullRequest
0 голосов
/ 10 марта 2012

У меня есть make-файл с двумя переменными, такими как

OS = foo.o bar.o baz.o
WS = -DWITH_FOO -DWITH_BAR -DWITH_BAZ

И так далее.Вместо того, чтобы писать это вручную, я хочу сгенерировать эти два, когда make-файл выполняется на основе переменной среды с именем WITH, содержащей что-то вроде foo bar baz.Если эта переменная окружения не установлена ​​или пуста, то в make-файле вместо этого должен использоваться какой-то жестко заданный запасной вариант.

Как бы я это сделал?Я не очень хорош в make-файлах, все, что я могу думать, это какой-то вызов 'foreach`, но подробности ускользают от меня.

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Предполагая, что вы используете GNU Make в UNIX-подобной операционной системе, вот возможное решение:

afineman@hotdog:/tmp$ cat Makefile
WITH = foo bar baz
WITH_UPPER = $(shell echo $(WITH) | tr a-z A-Z)

OS = $(WITH:%=%.o)
WS = $(WITH_UPPER:%=-DWITH_%)

.PHONY: env
env:
    @echo WITH=$(WITH)
    @echo WITH_UPPER=$(WITH_UPPER)
    @echo OS=$(OS)
    @echo WS=$(WS)
afineman@hotdog:/tmp$ make
WITH=foo bar baz
WITH_UPPER=FOO BAR BAZ
OS=foo.o bar.o baz.o
WS=-DWITH_FOO -DWITH_BAR -DWITH_BAZ
afineman@hotdog:/tmp$

Вы можете предоставить WITH в своей среде, если хотите, но в целом лучше написать свои Make-файлы, чтобы они были автономными. Если у вас есть требование, что WITH приходит из среды, просто пропустите первую строку вышеупомянутого Makefile, и $(WITH) придет из среды.

Вы также можете переопределить $WITH, запустив Make с переключателем -e, т.е.

afineman@hotdog:/tmp$ WITH="bing bang buzz" make   # Not overridden
WITH=foo bar baz
WITH_UPPER=FOO BAR BAZ
OS=foo.o bar.o baz.o
WS=-DWITH_FOO -DWITH_BAR -DWITH_BAZ
afineman@hotdog:/tmp$ WITH="bing bang buzz" make -e   # Overridden
WITH=bing bang buzz
WITH_UPPER=BING BANG BUZZ
OS=bing.o bang.o buzz.o
WS=-DWITH_BING -DWITH_BANG -DWITH_BUZZ
0 голосов
/ 10 марта 2012

Ну, я бы написал что-то вроде этого:

ifdef WITH
  OS := $(WITH:%=%.o)
  WS := $(WITH:%=-DWITH_%)
else
  # Fallback.
endif

Это самое простое решение, которое я вижу, однако оно не на 100% хорошо, потому что WS будет -DWITH_foo ... вместо -DWITH_FOO ....

Если такое поведение не соответствует вашим потребностям, вы можете использовать команду tr для преобразования WS в верхний регистр:

WS := $(shell echo '$(WS)' | tr 'a-z' 'A-Z')

Или, как более переносимый вариант, использоватьtr функция от GMSL :

WS := $(call tr,$([a-z]),$([A-Z]),$(WS))
...