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



(编辑:基于@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

最新更新