7.Makefile中的條件語句

ignorantshr發表於2019-01-06

本系列文章均翻譯自make官方文件:make Manual,github同步專案:question

不能用於控制recipes

warning:不能在Makefile.am中使用。

例子

libs_for_gcc = -lgnu
normal_libs =

foo: $(objects)
ifeq ($(CC),gcc)
        $(CC) -o foo $(objects) $(libs_for_gcc)
else
        $(CC) -o foo $(objects) $(normal_libs)
endif

帶有tab才能算作recipe,這裡的條件語句被當作文字來看待。

語法

conditional-directive-one
text-if-one-is-true
else conditional-directive-two
text-if-two-is-true
...
else
text-if-one-and-two-are-false
endif

else可省略。

測試變數是否相等,有五種條件conditional-directive的寫法:

ifeq (arg1, arg2)
ifeq 'arg1' 'arg2'
ifeq "arg1" "arg2"
ifeq "arg1" 'arg2'
ifeq 'arg1' "arg2"

測試變數是否為空值(類似於""):

ifeq ($(strip $(foo)),)
text-if-empty
endif

測試變數是否不等,也有五種寫法:

ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq 'arg1' "arg2"
ifdef variable-name

ifdef獲取變數的名字作為引數,而不是變數值的引用。如果變數的值是非空的,則執行text-if-true
variable-name是可擴充套件的,所以其可以是一個擴充套件成一個變數名的變數或函式。
noteifdef只測試值是否為非空。所以除了像這樣定義的變數:foo =,都會返回真。
如果想測試空值,使用ifeq

例如:

bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif

結果是:frobozz = yes

foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif

結果是:frobozz = no

ifndef variable-name

ifdef相反。

make是在讀取Makefile的時候判斷條件的,所以不能在條件的測試中使用自動變數,因為直到recipes執行時他們才被定義。參考自動變數

相關文章