美思 [GNU Make] Makefile 教學:介紹

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

一般來說,make(1) 會在介紹 C (或 C++) 時一併介紹,但 make 其實不限於編譯 C (或 C++) 程式,而是一種通用的編譯自動化 (build automation) 軟體。一些使用情境如下:

  • 編譯程式,像 C 或 C++
  • 測試程式
  • 靜態程式碼分析
  • 生成文件,像 LaTeX 或 PDF 等

只要能用命令列操作的程式,都有機會用 make 將工作流程自動化。

make 預設的命令稿為 Makefile,而 Makefile 算是一種編譯自動化的小型語言 (mini language),雖然我們可以用其他的腳本語言來撰寫等效的命令稿,但這樣的腳本會比 Makefile 來得長,而且無法善用 make 所帶來的好處。

在編譯自動化軟體中,make 算是此類軟體的濫觴。現在出現很多新的編譯自動化軟體,像是 RakeSConsInvokeGradleGulpJake 等。除了保有 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 的移植品 (見 MSYS2GnuWin32)。

比起 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 系統。

關於作者

身為資訊領域碩士,美思認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

美思喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,美思將所學寫成文章,放在這個網站上和大家分享。