(编辑:根据@Michael反馈更准确的问题)
在bash中,我经常使用parameter expansion:以下命令在未设置default value
时打印“$VARNAME
”,否则会打印VARNAME内容。
echo ${VARNAME:-default value} #if VARNAME empty => print "default value"
echo ${VARNAME-default value} #if VARNAME empty => print "" (VARNAME string)
我did not find在GNU make
上有类似的功能。
我终于写了Makefile
:
VARNAME ?= "default value"
all:
echo ${VARNAME}
但是我对这个解决方案不满意:它总是创建变量VARNAME
,这可能会改变某些makefile上的行为。
是否有更简单的方法可以获取未设置变量的默认值?
答案 0 :(得分:15)
如果你想使用GNU make变量的扩展(如果它是非空的)和默认值(如果它是空的,但是没有设置变量),你可以这样做:
all:
echo $(or $(VARNAME),default value)
答案 1 :(得分:1)
如果要测试变量是否具有非空值,可以使用:
ifeq ($(VARNAME),)
VARNAME="default value"
else
do_something_else
endif
要检查是否已定义变量,请使用ifdef
。
有关详细信息,请参阅手册中的Syntax of Conditionals。
答案 2 :(得分:0)
我有类似的情况,其中过滤shell命令的结果可能是单个单词或空字符串。如果为空,则应回退到默认单词。在下面的示例中,APPLE_LINUX在macOS上为“ apple”,在其他平台上为“ linux”。 MSG将被设置为相应平台的消息。故意示例避免使用ifeq
。
MACHINE := $(shell $(COMPILE.cpp) -dumpmachine)
MACHINE_APPLE := $(findstring apple,$(MACHINE))
APPLE_LINUX := $(firstword $(MACHINE_APPLE) linux)
apple.MSG := You are building on macOS
linux.MSG := You are building on Linux or another OS
MSG := $($(APPLE_LINUX).MSG)
答案 3 :(得分:-1)
删除冒号。如果在替换中使用:-
,如果变量为空,空字符串或不存在,则将使用默认值,但仅使用-
将仅替换默认值该变量尚未定义。
# var1=default
# var2=
# echo var2 is ${var2:-$var1}
var2 is something
# echo var3 is ${var3:-$var1}
var3 is something
# echo var2 is ${var2-$var1}
var2 is
# echo var3 is ${var3-$var1}
var3 is something