Makefile - 指令



各種形式的指令有很多。您系統上的 make 程式可能不支援所有指令。因此,請檢查您的 make 是否支援我們在此處解釋的指令。GNU make 支援這些指令。

條件指令

條件指令如下:

  • ifeq 指令開始條件並指定條件。它包含兩個引數,用逗號分隔並用括號括起來。對這兩個引數都執行變數替換,然後進行比較。如果這兩個引數匹配,則遵循 ifeq 之後的 Makefile 中的行;否則忽略它們。

  • ifneq 指令開始條件並指定條件。它包含兩個引數,用逗號分隔並用括號括起來。對這兩個引數都執行變數替換,然後進行比較。如果這兩個引數不匹配,則遵循 ifneq 之後的 Makefile 中的行;否則忽略它們。

  • ifdef 指令開始條件並指定條件。它包含單個引數。如果給定的引數為真,則條件變為真。

  • ifndef 指令開始條件並指定條件。它包含單個引數。如果給定的引數為假,則條件變為真。

  • else 指令導致在先前條件失敗時遵循以下行。在上例中,這意味著每當第一個備選方案未使用時,都使用第二個備選連結命令。在條件中使用 else 是可選的。

  • endif 指令結束條件。每個條件都必須以 endif 結尾。

條件指令的語法

沒有 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 可以是任意數量的文字行。

無論條件是簡單還是複雜,條件指令的語法都是相同的。有四種不同的指令可以測試各種條件。它們如下所示:

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

上述條件的相反指令如下:

ifneq (arg1, arg2)
ifneq 'arg1' 'arg2'
ifneq "arg1" "arg2"
ifneq "arg1" 'arg2'
ifneq '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) $(normal_libs)
endif

include 指令

include 指令允許 make 暫停讀取當前 Makefile 並讀取一個或多個其他 Makefile,然後再繼續。該指令是 Makefile 中的一行,如下所示:

include filenames...

檔名可以包含 shell 檔名模式。在行的開頭允許額外的空格並忽略,但不允許製表符。例如,如果您有三個 `.mk' 檔案,即 `a.mk'、`b.mk' 和 `c.mk',以及 $(bar),則它擴充套件為 bish bash,然後是以下表達式。

include foo *.mk $(bar)

is equivalent to:

include foo a.mk b.mk c.mk bish bash

make 處理 include 指令時,它會暫停讀取 Makefile 並依次從每個列出的檔案中讀取。完成後,make 會恢復讀取包含該指令的 Makefile。

override 指令

如果使用命令引數設定了變數,則忽略 Makefile 中的普通賦值。如果希望在 Makefile 中設定變數,即使它是使用命令引數設定的,也可以使用 override 指令,它是一行,如下所示:

override variable = value

or

override variable := value
廣告