make之makefile 六 使用條件推斷
使用條件推斷,能夠讓make依據執行時的不同情況選擇不同的執行分支。條件表示式能夠是比較變數的值,或是比較變數和常量的值。
一、演示例子
以下的樣例,推斷$(CC)變數是否“gcc”,假設是的話,則使用GNU函式編譯目標。
var1 := A
var2 := B
.PHONY:all
all:
ifeq ($(var1),$(var2)) # 注意:在ifeq 前面不能使用\tab鍵,而是使用空格鍵
@echo "var1 == var2"
else
@echo "var1 != var2"
endif
備註:判斷語句前面不能是tab健,可以是空格或者什麼也沒有
二、語法
條件表示式的語法為:
<conditional-directive>
<text-if-true>
endif
以及:
<conditional-directive>
<text-if-true>
else
<text-if-false>
endif
當中<conditional-directive>表示條件keyword,如“ifeq”。這個keyword有四個。
第一個是我們前面所見過的“ifeq”
ifeq (<arg1>, <arg2> )
比較引數“arg1”和“arg2”的值是否相同。當然,引數中我們還能夠使用make的函式。如:
ifeq ($(strip $(foo)),)
<text-if-empty>
endif
這個演示例子中使用了“strip”函式,假設這個函式的返回值是空(Empty),那麼<text-if-empty>就生效。
第二個條件keyword是“ifneq”。語法是:
ifneq (<arg1>, <arg2> )
其比較引數“arg1”和“arg2”的值是否不相同,假設不同,則為真。和“ifeq”相似。
第三個條件keyword是“ifdef”。語法是:
ifdef <variable-name>
假設變數<variable-name>的值非空,那到表示式為真。否則,表示式為假。當然,<variable-name>相同能夠是一個函式的返回值。注意,ifdef僅僅是測試一個變數是否有值,其並不會把變數擴充套件到當前位置。還是來看兩個樣例:
演示例子一:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
演示例子二:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
第一個樣例中,“$(frobozz)”值是“yes”,第二個則是“no”。
第四個條件keyword是“ifndef”。其語法是:
ifndef <variable-name>
這個我就不多說了,和“ifdef”是相反的意思。
在<conditional-directive>這一行上,多餘的空格是被同意的,可是不能以[Tab]鍵做為開始(不然就被覺得是命令)。而凝視符“#”相同也是安全的。“else”和“endif”也一樣,僅僅不是以[Tab]鍵開始就可以了。
特別注意的是,make是在讀取Makefile時就計算條件表示式的值,並依據條件表示式的值來選擇語句,所以,你最好不要把自己主動化變數(如“[email protected]”等)放入條件表示式中,由於自己主動化變數是在執行時才有的。
而且,為了避免混亂,make不同意把整個條件語句分成兩部分放在不同的檔案裡。