Предполагая, что вы используете 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