makefile詳解之使用條件判斷

原文出處: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

相關文章
相關標籤/搜索