1. 程式人生 > >make之makefile 六 使用條件推斷

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不同意把整個條件語句分成兩部分放在不同的檔案裡。