原文出處:html
http://www.cppblog.com/ivenher/articles/22104.html安全
使用條件判斷
——————
使用條件判斷,可讓make根據運行時的不一樣狀況選擇不一樣的執行分支。條件表達式能夠是比較變量的值,或是比較變量和常量的值。
1、示例
下面的例子,判斷$(CC)變量是否「gcc」,若是是的話,則使用GNU函數編譯目標。
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
可見,在上面示例的這個規則中,目標「foo」能夠根據變量「$(CC)」值來選取不一樣的函數庫來編譯程序。
我 們能夠從上面的示例中看到三個關鍵字:ifeq、else和endif。ifeq的意思表示條件語句的開始,並指定一個條件表達式,表達式包含兩個參數, 以逗號分隔,表達式以圓括號括起。else表示條件表達式爲假的狀況。endif表示一個條件語句的結束,任何一個條件表達式都應該以endif結束。
當咱們的變量$(CC)值是「gcc」時,目標foo的規則是:
foo: $(objects)
$(CC) -o foo $(objects) $(libs_for_gcc)
而當咱們的變量$(CC)值不是「gcc」時(好比「cc」),目標foo的規則是:
foo: $(objects)
$(CC) -o foo $(objects) $(normal_libs)
固然,咱們還能夠把上面的那個例子寫得更簡潔一些:
libs_for_gcc = -lgnu
normal_libs =
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo: $(objects)
$(CC) -o foo $(objects) $(libs)
2、語法
條件表達式的語法爲:
<conditional-directive>;
<text-if-true>;
endif
以及:
<conditional-directive>;
<text-if-true>;
else
<text-if-false>;
endif
其中<conditional-directive>;表示條件關鍵字,如「ifeq」。這個關鍵字有四個。
第一個是咱們前面所見過的「ifeq」
ifeq (<arg1>;, <arg2>;)
ifeq '<arg1>;' '<arg2>;'
ifeq "<arg1>;" "<arg2>;"
ifeq "<arg1>;" '<arg2>;'
ifeq '<arg1>;' "<arg2>;"
比較參數「arg1」和「arg2」的值是否相同。固然,參數中咱們還可使用make的函數。如:
ifeq ($(strip $(foo)),)
<text-if-empty>;
endif
這個示例中使用了「strip」函數,若是這個函數的返回值是空(Empty),那麼<text-if-empty>;就生效。
第二個條件關鍵字是「ifneq」。語法是:
ifneq (<arg1>;, <arg2>;)
ifneq '<arg1>;' '<arg2>;'
ifneq "<arg1>;" "<arg2>;"
ifneq "<arg1>;" '<arg2>;'
ifneq '<arg1>;' "<arg2>;"
其比較參數「arg1」和「arg2」的值是否相同,若是不一樣,則爲真。和「ifeq」相似。
第三個條件關鍵字是「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」。
第四個條件關鍵字是「ifndef」。其語法是:
ifndef <variable-name>;
這個我就很少說了,和「ifdef」是相反的意思。
在<conditional-directive>;這一行上,多餘的空格是被容許的,可是不能以[Tab]鍵作爲開始(否則就被認爲是命令)。而註釋符「#」一樣也是安全的。「else」和「endif」也同樣,只要不是以[Tab]鍵開始就好了。
特別注意的是,make是在讀取Makefile時就計算條件表達式的值,並根據條件表達式的值來選擇語句,因此,你最好不要把自動化變量(如「$@」等)放入條件表達式中,由於自動化變量是在運行時纔有的。
並且,爲了不混亂,make不容許把整個條件語句分紅兩部分放在不一樣的文件中。ide