2010年11月10日 星期三

[GNU Make] 變數與巨集 : 標準的 make 變數

前言 : 
除了自動變數, make 還會為 "自己的狀態以及內建規則的定製" 提供變數, 以便對外提供相關資訊 : 

- MAKE_VERSION : 
GNU make 的版本編號. 不同版本的 make 可能功能會有不一樣, 如在版本 3.791, 並不支援 eval 與 value 函式, 所以就需要透過判斷目前 make 版本作對應相容的改變.


-CURDIR : 
正在執行之 make 行程的當前工作目錄, 此變數會是 shell 變數 PWD 的值 (代表你是從哪個目錄執行 make 程式), 除非 make 執行時有用到 --directory ( -C) 選項. --directory 選項會使得 make 在搜尋任何 makefile 之前變更到不同的目錄. 這個完整的選項形式為 --directory=directory-name 或 -C directory-name. 如果你使用的是 --directory 的形式, CURDIR 將會包含 --include-dir 的目錄引數.

藉由使用 --directory 選項, 不管你是哪個原碼路徑中的目錄來調用 make, 都可以存取 makefile另外在 makefile 檔中建議所有的路徑都應該設成相對於 makefile 所在的目錄. 需要使用絕對路徑時候可以透過 CURDIR 進行存取.


- MAKEFILE_LIST : 
make 所讀進之各個 makefile 檔之名稱所構成的清單, 包括預定的 makefile 以及命令列或 include 指令所指定的 makefile. 在每個 makefile 被讀進 make 之前, 其檔名會被附加到 MAKEFILE_LIST 清單裡. 所以任何一個 makefile 總是可以檢視此清單的最後一個項目來判斷自己的檔名.


- MAKECMDGOALS : 
對當前所執行之 make 而言, make 執行當時命令列上指定了哪些工作目標. 此變數並不包含命令列選項或變數的賦值.
當工作目標需要特別處理時, 通常會使用此變數. 常見的例子是 clean 工作目標. 當使用者以 clean 調用 make 時, make 不應該像平常那樣進行 include 指令所觸發的依存檔產生動作. 欲避免此事可使用 ifneq :
ifneq "$(MAKECMDGOALS)" "clean"
-include $(subst .xml,.d,$(xml_src))
endif

- .VARIABLES : 
到目前為止, make 從各個 makefile 檔所讀進之變數的名稱所構成的清單, 不含工作目標專屬變數. 此變數僅供讀取, 對它進行任何賦值動作都會被忽略.


參考範例 : 
考慮以下 makefile 對應的原始檔已存在 : 
* Makefile 內容 : 
  1. BIN := /usr/bin  
  2. PRINTF :=$(BIN)/printf  
  3. count_words: count_words.o lexer.o -lfl list  
  4.         @echo "Make Version=$(MAKE_VERSION)"  
  5.         @echo "CurDir=$(CURDIR)"  
  6.         @echo "Makefile list=$(MAKEFILE_LIST)";  
  7.         @echo "Make Cmd Goals=$(MAKECMDGOALS)";  
  8.         gcc count_words.o lexer.o -lfl -o count_words  
  9. count_words.o: count_words.c  
  10.         gcc -c count_words.c  
  11.   
  12. lexer.o: lexer.c  
  13.         gcc -c lexer.c  
  14. lexer.c: lexer.l  
  15.         flex -t lexer.l > lexer.c  
  16. list:  
  17.         @echo "$(.VARIABLES)" | tr ' ' "\n" | grep MAKEF  
請執行以下命令 : 
linux-tl0r:~/GnuMake/SimpleMake # pwd
/root/GnuMake/SimpleMake
linux-tl0r:~/GnuMake/SimpleMake # make count_words
gcc -c count_words.c
gcc -c lexer.c
MAKEFILE_LIST
MAKEFLAGS
MAKEFILES
Make Version=3.81
 #當前Make version
CurDir=/root/GnuMake/SimpleMake #當前工作目錄
Makefile list= Makefile #使用的Makefile 檔名
Make Cmd Goals=count_words #命令列的工作目標
gcc count_words.o lexer.o -lfl -o count_words

Supplement 
GNU Make Doc - How to Use Variables

沒有留言:

張貼留言

[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...