2009/03/10

Makefile...

在介紹Makefile之前
先了解一下什麼是make
make是自動化轉換文件格式的工具
並且會檢查文件之間的相依性
只會針對有修改的檔案進行編譯
通常是用來轉換原始碼(*.C)成執行檔(*.exe)
而文件之間的相依性
就是定義在makefile中

makfile基本的結構
target: dependencies
Commands
以下分別說明
● target
所要建立的檔案
必須要以:結尾
在make時發現target建立的時間比dependecies新
就不會再重新建立target

基本上make時會先參考all的target
並根據它的dependencies決定要建哪些項目
若沒有all則會採用第一個target

若target並不是要建立檔案
例如
clean:
rm*.o
就要在前面宣告".PHONY: clean"
這樣make就會知道這不是用來建立檔案的
如果不加.PHONY
在目錄中有clean的file則clean就會被視為要建立
而clean卻沒有dependencies的項目
所以就永遠不會執行

● dependencies
相依的項目
make會跟據這些項目決定市府要重新建立target
在建立target之前必須要檢查的項目
若是traget建立的時間比dependencies早
則會重新建立target
若在dependencies中有其他的target
則會先檢查那個target的dependencies

● Commands
要建立target的指令
必須要以開頭
因為在makefile中
開頭都會當作Shell Script
每條Commands必須寫在同一行
每條Command會啟動新的Shell
若有錯誤就會中斷make
有些在Commands的特殊字元
&&:檢查某個指令是否執行成功,在執行下個指令
@:不要顯示執行的指令
-:即使執行錯誤也不會中斷

以下來的簡單的範例
main:main.o test1.o
gcc -o main main.o test1.o
在上述的範例中
要建立main的執行檔
在建立之前要先檢查main.o以及test1.o有沒有比main更新
如果沒有make會先將main.o與test1.o建立好
在去執行gcc -o main main.o test1.o去產生main的執行檔

其他的語法
◎ 註解
# 開頭則為註解啦

◎ 變數宣告
=
將變數給定成為某值
可以用&(變數名)或${變數名}來取出值
若要將變數清空
變數名=

:=
將全部變數展開後再給值
所以不會是最後的值
請參考下例
X = abc
Y = $(X) def
X = def
最後Y為def def
X := abc
Y := $(X) def
X := def
最後Y為abc def

?=
若變數未指定則給值
若已經指定了就採用原來的值

+=
將值給到現有變數的後面

◎ 內部變數
$?
代表已被更新的dependencies的值
也就是dependencies中比target還要新的值

$@
代表target的值

$<
代表第一個dependencies的值

$*
代表target所指定的檔案 不包含副檔名


PS1:gcc & make的不同
gcc是用來編譯與連結程式
並產生出執行檔
make是用來檢查文件之中的相依性
根據相依性以及外部程式來產生出target
所以make可以簡化gcc的執行過程
將gcc寫在makefile的Commands裡面
就可以快速的產生執行檔
並利用相依性可以避免不需要的編譯過程
PS2:configure & make的不同
configure是用來偵測作業環境
在偵測完畢之後會建立makefile
而configure所用的檔名為configure或config

沒有留言:

張貼留言