2010年9月13日 星期一

[GNU Make] 調用 make 與 Makefile 的基本語法

調用 make : 
在命令列打入 make 時作了以下假設 : (不加任何參數
* make 的描述擋檔名為 makefileMakefile 或 GNUMakefile. (或是你可以使用 -f 參數指定描述擋)
* 執行 make 命令時 , makefile 就放在使用者當前目錄.

當 make 在上述情況下, make 會自動建造找到的第一個工作目標. 要更新一個不同的工作目標 (或多個工作目標), 請在命令列指定工作目標名稱 : 
[benjamin@localhost ~/src/gnumkproj]$ make lexer.c

當 make 執行時, 它將會讀取描述擋以及找到所要更新的工作目標. 如果工作目標或其必要條件有任一檔案尚未更新 (或不存在) , 則會 (以一次一個命令的方式) 執行相應規則之命令稿中的 shell 命令. 這些命令執行後, make 會假定工作目標已經完成更新的動作, 於是移到下一個工作目標或結束執行. 
如果你所指定的工作目標已經更新 (up to date) , make 除了告訴你此狀況並立即結束執行, 其他什麼事也不做 : 
[benjamin@localhost ~/src/gnumkproj]$ make lexer.c
`lexer.c' is up to date.

如果你所指的工作目標並未出現在 makefile 檔案中, 也不存在與之對應之內定規則, make 會作出以下反應 : 
[benjamin@localhost ~/src/gnumkproj]$ make not-exist-target
make: don't know how to make not-exist-target. Stop

make 提供了許多命令選項, 其中最有用的一項是 --just-print ( -n), 用來要求 make 顯示它將為特定工作目標執行命令, 但不要實際執行它們. 當你在撰寫 makefile 時, 這個功能特別有用. 

Makefile 的基本與法 : 
對 make 有了基本認識後, 現在你可以撰寫自己的 makefile 了. 這裡將介紹 makefile 的基本語法與結構, 讓你熟悉如何寫自己的 makefile
makefile 檔案一般採用 "由上而下" (top-down) 的結構, 所以預定會更新最上層的工作目標 (通常叫做 all). 下層工作目標用來讓上層工作目標保持在最新的狀態, 比如用來刪除無用之臨時檔案的 clean 工作目標, 應該放在最下層. 正如你預期, 工作目標不一定非得使用檔案名稱不可, 你可以使用任何名稱. 在範例 (如何建立一個簡單的makefile) 可以看到簡化的規則, 下面是較完整的規則 (可能還不構完整 ==") : 
  1. target1 target2 target3 : prerequisite1 prerequisite2  
  2. ^Icommand1  
  3. ^Icommand2  
  4. ^Icommand3  
  5. ...  
冒號的左邊可以出現一個或以上的工作目標, 而在右邊可以出現零或多個必要條件. 如果冒號右邊沒有指定必要條件, 那麼只有在工作目標所代表的檔案不存在時才會進行更新動作. 更新工作目標所要執行的命令有時會被稱為指令稿 (command scripts), 不過通常只會被稱為命令 (command). 
每道命令必須以跳格字符 (tag 鍵開頭. 這個語法用來要求 make 將跟在跳格後的內容傳給 subshell 執行. 如果你不經意在非命令列的第一個字符插入了一個跳格, 則可能會出現非預期錯誤. make 會將井字號 (#) 視為註解字符. 從井字號到該列結束之間的文字都會被 make 忽略. 但注意如果列開頭為跳格字符然後再接井字號, 則make 仍然會將之傳給 subshell. 則由各自的shell 來進行解釋. 

你可以使用標準的 UNIX 規避字符 (escape character) - 到斜線 (\) 來接續太長的文字列. 到斜線一般用來接續太長的命令, 也可以用來接續必要條件. 到目前為止你已經有能力撰寫簡單的 makefile. 接下來需要學習的還有 make 變數, make 命令 與 變數巨集等.

沒有留言:

張貼留言

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