您好,登錄后才能下訂單哦!
我們之前說過 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、條件判斷不能控制規則中命令的執行過程。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。