makefile(條件語句)

2021-09-09 02:59:01 字數 4845 閱讀 7363

乙個條件語句可以導致根據變數的值執行或忽略makefile檔案中一部分指令碼。條件語句可以將乙個變數與其它變數的值相比較,或將乙個變數與一字串常量相比較。條件語句用於控制make實際看見的makefile檔案部分,不能用於在執行時控制shell命令。
下述的條件語句的例子告訴make如果變數cc的值是『gcc』時使用乙個資料庫,如不是則使用其它資料庫。它通過控制選擇兩命令列之一作為該規則的命令來工作。『cc=gcc』作為make改變的引數的結果不僅用於決定使用哪乙個編譯器,而且決定連線哪乙個資料庫。
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
該條件語句使用三個指令:ifeq、else和endif。
ifeq指令是條件語句的開始,並指明條件。它包含兩個引數,它們被逗號分開,並被擴在圓括號內。執行時首先對兩個引數變數替換,然後進行比較。在makefile中跟在ifeq後面的行是符合條件時執行的命令;否則,它們將被忽略。
如果前面的條件失敗,else指令將導致跟在其後面的命令執行。在上述例子中,意味著當第乙個選項不執行時,和第二個選項連在一起的命令將執行。在條件語句中,else指令是可選擇使用的。
endif指令結束條件語句。任何條件語句必須以endif指令結束,後跟makefile檔案中的正常內容。
上例表明條件語句工作在原文水平:條件語句的行根據條件要麼被處理成makefile檔案的一部分或要麼被忽略。這是makefile檔案重大的語法單位(例如規則)可以跨越條件語句的開始或結束的原因。
當變數cc的值是gcc,上例的效果為:
foo: $(objects)
$(cc) -o foo $(objects) $(libs_for_gcc)
當變數cc的值不是gcc而是其它值的時候,上例的效果為:
foo: $(objects)
$(cc) -o foo $(objects) $(normal_libs)
相同的結果也能使用另一種方法獲得:先將變數的賦值條件化,然後再使用變數:
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)
對於沒有else指令的條件語句的語法為:
conditional-directive
text-if-true
endif
『text-if-true』可以是任何文字行,在條件為『真』時它被認為是makefile檔案的一部分;如果條件為『假』,將被忽略。完整的條件語句的語法為:
conditional-directive
text-if-true
else
text-if-false
endif
如果條件為『真』,使用『text-if-true』;如果條件為『假』,使用『text-if-false』。『text-if-false』可以是任意多行的文字。
關於『conditional-directive』的語法對於簡單條件語句和複雜條件語句完全一樣。有四種不同的指令用於測試不同的條件。下面是指令表:
ifeq (arg1,arg2)

ifeq 'arg1' 'arg2'

ifeq "arg1" "arg2"

ifeq "arg1" 'arg2'

ifeq 'arg1' "arg2"

擴充套件引數arg1、arg2中的所有變數引用,並且比較它們。如果它們完全一致,則使用『text-if-true』,否則使用『text-if-false』(如果存在的話)。您經常要測試乙個變數是否有非空值,當經過複雜的變數和函式擴充套件得到乙個值,對於您認為是空值,實際上有可能由於包含空格而被認為不是空值,由此可能造成混亂。對於此,您可以使用strip函式從而避免空格作為非空值的干擾。例如:
ifeq ($(strip $(foo)),)
text-if-empty
endif
即使$(foo)中含有空格,也使用『text-if-empty』。
ifneq (arg1,arg2)

ifneq 'arg1' 'arg2'

ifneq "arg1" "arg2"

ifneq "arg1" 'arg2'

ifneq 'arg1' "arg2"

擴充套件引數arg1、arg2中的所有變數引用,並且比較它們。如果它們不同,則使用『text-if-true』,否則使用『text-if-false』(如果存在的話)。
ifdefvariable-name

如果變數『variable-name』是非空值,『text-if-true』有效,否則,『text-if-false』有效(如果存在的話)。變數從沒有被定義過則變數是空值。注意ifdef僅僅測試變數是否有值。它不能擴充套件到看變數是否有非空值。因而,使用ifdef測試所有定義過的變數都返回『真』,但那些象『foo=』情況除外。測試空值請使用ifeq($(foo),)。例如:
bar =
foo = $(bar)
ifdef foo
frobozz = yes
else
frobozz = no
endif
設定『frobozz'的值為『yes', 而::

foo =
ifdef foo
frobozz = yes
else
frobozz = no
endif
設定『frobozz' 為『no'。

ifndefvariable-name

如果變數『variable-name』是空值,『text-if-true』有效,否則,『text-if-false』有效(如果存在的話)。
在指令行前面允許有多餘的空格,它們在處理時被忽略,但是不允許有tab(如果一行以tab開始,那麼該行將被認為是規則的命令列)。除此之外,空格和tab可以插入到行的任何地方,當然指令名和引數中間除外。以『#』開始的注釋可以在行的結尾。
在條件語句中另兩個有影響的指令是else和endif。這兩個指令以乙個單詞的形式出現,沒有任何引數。在指令行前面允許有多餘的空格,空格和tab可以插入到行的中間,以『#』開始的注釋可以在行的結尾。
條件語句影響make使用的makefile檔案。如果條件為『真』,make讀入『text-if-true』包含的行;如果條件為『假』,make讀入『text-if-false』包含的行(如果存在的話);makefile檔案的語法單位,例如規則,可以跨越條件語句的開始或結束。
當讀入makefile檔案時,make計算條件的值。因而您不能在測試條件時使用自動變數,因為他們是命令執行時才被定義(參閱自動變數)。
為了避免不可忍受的混亂,在乙個makefile檔案中開始乙個條件語句,而在另外乙個makefile檔案中結束這種情況是不允許的。然而如果您試圖引入包含的makefile檔案不中斷條件語句,您可以在條件語句中編寫include指令。
您可以使用變數makeflags和findstring函式編寫乙個條件語句,用它來測試例如『-t』等的make命令標誌(參閱字串替換和分析的函式)。這適用於僅使用touch標誌不能完全更改檔案的時間戳的場合。
findstring函式檢查乙個字串是否為另乙個字串的子字串。如果您要測試『-t』標誌,使用『-t』作為第乙個字串,將變數makeflags的值作為另乙個字串。例如下面的例子是安排使用『ranlib –t』完成乙個檔案檔案的更新:
archive.a: ...
ifneq (,$(findstring t,$(makeflags)))
+touch archive.a
+ranlib -t archive.a
else
ranlib archive.a
endif
字首『+』表示這些命令列是遞迴呼叫行,即使是用『-t』標誌它們一樣要執行。參閱遞迴呼叫make

Makefile 條件判斷語句

本文寫於狄泰軟體學院makefile課程學後感 makefile中支援條件判斷語句 可以根據條件的值來決定make的執行 可以比較兩個變數或者變數和常量值 if arg1,arg2 for true else for false endif 注意 條件判斷語句只能用於控制make實際執行的語句,但是...

Makefile8 條件判斷語句

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

if條件語句

python 的分支結構由 if 語句來操刀實現。if 語句總共有 5 鐘語法結構,其中前 4 種是比較常見的,而最後 1 種是比較炫酷的操作。1.第 1 種是判斷乙個條件,如果這個條件成立,就執行其包含的某條語句或某個 塊。語法結構如下 if 條件 某條語句或某個 塊2.第 2 種同樣是判斷乙個條...