(9)Makefile的條件判斷


使用 Makefile 編譯文件時,可能會遇到需要分條件執行的情況,比如在一個工程文件中,可編譯的源文件很多,但是它們的類型是不相同的,所以編譯文件使用的編譯器也是不同的。手動編譯去操作文件顯然是不可行的(每個文件編譯時需要注意的事項很多),所以 make 為我們提供了條件判斷來解決這樣的問題。

條件語句的作用:條件語句可以根據一個變量的值來控制 make 執行或者時忽略 Makefile 的特定部分。

注意:條件語句只能用於控制 make 實際執行的 Makefile 文件部分,不能控制規則的 shell 命令執行的過程。

下面是條件判斷中使用到的一些關鍵字:

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

ifeq 和 ifneq

條件判斷的使用方式如下:

ifeq (ARG1, ARG2)
ifeq 'ARG1' 'ARG2'
ifeq "ARG1" "ARG2"
ifeq "ARG1" 'ARG2'
ifeq 'ARG1' "ARG2"

實例:

1 libs_for_gcc= -lgnu
2 normal_libs=
3 ifeq($(CC),gcc)
4     libs=$(libs_for_gcc)
5 else
6     libs=$(normal_libs)
7 endif
8 foo:$(objects)
9     $(CC) -o foo $(objects) $(libs)

條件語句中使用到三個關鍵字“ifeq”、“else”、“endif”。其中:“ifeq”表示條件語句的開始,並指定一個比較條件(相等)。括號和關鍵字之間要使用空格分隔,兩個參數之間要使用逗號分隔。參數中的變量引用在進行變量值比較的時候被展開。“ifeq”,后面的是條件滿足的時候執行的,條件不滿足忽略;“else”表示當條件不滿足的時候執行的部分,不是所有的條件語句都要執行此部分;“endif”是判斷語句結束標志,Makefile 中條件判斷的結束都要有。

其實 "ifneq" 和 "ifeq" 的使用方法是完全相同的,只不過是滿足條件后執行的語句正好相反

ifdef 和 ifndef 

ifdef VARIABLE-NAME

它的主要功能是判斷變量的值是不是為空,實例:

實例 1:

1 bar =
2 foo = $(bar)
3 all:
4 ifdef foo
5     @echo yes
6 else
7     @echo no
8 endif

實例 2:

1 foo=
2 all:
3 ifdef foo
4     @echo yes
5 else
6     @echo no
7 endif

通過兩個實例對比說明:通過打印 "yes" 或 "no" 來演示執行的結果。我們執行 make 可以看到實例 1打印的結果是 "yes" ,實例 2打印的結果是 "no" 。其原因就是在實例 1 中,變量“foo”的定義是“foo = $(bar)”。雖然變量“bar”的值為空,但是“ifdef”的判斷結果為真,這種方式判斷顯然是有點不行的,因此當我們需要判斷一個變量的值是否為空的時候需要使用“ifeq" 而不是“ifdef”

注意:
(1)在 make 讀取 Makefile 文件時計算表達式的值,並根據表達式的值決定判斷語句中的哪一個部分作為此 Makefile 所要執行的內容。因此在條件表達式中不能使
用自動化變量,自動化變量在規則命令執行時才有效。 (
2在一個 Makefile 中使用指示符 "include" 包含另一個 Makefile 文件。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM