将环境变量中的单词提取为两个字符串

时间:2012-03-10 19:12:25

标签: makefile gnu-make

我有一个makefile,有两个这样的变量

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

等等。而不是手动编写这个,我想在基于名为WITH的{​​{1}}的环境变量执行makefile时生成这两个。如果未设置此环境变量,或者为空,则makefile应使用一些硬编码的回退。

我该怎么做?我不太擅长制作文件,所有我能想到的都是某种“foreach”电话,但具体细节让我望而却步。

2 个答案:

答案 0 :(得分:1)

假设您在类UNIX操作系统上使用GNU Make,这是一个可能的解决方案:

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,但一般来说,最好编写Makefile以使其自包含。如果您确实要求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

答案 1 :(得分:0)

好吧,我会写这样的东西:

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')

或者,作为更便携的选项,请使用GMSL中的tr功能:

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