在make中取消设置变量时获取默认值

时间:2013-04-16 10:54:54

标签: bash gnu-make variable-expansion

(编辑:根据@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上的行为。

是否有更简单的方法可以获取未设置变量的默认值?

4 个答案:

答案 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