2011-02-26 114 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