make
編輯make 是一個構建管理工具,它根據條件執行命令。 它主要作為編程工具用于軟件開發中。
例如,它用于自動控制由許多不同的源代碼文件組成的項目中的所有工作步驟(翻譯、鏈接、復制文件等),直至完成的可執行程序。 但是,make 的設計非常靈活,它還可以控制文件的時間依賴性發揮作用的任何其他任務。
make 實用程序是 POSIX 標準的一部分,目前稱為 IEEE Std 1003.1, 2008 Edition(相當于 Single UNIX Specification V3, SUSv3)。
解釋
編輯make 讀取一個所謂的 Makefile(注意大小寫,這在 Unix 文件系統中是不同的),其中程序編譯過程的依賴關系被形式化。 這種形式化描述了哪些源文本文件由編譯器或其他程序以何種方式處理哪些目標文件或結果,或者哪些目標文件由鏈接器鏈接到程序庫或可執行程序。 所有步驟都是根據 Makefile 中記錄的依賴項完成的。
當 Makefile 由 make 程序處理時,如果源文件比結果文件的現有版本更新,或者沒有可用的結果文件,則源文件僅轉換為目標文件。 在開發包含許多源文件和許多可執行程序的大型程序包時,這消除了重新編譯許多小改動的需要。 這種經濟措施的成功取決于正確指定文件依賴性。 Makefile 中必須完整且正確地描述所有依賴項——這在大型項目中實現起來并不容易。 可能會出現新的依賴關系,尤其是在程序更改或擴展時。 這些依賴項必須輸入到 Makefile 中才能正常運行。 在 80 年代初期,mkmf 或 makedepend 等實用程序被廣泛用于此目的。 自 20 世紀 80 年代中期以來,make 程序已經集成了自動生成依賴列表的方法(例如在 SunPro make 中),并且 makefile 已經集成了生成它們的規則。
make 運行的命令不限于編譯器或鏈接器。 命令行解釋器提供的任何工具都可用于實現所需的文件操作。 所以你可以 自動從文本生成圖像。
make 已經在軟件開發的大領域確立了自己的地位,但直到 20 世紀 80 年代中期才出現問題——尤其是對于大型項目——(只要所有依賴規則的自動生成沒有得到解決)(參見文獻)。 因此,反復嘗試尋找和建立繼任者(見備選方案)。
原則
編輯創建文件在 Makefile 中稱為目標。 條目中描述了此的邊界條件。
例子:
A: B C cmd_A
這一行的意思是:目標 A 依賴于源 B 和 C(“依賴于”通常意味著“將從中創建”)。 如果要創建 A,則考慮 B 和 C。 如果其中一個比 A 年輕,則運行 cmd_A 以重建 A。 如果 A 比 B 和 C 年輕,則 A 被認為是當前的,因此不執行 cmd_A。
B 或 C 作為 A 的來源現在可以反過來成為進一步制定法規的目標:
B:DE cmd_B
首先考慮A。 由于 A 依賴于 B,因此在對 A 采取進一步行動之前會考慮 B。 總體而言,這描述了向后執行指令。 起點是最終目標 A。這種考慮必須以可用的來源結束,并且沒有進一步的形成規定。 這些是整代人的實際來源。 如果找不到來源,但也沒有找到形成規則,制造商只能回復錯誤信息:不知道如何制造.... 此類錯誤的原因可能是 Makefile 中的錯誤或實際缺少源代碼。
推導規則定義: 上式中,A、B等可以是帶目錄信息的命名文件。 但是,也可以通過指定文件擴展名來定義通用規則:
.co: $(CC) $(CFLAGS) -c -o $@ $<;
在上面的例子中有一個所謂的推理規則,它是以后綴規則的形式寫成的。
示例生成文件
編輯現在的示例僅顯示了最簡單的 makefile 形式。 還有方法比如使 Makefile 更強大的模式規則。
程序 prog 將從兩個源文件 foo.c 和 bar.c 生成,如果只更改兩個源文件之一,則需要盡可能少的編譯和鏈接過程。
全局變量在前兩行定義,其中包含編譯器和鏈接器的程序名稱。 第4行在Makefile中定義了一個跳轉標簽,叫做targets; 表達式 foo.o 和 bar.o 首先按指定順序調用第 7 行和第 10 行中定義的目標,然后最終執行第 5 行中的命令。 在第 5 行,一個命令由全局變量 LD 和一些參數組成。 foo.o 和 bar.o 這兩個文件可用,因為創建這些文件的其他兩個目標已經執行。 下一行表明 foo.o 是從 foo.c 生成的,在第八行通過調用 C 編譯器 cc。 最后兩行是類似的。
跳轉標簽的名稱與其下處理的文件之間沒有強制聯系。 在跳轉標簽下執行的語句總是以水平制表符開頭。
該過程使用 make prog 在命令行上啟動。 如果沒有指定參數,make 運行xxx個定義的目標(這里是 prog)。 所以在上面的例子中,make 和 make prog 有同樣的效果。
申請
編輯如果沒有 make 或類似工具,很難想象大型程序和程序包的開發,它們由許多單獨的源文本文件組成,并且依賴于單獨的庫。 在開源世界中,一個項目的源代碼與它的 Makefile 一起發布是很常見的,以簡化編譯軟件。
近期發展
編輯特別是對于較大的程序,Makefile 并不總是由開發人員直接編寫,而是使用不同的程序根據更簡單的規則創建,或者使用更強大的系統。 自動生成復雜 makefile 的一種方法是使用預處理器,例如 GNU autotools(autoconf 和 automake)或 mkmf、qmake 或 CMake。 降低 Makefile 復雜性的方法基于更強大的系統,例如 David Korn 的 nmake 程序。 該系統允許 makefile 簡單地列出表中涉及的源文件。
make 命令的替代方法
編輯GNU Make(簡稱gmake)通常用于Linux,Windows有nmake。 nmake 由 AT&T 編寫,作為 UNIX-make 的繼承者,它允許簡單的表格 makefile。
盡管 makepp 也是 GNU make 的衍生產品,但它還提供了一個集成的可擴展命令和包括自動檢測隱式依賴項的解析器。 還可以識別更改的命令選項和類似的一般條件。 可以優雅地規避遞歸的大 make 問題以保證正確的構造。 此外,Perl 可以在各個層次上集成。mk(9 號計劃下)也是從 make 發展而來,但朝著簡化的方向發展。SConsPython 實現的跨平臺系統,比 make 有許多改進。 還集成了 automake/autoconf 的一些特性。 它的優勢在于 Python 編程語言的全部功能可以在名為“SConstruct”的 makefile 中使用。基于 Apache Ant 和 Apache MavenXML 的系統具有相同的目的,可以使用 Java 進行擴展。Vesta 是一個 SCM帶有內置構建工具的工具。來自 Boost 庫的 Jamein 構建工具,C++ 標準庫對 C++ 編程語言的擴展。創建計算機程序,類似于 make 或 Ant。除了創建過程的經典自動化之外,它還允許您查找、下載、安裝、修改和調試計算機程序。 A-A-P 具有與 CVS 的集成連接。
內容由匿名用戶提供,本內容不代表www.gelinmeiz.com立場,內容投訴舉報請聯系www.gelinmeiz.com客服。如若轉載,請注明出處:http://www.gelinmeiz.com/364252/