參考: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...