
- Makefile 教程
- Makefile - 首頁
- Makefile - 為什麼使用 Makefile?
- Makefile - 宏
- Makefile - 依賴關係
- Makefile - 規則
- Makefile - 字尾規則
- Makefile - 指令
- Makefile - 重新編譯
- Makefile - 其他特性
- Makefile - 示例
- Makefile 快速指南
- Makefile - 快速指南
- Makefile - 有用資源
- Makefile - 討論
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