1. 程式人生 > >條件判斷語句(七)

條件判斷語句(七)

== 們的 技術 AR 就是 body endif 存在 條件判斷

我們之前說過 makefile 是一種腳本語言程序,那麽程序便會有相應的語法。在 makefile 中支持條件判斷語句,可以根據條件的值來決定 make 的執行,也可以比較兩個不同變量或者變量和常量值。需要註意的是:條件判斷語句只能用於控制 make 實際執行的語句;但是,不能控制規則中命令的執行過程。格式如下

技術分享圖片

條件判斷語句的語法如下

技術分享圖片

那麽在 makefile 中都有哪些的條件判斷關鍵呢?

關鍵字
功能
ifeq
判斷參數是否相等,相等為 true,否則為 false
ifneq
判斷參數是否不相等,不相等為 true,否則為 false
ifdef
判斷變量是否有值
,有值為 true,否則為 false
ifndef
判斷變量是否沒有值,沒有值為 true,否則為 false

下來我們還是以代碼為例來進行說明

.PHONY : test

var1 := A
var2 := $(var1)
var3 :=

test : 
    ifeq ($(var1),$(var2))
        @echo "var1 == var2"
    else
        @echo "var1 != var2"
    endif

    ifneq ($(var2),)
        @echo "var2 is NOT empty"
    else
        @echo "var2 is empty"
    endif

    ifdef var2
        @echo "var2 is NOT empty"
    else
        @echo "var2 is empty"
    endif

    ifndef var3
        @echo "var3 is empty"
    else
        @echo "var3 is NOT empty"
    endif

我們來看看編譯結果

技術分享圖片

我們看到編譯出錯了,原因就是因為 ifeq 是規則而不是命令,所以它前面一定是空格而不是 Tab 鍵。下來我們換成空格來看看

技術分享圖片

我們看到編譯已經通過了,而且也正常運行結束。變量 var2 就取的是 變量 var1 的值,因此在第一個它們的比較相等時肯定會輸出相等;第二個用 var2 和空字符進行比較,那麽 var2 肯定不為空;第三個就直接用 ifdef 關鍵字來進行判斷 var2 是否存在了;最後一個 var3 肯定為空了。根據一些前輩們的經驗,總結以下的幾條規則:a> 條件判斷語句之前可以有空格,但不能有 Tab 字符('\t');b> 在條件語句中不要使用自動變量($@,$^,$<);c> 一條完整的條件語句必須位於同一個 makefile 中;d> 條件判斷類似於 C 語言中的宏,預處理階段有效,執行階段無效;e> make 在加載 makefile 時,首先計算表達式的值(賦值方式不同,計算方式不同),根據判斷語句的表達式決定執行的內容。

那麽我們來看看下面的代碼輸出相同嗎?

.PHONY : te

var1 := 
var2 := $(var1)

var3 = 
var4 = $(var3)

test : 
    ifdef var1
        @echo "var1 is defined"
    else
        @echo "var1 is NOT defined"
    endif
    
    ifdef var2
        @echo "var2 is defined"
    else
        @echo "var2 is NOT defined"
    endif

    ifdef var3
        @echo "var3 is defined"
    else
        @echo "var3 is NOT defined"
    endif
    
    ifdef var4
        @echo "var4 is defined"
    else
        @echo "var4 is NOT defined"
    endif

我們看著兩個沒啥差別,結果應該是一樣的,都是輸出的是空的。我們來看看編譯結果

技術分享圖片

那麽我們看到前三個是空的,var4 竟然不為空。我們來仔細看下,在 var1 和 var2 的定義中都是直接賦值(:=);而 var3 和 var4 是遞歸賦值(=)。在編譯器看來 var4 是有值的,只不過在編譯階段不確定它的值究竟是什麽而已。我們在下面加上 var3 = A,給 var3 一個具體的值,試試看效果是不是一樣的。

技術分享圖片

效果是一樣的。因此我們在 makefile 中不推薦遞歸賦值的這種寫法,容易造成誤解。通過對條件判斷語句的學習,總結如下:1、條件判斷根據條件的值來決定 make 的執行;2、條件判斷可以比較兩個不同變量或者變量和常量值;3、條件判斷再預處理階段有效,執行階段無效;4、條件判斷不能控制規則中命令的執行過程。


歡迎大家一起來學習 makefile 語言,可以加我QQ:243343083

條件判斷語句(七)