(编辑:基于@Michael反馈的问题更准确)
在bash中,我经常使用参数扩展:以下命令在$VARNAME
未设置时打印"default value
",否则打印VARNAME内容。
echo ${VARNAME:-default value} #if VARNAME empty => print "default value"
echo ${VARNAME-default value} #if VARNAME empty => print "" (VARNAME string)
我在GNU make
中没有发现类似的特性。我最后在我的Makefile
中写道:
VARNAME ?= "default value"
all:
echo ${VARNAME}
但是我对这个解决方案不满意:它总是创建变量VARNAME
,这可能会改变一些makefile的行为。
是否有更简单的方法来获取未设置变量的默认值?
如果您想使用非空的GNU make变量的扩展,如果它为空则使用默认值,但不设置该变量,您可以这样做:
all:
echo $(or $(VARNAME),default value)
如果你想测试一个变量是否有一个非空值,你可以使用:
ifeq ($(VARNAME),)
VARNAME="default value"
else
do_something_else
endif
检查变量是否已经定义,使用ifdef
。
更多信息请参考手册中的条件语法
我有一个类似的情况,过滤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)
去掉冒号。如果在替换中使用:-
,则在变量为null、空字符串或不存在时使用默认值,但是仅使用-
本身只会在变量未定义时替换默认值。
# 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