Makefile文件(六)_使用條件判斷

參考: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不容許把整個條件語句分紅兩部分放在不一樣的文件中。

相關文章
相關標籤/搜索