Makefile檔案編寫 九 條件判斷

2021-10-21 18:26:40 字數 2469 閱讀 8882

參考:makefile教程:makefile檔案編寫1天入門

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

需要解決的問題:要根據判斷,分條件執行語句。

條件語句的作用:條件語句可以根據乙個變數的值來控制 make 執行或者時忽略 makefile 的特定部分,條件語句可以是兩個不同的變數或者是常量和變數之間的比較。

條件語句使用優點: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"

例項:

libs_for_gcc= -lgnu

normal_libs=

foo:$(objects)

ifeq($(cc),gcc)

$(cc) -o foo $(objects) $(libs_for_gcc)

else

$(cc) -o foo $(objects) $(noemal_libs)

endif

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

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

上面的例子可以換一種更加簡介的方式來寫:

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)

ifdef 和 ifndef 使用方式如下:

ifdef variable-name
它的主要功能是判斷變數的值是不是為空,例項:

例項 1:

bar =

foo = $(bar)

all:

ifdef foo

@echo yes

else

@echo no

endif

例項 2:

foo=

all:

ifdef foo

@echo yes

else

@echo no

endif

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

注意:在 make 讀取 makefile 檔案時計算表示式的值,並根據表示式的值決定判斷語句中的哪乙個部分作為此 makefile 所要執行的內容。因此在條件表示式中不能使用自動化變數,自動化變數在規則命令執行時才有效,更不能將乙個完整的條件判斷語句分卸在兩個不同的 makefile 的檔案中。在乙個 makefile 中使用指示符 「include」 包含另乙個 makefile 檔案。

Makefile8 條件判斷語句

實驗1 ifneq 比較兩個變數是否相等,makefile 中 命令前可以用 tab 鍵,但是條件判斷語句前不允許用 tab鍵!只能用空格鍵!phony test var1 a var2 var1 makefile 允許定義空值變數 var3 test 注意 ifeq var1 var2 不是命令,...

Linux多執行緒 九 條件變數

1 名稱 pthread cond init 目標 條件變數初始化 標頭檔案 include pthread.h 函式原形 int pthread cond init pthread cond t cond,const pthread condattr t attr 引數 cptr 條件變數 att...

makefile檔案編寫

hello.c include include function.h int main function.c includeint fun1 int fun2 int fun3 function.h ifndef fun h define fun h int fun1 void int fun2 v...