Make 是甚麼以及它的用法
Make 是甚麼 ?
顧名思義,make 的意思就是做。譬如說,想做出一個文件 a.txt,那麼就可以執行下面的指令:
$ make a.txt
但是如果你直接在命令行輸入這個指令是不會起作用的,因為 make 本身不知道要怎麼做出 a.txt,需要其他人告訴 make 怎麼做,也就是下面會介紹到的 Makefile。
比如說,假設 a.txt 要由 b.txt 和 c.txt 合併來得到,實際上指令應該要像這樣:
a.txt: b.txt c.txt
cat b.txt c.txt > a.txt
我們來解析下上面的指令。其實 make a.txt 本身可以分為兩步。第一步(第一行),要先確認 b.txt 和 c.txt 存在。第二步(第二行),使用 cat 連接指令合併 b.txt 和 c.txt 並且輸出到 a.txt。
其實這就是本文的主角,Makefile。像上面告訴 make 指令要怎麼做的規則都寫在一個叫做 Makefile 的文件中。而我們可以指定當前的 make 指令要依照哪一個 Makefile 文件的規定去 make 東西,像下面這樣:
$ make -f rules.txt
// 或是
$ make --file=rules.txt
上面的代碼就是說,指定 make 依照 rules.txt 中的規則去做東西。
這邊先簡單總結下,其實 make 就是一個根據 Makefile 規則指示構建東西的工具,Makefile 中的規則也很簡單,說明要做的東西依賴甚麼東西,要怎麼做。
Makefile 怎麼寫 ?
文件格式
Makefile 文件其實就是一些規則的集合,而每條規則型式如下:
<target> : <prerequisites>
[tab] <command>
target 放的叫做"目標",prerequisites 放的叫做前置條件,第二行必須由一個 tab
開頭,這是規定,然後後面就跟著 command,也就是要執行的指令。
其中,除了 target 為必需的,其他都是可選的,而 prerequisites 和 command 則必須至少存在一個。
target
一個目標就構成一個規則。通常,目標可以是文件名,像是上面的 a.txt。除了文件名,還可以是某個操作的名字,這叫做偽目標 (phony target)。看看下面的例子:
clean:
rm *.o temp
像上面這樣,clean 就是一個偽目標,作用是刪除所有後綴為 .o 的文件。
$ make clean
但是,萬一我們的目錄下面已經有了一個叫 clean 的文件,那 make 就會認為已經存在 clean 這個目標,所以並不會去執行真正的 clean 規則,當然這不是我們所希望的。解決辦法就是可以顯示的聲明 clean 是一個偽目標,相當於告訴 make,當我執行 make cle