Make 與 Makefile
/ MAYK /
Make 是類 Unix 系統上歷史悠久的經典建構系統,而 Makefile 就是你用來寫下建構指示給它的純文字檔。如果說建構系統是一位廚房助手,那 Make 就是某位被廣泛使用的特定助手,Makefile 則是你交給它的那張手寫食譜卡。你在含有名為 Makefile 的檔案的目錄裡輸入 make 來執行它。
Makefile 主要就是一串規則。每條規則說:這是我想產出的東西(目標 target)、這是它由什麼做成(前置條件 prerequisites)、這是把它做出來的 shell 指令(配方 recipe)。Make 讀完所有規則,從目標與前置條件之間的連接關係推斷出順序,然後只執行那些輸入比輸出新的配方。有個關鍵又惡名昭彰的細節:Makefile 裡每行配方都必須以真正的 TAB 字元開頭,不能用空格,否則 Make 會回報一個令人困惑的錯誤。
為什麼重要:Make 無所不在,因此會讀 Makefile 就能建出大量既有軟體。它也小巧而透明,很適合學習。不過它的弱點也很實在:語法精簡又古怪、它以檔案時間戳為核心(這有時會誤導它),而且它本身並不知道如何在不同系統上找到編譯器或函式庫——這也是 CMake 之類的後設建構工具會疊在它之上的部分原因。
一份小小的 Makefile(配方行以 TAB 開頭): app: main.o util.o gcc main.o util.o -o app main.o: main.c gcc -c main.c 然後: $ make
三條規則告訴 Make 如何由目的檔建出 app,以及每個目的檔如何由其原始碼建出。
新手最常見的單一錯誤,就是用空格而非 TAB 來縮排配方行;此時 Make 會印出「missing separator」,而這句話並不明顯地代表「你用了空格」。