2011-02-26 39 views
6

我想这是有道理的莫名其妙,但我不能把握原因:在下面的代码,我得到警告(请注意,原代码与标签缩进):变量定义*和*未定义

define variable-definition 
    ifndef $1 
     $(warning $1 is undefined) 
    else 
     $(warning $1 is defined) 
    endif 
endef 

PS:我想检查名称为$1的变量是否存在,而不是$1是否通过。

PPS:Dedenting整个事情没有帮助。

回答

9

测试版的分析是正确的,你不会逃避你的$$(warning)电话。以下是我如何解决它:

define variable-def 
    ifndef $1 
    $$(warning $1 is undefined) 
    else 
    $$(warning $1 is defined) 
    endif 
endef 
FOO=bar 
$(eval $(call variable-def,FOO)) 

请注意,我用空格而不是制表符缩进。如果你用制表符缩进,你得到这个错误:*** commands commence before first target. Stop.

这使用GNUisms,但这样做你的样品(我认为)。

+1

+1。逃避警告......噢,那很好。 [* gnashes牙齿*] – Beta

1

它给你两个警告的原因是,当你调用这个函数(即展开这个变量)时,Make会扩展它内部的变量,包括这两个警告都是。如果尝试评估ifndef(可能失败),则会发生此情况。简单地不按你想要的方式处理条件。

这里有一个办法做到这一点,稍微笨拙,但有效。 (要做到这一点非常顺利,可能需要相当数量的黑魔法)。写称为variable-definition单独生成文件:

# In makefile variable-definition 

ifndef $(FOO) 
$(warning $(FOO) is undefined) 
else 
$(warning $(FOO) is defined) 
endif 

然后在主生成文件:

的根本原因
# In the main makefile 

bar = something 
FOO := bar 

include variable-definition 

FOO := baz 

include variable-definition 
+1

我不会说一个“相当”数量 - 看到我的回答。 –

+2

@Jack Kelly:你再次击败了我,但我们再次见面,报复将是我的。 – Beta