Make
make是一个佇軟體開發中所使用的工具程式(Utility software), 經過讀取「makefile」的檔案以自動化建構軟體。伊是一種轉化檔案形式的工具,轉換的目標號做「target」;佮這个同時,伊嘛檢查檔案的依賴關係,若需要的話,伊會呼叫一寡外部軟體來完成任務。伊的依賴關係檢查系統足簡單,主要根據依賴檔案的修改時間進行判斷。大多數的情況下,伊予人用來編譯原始碼,生做結果代碼,然後共結果代碼接起來生做會當執行檔抑是庫檔案。伊使用叫做「makefile」的檔案來確定一个 target 檔案的依賴關係,然後共生做這个 target 的相關命令傳予 shell 去執行。
真濟現代軟體的開發中(如 Microsoft Visual Studio), 整合式開發環境已經取代 make,猶毋過佇咧 Unix 環境內底,猶原有誠濟工程師採用 make 來協助軟體開發。
起源
目前雖然有濟濟依賴關係檢查工具,猶毋過 make 是應用上廣泛的一个。這愛歸功佇伊的被包括佇 Unix 系統當中。斯圖亞特 ・ 費爾德曼(Stuart Feldman)佇一九七七年佇貝爾實驗室(Bell Labs)里製作這个軟體。二空空三年,斯圖亞特 ・ 費爾德曼因發明了按呢一个重要的工具咧接受了美國電腦協會(ACM)頒發的軟體系統獎。
佇咧 make 誕生進前,編譯工作主要依賴佇咧作業系統內底的類似「make」、「 install」功能的 shell 指令碼。伊會當批次執行生做目標的命令,而且會使完成依賴關係的檢查。這是向現代編譯環境發展的重要一步。
無仝版本
make 程式已經予人使用者較濟改重 / 改寫,其中包括幾擺用仝款的檔案格式佮演算法原理重新來編寫,並且照無仝需要添一寡無四常看著的改良。
GNU make
GNU make 仿的 make 的標準功能(透過 clean-room 工程)重新改寫,並加入作者感覺值得加入來新功能,常和 GNU 編譯系統做伙攏咧使用,是大多數 GNU Linux 安裝的一部份。
BSD make
BSD make 是對 Adam de Boor 的製作的版本頂懸發展甲。伊編譯目標的時陣有並行計算的能力。伊佇咧 FreeBSD,NetBSD 和 OpenBSD 中間無仝款程度的改下存活落來。
Microsoft nmake
廣泛應用於微軟的 Windows,微軟乎 nmake 是 Visual Studio 隨附的命令列工具,莫佮來自 AT & T 佮貝爾實驗室的 Unix 系統 nmake 透濫。
優點佮缺點
就親像其他佮 make 有悠久歷史的軟體仝款,make 有真濟咧擁護者佮反對者。伊的真濟問題因為現代大型的軟體專案的出現才暴露出來。但是真濟人會爭論講伊佇咧較捷看的情形下會當真好的工課,而且使用非常的簡單,功能強大,表達清楚。毋管按怎,make 猶原予人用來編譯真濟完整的作業系統,而且這馬咧替代品佇咧基本的操作頂頭無傷大差別。
隨著現代的整合式開發環境(IDE)的誕生,特別是非 Unix 的平台頂面,足濟程式設計師袂閣手動管理靠關係檢查,甚至免去插佗一寡檔案是這个案的一部份,是共遮的任務交予了𪜶的開發環境去做。類似的,足濟現代的程式語言有家己的特別高效的依賴關係的設定方法。
Makefile
規則
makefile 的格式是:
` ` `
- 用“#”鋪表明注預。
target(欲生出來的文件): dependencies(予人依照的文件)
- 命令頭前用的是“tab”毋是空格。鋪排空格是初交代的人容易犯的交代!
Tab ↹ 命令一 Tab ↹ 號令二 Tab ↹ 號令三 . . . Tab ↹ 命令 n
- 會用得使用“\”表示否行。注意,“ \”之后袂使有空格!
` ` `
- target , dependencies 佮命令構變成一个 makefile 里的一个「規則」,規則指示 make 當時以及如何重新生成 target 抑是講執行 target 下的命令
- target 通常是咱欲生成的檔案的名,排的順序無重要,但是第一个 target 是預設的 target。當 make 無帶數的時陣,自動執行頭一个 target。target 嘛會使是要求 make 完成的動作,執行這種 target 尾並袂當得著佮 target 仝名的檔案,所以,嘛叫偽 target ( phony target )。
- dependencies 是成做 target 伊需要的檔名列表。依賴會當為空,捷用的「clean」target 就定定無依賴,只有伊彼命令。若依賴無為著空,著 make 會先檢查這个依賴的「規則」。 依賴規定了當時重新來執行 target 下命令。若任何依賴比 target 更新(因為執行了依賴的「規則」的命令抑是使用者修改了依賴), make 則會重新執行 target 下的命令。
- 命令會使是任何一个 shell 會當執行的命令。
範例
比例來說明 makefile 的結構佮 make 按怎去運作咧。
做阮輸入:
` ` ` make 抑是講 make editor ` ` `
當 editor 這乎 target 檔案無存在,抑是講 main . o、text . o 這兩个依賴檔案予人修改,攏會予 make 呼叫其下的命令「gcc-o editor main . o text . o」;紲落來伊,因為參照著 main . o 和 text . o,make 會檢查 main . o 的依賴 main . c、def . h 有沒更新,伊若有,則執行其下的命令按呢「gcc-c main . c」;仝款的道理,嘛真適用佇 text . o。 所以,有幾種無仝款的輸出:
- 第一擺執行:
` ` ` gcc-c main . c gcc-c text . c gcc-o editor main . o text . o ` ` `
- main . c 抑是 / 和 def . h 有修改:
` ` ` gcc-c main . c gcc-o editor main . o text . o ` ` `
- text . c 抑是 / 和 com . h 有修改:
` ` ` gcc-c text . c gcc-o editor main . o text . o ` ` `
- main . c 和 text . c 攏有修改:
` ` ` gcc-c main . c gcc-c text . c gcc-o editor main . o text . o ` ` `
做阮輸入:
` ` ` make install ` ` `
make 會檢查 install 的依賴 editor 敢是上新,若是,則執行其下的命令按呢「mv editor / usr / local」。 因為這過程並無產生名做「install」的檔案,所以乎,install 是一个假目標。
巨集
「 巨集」指甲是用一字串代替另外一字串的功能。佇咧 makefile 中會用得用「=」號來定義巨集,使用「$(巨集名)」 來使用巨集;猶閣會用得「+=」追加巨集的內容。慣勢上,巨集名使用大寫。承接頂懸的例:
參見
- Apache Ant
- CMake
參考資料
外部連結
- GNU Make 官方網站
- GNU make 中文手冊
- 佮我做伙寫 Makefile