如果变量为空,则设置Makefile

时间:2016-08-06 07:40:31

标签: makefile

如果变量为空,我想设置一个变量。我试着用这种方式:

....
TEST := $(something)
...
TEST ?= $(something else)

第一个$(something)可能会返回一个空字符串,但条件赋值?=仅在未设置上一个变量时有效,而不是在为空时。

将变量设置为空的任何优雅解决方案?

修改 我找到了这个解决方案:

....
TEST := $(something)
...
TEST += $(something else)
TEST := $(word 1, $(TEST))

但我认为会更优雅。

6 个答案:

答案 0 :(得分:63)

  

将变量设置为空的任何优雅解决方案?

GNU make几乎不为优雅的解决方案所知。除非你发现陷门和雷区优雅。我只知道实现你想要的两种方法:

  1. 标准ifeq / endif解决方案:

    ifeq ($(TEST),)
    TEST := $(something else)
    endif
    
  2. 使用$(if)功能:

    TEST := $(if $(TEST),$(TEST),$(something else))
    

    可以尝试将该构造打包成函数,但这是不可取的。如果$(something else)包含,(其中只有任意的解决方法),该函数会偶尔破坏隐藏的陷阱。 (像$(if)这样的内置函数不受,错误的影响。)

  3. 优雅考试取决于你。

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

伙计,我认为有一个更简单的解决方案

KDIR ?= "foo"

来自:What is ?= in Makefile