美思 [GNU Make] Makefile 教學:如何使用 make 指令

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

由於 make 是純命令列工具,本身沒有函式庫,使用 make 的前提是熟悉系統上的指令,因為 make 需要呼叫外部程式來滿足實際的功能。make 預設的設定檔為 Makefile,在撰寫 Makefile 時,最好先自行手動輸入一下相關的指令,確認指令可以正常運作,再將其寫入 Makefile 中。

使用 make 指令

GNU Make 預設的設定檔有以下三個 (按優先次序):

  • GNUmakefile
  • makefile
  • Makefile

工作目錄內存在這三個設定檔之一時,make 會自動去讀取;除了這三個以外,可以加上 -f 參數來指定 make 所用的設定檔。如下例:

$ make -f my_workflow.mk

其他的用法,於相關文章會說明。

任務 (tasks)

Makefile 的核心概念是任務 (tasks),我們在撰寫 Makefile 時就是撰寫所需的任務。而任務間有相依性,make 會自動處理相依性,這就是 Makefile 比一般的腳本語言命令稿來得好的地方。

Makefile 的「虛擬碼」如下:

任務: 相依性
    指令

由此可知,任務包含三個部分:

  • 任務名稱
  • 相依性:其他的任務
  • 指令:實際運作的系統指令

實際的 Makefile 會複雜得多,因為 Makefile 內除了要撰寫系統指令外,還會加上 Makefile 本身的語法。

Hello World

在程式設計中,Hello World 是用來確認開發環境可正常運作的微型程式,這個傳統來自於 The C Programming Language 這部 C 經典入門書。我們遵循這個傳統,撰寫 make 版的 Hello World。

在工作目錄下,加入 Makefile 檔案,並撰寫以下文字:

hello:
    @echo "Hello World"

先不要在意 Makefile 的語法,我們的目的是要確認程式可正常運作。

在相同目錄下,輸入 make 指令:

$ make
Hello World

若可順利執行,代表我們第一個 Makefile 撰寫成功;若失敗,需依照錯誤訊息除錯。最常見的錯誤就是在指令的地方沒有使用 TAB 來縮進,這是 make 的一個特殊設計。

基本概念

我們將先前的 Makefile 重看一次,這次我們會說明其語法:

hello:
    @echo "Hello World"

在我們這個例子中,任務名稱是 hello。此任務沒有相依的任務,故相依性部分留白即可。

實際的指令是 echo "Hello World"echo 是系統上的指令,而非 Makefile 語法,而 "Hello World" 是一般的字串,在此為 echo 的參數。在指令前加 @ (at symbol) 可壓抑將該指令本身輸出到命令列的行為,讀者可自行將 @ 拿掉即可知其差異。

在 Makefile 中,第一個出現的任務即為預設任務。以本例來說,不論輸入 makemake hello 的效果皆相同。

關於作者

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

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