如果变量为空,我想设置一个变量。我试着用这种方式:
....
TEST := $(something)
...
TEST ?= $(something else)
第一个$(something)
可能会返回一个空字符串,但条件赋值?=仅在未设置上一个变量时有效,而不是在为空时。
将变量设置为空的任何优雅解决方案?
修改 我找到了这个解决方案:
....
TEST := $(something)
...
TEST += $(something else)
TEST := $(word 1, $(TEST))
但我认为会更优雅。
答案 0 :(得分:63)
将变量设置为空的任何优雅解决方案?
GNU make几乎不为优雅的解决方案所知。除非你发现陷门和雷区优雅。我只知道实现你想要的两种方法:
标准ifeq
/ endif
解决方案:
ifeq ($(TEST),)
TEST := $(something else)
endif
使用$(if)
功能:
TEST := $(if $(TEST),$(TEST),$(something else))
可以尝试将该构造打包成函数,但这是不可取的。如果$(something else)
包含,
(其中只有任意的解决方法),该函数会偶尔破坏隐藏的陷阱。 (像$(if)
这样的内置函数不受,
错误的影响。)
优雅考试取决于你。
答案 1 :(得分:8)
从GNU make开始,第7.2章,条件语法:
“通常你想测试一个变量是否具有非空值。当值由变量和函数的复杂扩展产生时,你认为空的扩展实际上可能包含空格字符,因此不会被视为空。 ,你可以使用strip函数来避免将空格解释为非空值。例如:
ifeq ($(strip $(foo)),)
text-if-empty
endif
即使$(foo)的扩展包含空格字符,也会评估text-if-empty。“
答案 2 :(得分:5)
这是我个人觉得很优雅的另一种选择,因为它是单线的,不需要多余的else-branch:
TEST := $(or $(TEST),$(something else))
答案 3 :(得分:0)
以防万一有人偶然将条件放入规则本身。下面我是怎么做的,以为它可能对别人有帮助。
在Makefile
中,假设我们有一个目标为check
的规则,我们需要检查是否传递了var。
check:
@[ "${var}" ] && echo "all good" || ( echo "var is not set"; exit 1 )
要对此进行测试,请运行以下命令
$ make check
var is not set
make: *** [check] Error 1
$ make check var=test
all good
答案 4 :(得分:0)
如果您需要区分变量是未定义还是只是一个空值,请使用$(origin VARNAME)函数:
ifeq ($(origin VARNAME),undefined)
VARNAME := "now it's finally defined"
endif
请注意,VARNAME不会被$()
包围-您可以从字面上给出变量的名称。
答案 5 :(得分:0)