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