參考:http://blog.csdn.net/liang13664759/article/details/1771246/安全
使用條件判斷,可讓make根據運行時的不一樣狀況選擇不一樣的執行分支。條件表達式可使比較變量的值,或是比較變量和常量的值。函數
1、示例測試
判斷$(CC)變量是否「GCC」,若是是的話,則用GNU函數編譯目標。.net
libs_for_gcc=lgnuorm
normal_libs=blog
foo:$(objects)ip
ifeq($(CC),gcc)get
$(CC) -o foo $(objects) $(libs_for_gcc)it
else自動化
$(CC) -o foo $(objects) $(normal_libs)
endif
上面的示例中,目標「foo」能夠根據變量「$(CC)」值來選取不一樣的函數庫來編譯程序
關鍵字:ifeq、else和endif。ifeq表示條件語句的開始,並指定一個條件表達式,表達式含有兩個參數以逗號隔開,表達式以圓括號括起。else表示條件表達式位假的狀況。endif表示一個條件語句的結束,任何一個條件表達式都應該以endif結束。
上例還能夠寫成:
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(<arg1>,<arg2>) / ifeq'<arg1>' '<arg2>' / ifeq"<arg1>" "<.arg2>" / ifeq "<arg1>" '<agr2>' / ifeq '<arg1>' "<arg2>"
表示比較參數「arg1」和「arg2」的值是否相同,固然參數中還可使用make的函數,如:
ifeq ($(strip $(foo)),)
<text-if-empty>
endif
實例中使用了「strip」函數,若是函數返回空,那麼<text-if-empty>生效
②ifneq(<arg1>, <arg2>) / ……
比較參數「argu1」和「arg2」是否相同,若是不一樣則爲真。
③、ifdef <variable-name>
若是變量<variable-name>的值非空,那表達式爲真,不然表達式爲假。固然,<variable-name>一樣可使一個函數的返回值。ifdef只是測試一個變量是否有值,並不會把變量擴展到當前位置。例子:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
上例中,"$(frobozz)"的值位「yes」
另外一個例子:
foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
這個例子中的$(frobozz)的值爲「no」。
④、ifndef:
ifndef <variable-name>
說明:在<conditional-directive>這一行上,能夠有多餘的空格,可是不能以Tab鍵開始(否則被認爲是命令)。註釋符「#」一樣也是安全的。「else」和「endif」也同樣,只要不是Tab鍵開始就行。
注:make在讀取Makefile時就計算條件表達式的值,並根據條件表達式的值來選擇語句,因此最好不要把自動化變量(如"$@"等)放入條件表達式中,由於自動化變量是在運行時纔有的。且避免混亂,make不容許把整個條件語句分紅兩部分放在不一樣的文件中。