前言 :
當 make 所讀進的 makefile 使用了條件處理指令時, makefile 檔中有些部分會被省略而有些部分會被挑選出來. 用來控制選擇與否的條件具有各種形式, 比如"是否定義" 或 "是否相等". 下面是一個範例 :
如果 COMSPEC 已經定義, 則會選擇條件指令的第一個分支.
條件指令基本語法如下所示 :
或
而 if-condition 可以是以下其中之一 :
進行 ifdef/ifndef 的測試時, 不應該以 $() 括住 variable-name. 最後 test 可以表示成下面這個樣子 :
或
其中, 單引號或雙引號可以交替使用 (但是引號必須成對出現). 條件處理指令可以用在巨集定義或是命令稿中, 以及擺在 makefile 的頂層.
常見問題 :
考慮下面範例 :
縮排會是好習慣, 但是草率縮排動作可能會導致錯誤. 在上面例子條件指令被縮排兩個空格, 而其所括住的命令具有一個前導的跳格 (Tab). 如果其所括住的命令不是以一個跳格開頭, make 不會把它視為命令. 如果條件指令具有一個前導的跳格, make 會以為 "條件指令" 就是 "命令稿" 而將之傳遞給 subshell 而造成不可預期結果.
ifeq 與 ifneq 條件可以用來測試其引數是否相等. 條件指令裡的空白符號之處理有些行為需要注意. 如果引數採用小括號的形式, 那麼逗號之後的空白符號將被忽略, 除此之外的所有其他空白符號都是有意義的, 考慮下面範例 :
Supplement
* GNU Make Doc - Conditional Parts of Makefiles
當 make 所讀進的 makefile 使用了條件處理指令時, makefile 檔中有些部分會被省略而有些部分會被挑選出來. 用來控制選擇與否的條件具有各種形式, 比如"是否定義" 或 "是否相等". 下面是一個範例 :
- #COMSPEC 只會在 Windows 上被定義
- ifdef COMSPEC
- PATH_SEP := ;
- EXE_EXT := .exe
- else
- PATH_SEP := :
- EXE_EXT :=
- endif
條件指令基本語法如下所示 :
或
而 if-condition 可以是以下其中之一 :
進行 ifdef/ifndef 的測試時, 不應該以 $() 括住 variable-name. 最後 test 可以表示成下面這個樣子 :
或
其中, 單引號或雙引號可以交替使用 (但是引號必須成對出現). 條件處理指令可以用在巨集定義或是命令稿中, 以及擺在 makefile 的頂層.
常見問題 :
考慮下面範例 :
- libGui.a: ${gui_objects}
- $(AR) $(ARFLAGS) $@ $<
- ifdef RANLIB
- $(RANLIB) $@
- endif
縮排會是好習慣, 但是草率縮排動作可能會導致錯誤. 在上面例子條件指令被縮排兩個空格, 而其所括住的命令具有一個前導的跳格 (Tab). 如果其所括住的命令不是以一個跳格開頭, make 不會把它視為命令. 如果條件指令具有一個前導的跳格, make 會以為 "條件指令" 就是 "命令稿" 而將之傳遞給 subshell 而造成不可預期結果.
ifeq 與 ifneq 條件可以用來測試其引數是否相等. 條件指令裡的空白符號之處理有些行為需要注意. 如果引數採用小括號的形式, 那麼逗號之後的空白符號將被忽略, 除此之外的所有其他空白符號都是有意義的, 考慮下面範例 :
- ifeq (a, a)
- # These are equal
- endif
- ifeq ( b, b )
- # These are not equal - ' b' != 'b '
- endif
* GNU Make Doc - Conditional Parts of Makefiles
沒有留言:
張貼留言