2010年11月5日 星期五

[GNU Make] 變數與巨集 : 條件指令與引入指令的處理

前言 :
當 make 所讀進的 makefile 使用了條件處理指令時, makefile 檔中有些部分會被省略而有些部分會被挑選出來. 用來控制選擇與否的條件具有各種形式, 比如"是否定義" 或 "是否相等". 下面是一個範例 :
  1. #COMSPEC 只會在 Windows 上被定義  
  2. ifdef COMSPEC  
  3.   PATH_SEP := ;  
  4.   EXE_EXT   := .exe  
  5. else  
  6.   PATH_SEP := :  
  7.   EXE_EXT   :=  
  8. endif  
如果 COMSPEC 已經定義, 則會選擇條件指令的第一個分支.

條件指令基本語法如下所示 :
if-condition
text if the condition is true
endif


if-condition
text if the condition is true
else
text if the condition is false
endif

而 if-condition 可以是以下其中之一 :
ifdef variable-name
ifndef variable-name
ifeq test
ifneq test

進行 ifdef/ifndef 的測試時, 不應該以 $() 括住 variable-name. 最後 test 可以表示成下面這個樣子 :
"a" "b"


(a,b)

其中, 單引號或雙引號可以交替使用 (但是引號必須成對出現). 條件處理指令可以用在巨集定義或是命令稿中, 以及擺在 makefile 的頂層.

常見問題 :
考慮下面範例 :
  1. libGui.a: ${gui_objects}  
  2.     $(AR) $(ARFLAGS) $@ $<  
  3.     ifdef RANLIB  
  4.     $(RANLIB) $@  
  5.     endif  

縮排會是好習慣, 但是草率縮排動作可能會導致錯誤. 在上面例子條件指令被縮排兩個空格, 而其所括住的命令具有一個前導的跳格 (Tab). 如果其所括住的命令不是以一個跳格開頭, make 不會把它視為命令. 如果條件指令具有一個前導的跳格, make 會以為 "條件指令" 就是 "命令稿" 而將之傳遞給 subshell 而造成不可預期結果.

ifeq 與 ifneq 條件可以用來測試其引數是否相等. 條件指令裡的空白符號之處理有些行為需要注意. 如果引數採用小括號的形式, 那麼逗號之後的空白符號將被忽略, 除此之外的所有其他空白符號都是有意義的, 考慮下面範例 :
  1. ifeq (a, a)  
  2.   # These are equal  
  3. endif  
  4. ifeq ( b, b )  
  5.   # These are not equal - ' b' != 'b '  
  6. endif  
Supplement
GNU Make Doc - Conditional Parts of Makefiles
conditional directive causes part of a makefile to be obeyed or ignored depending on the values of variables. Conditionals can compare the value of one variable to another, or the value of a variable to a constant string. Conditionals control what make actually “sees” in the makefile, so they cannot be used to control recipes at the time of execution.


沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...