我有一个makefile,有两个这样的变量
OS = foo.o bar.o baz.o
WS = -DWITH_FOO -DWITH_BAR -DWITH_BAZ
等等。而不是手动编写这个,我想在基于名为WITH
的{{1}}的环境变量执行makefile时生成这两个。如果未设置此环境变量,或者为空,则makefile应使用一些硬编码的回退。
我该怎么做?我不太擅长制作文件,所有我能想到的都是某种“foreach”电话,但具体细节让我望而却步。
答案 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))