一般來說,make(1)
會在介紹 C (或 C++) 時一併介紹,但 make
其實不限於編譯 C (或 C++) 程式,而是一種通用的編譯自動化 (build automation) 軟體。一些使用情境如下:
- 編譯程式,像 C 或 C++
- 測試程式
- 靜態程式碼分析
- 生成文件,像 LaTeX 或 PDF 等
只要能用命令列操作的程式,都有機會用 make
將工作流程自動化。
make
預設的命令稿為 Makefile,而 Makefile 算是一種編譯自動化的小型語言 (mini language),雖然我們可以用其他的腳本語言來撰寫等效的命令稿,但這樣的腳本會比 Makefile 來得長,而且無法善用 make
所帶來的好處。
在編譯自動化軟體中,make
算是此類軟體的濫觴。現在出現很多新的編譯自動化軟體,像是 Rake、SCons、Invoke、Gradle、Gulp、Jake 等。除了保有 make
原本的思維外,這類新興編譯自動化軟體還加入了一些新的特性,像是 Gradle 可自動處理 Java 相關程式的相依性等。此外,這些新興的編譯自動化軟體是用某種程式語言實作的 DSL (domain-specific language),要在命令稿內加入程式邏輯更加簡單。
make
有許多衍生版本:
make
(original Unix make)- GNU Make
- BSD Make
- dmake
- mk
- nmake (from Microsoft)
本系列文章選擇 GNU Make,因為此版本的 make
使用廣泛。在 GNU/Linux 和 Mac 上預設的 make
即為 GNU Make,在安裝開發工具時通常會一併安裝;Windows 雖然預設不支援 make
,但很容易就可以取得 make
的移植品 (見 MSYS2 或 GnuWin32)。
比起 Rake 和 Gradle 等新興軟體,make
在程式語言的功能上相對薄弱。make
在 4.0 版後,可選擇性性嵌入 Guile 做為 Makefile 的腳本語言,這是新版 make
的一大亮點。不過,有許多的系統仍然使用 3.8 系列的版本,即使系統上有 4.0 以後的版本,該 make
也不一定會將 Guile 編入;故本系列文章不加入這個部分。
一般來說,make
假定專案在某種類 Unix 系統上運行,由 make
的一些內建變數就可看出端倪。如果讀者使用 Windows 系統,可用的指令會差距較大,建議一開始先使用 Cygwin 或 Bash on Windows 等類 Unix 子系統來練習。筆者先前寫過一些相關的文章,有需要的讀者可自行參考。在後續文章中,我們會假定讀者使用某種類 Unix 系統。