跳至主要内容

Shell 的指揮官:Makefile

· 閱讀時間約 4 分鐘
誠星工作室
Honest Star Studio

在軟體開發與 DevOps 領域,Makefile 是一個被低估但強大的工具。它不僅能自動化編譯流程,還能用於各種 Shell 任務,如測試、部署、甚至系統管理。當你需要組織並執行一連串 Shell 指令時,Makefile 就像一名指揮官,確保任務有條不紊地執行。

Makefile 是什麼?

Makefile 最早由 Unix 系統的 make 指令驅動,主要用途是管理程式碼的編譯。但隨著 DevOps 的興起,Makefile 早已超越原始用途,成為自動化腳本的優秀選擇。

為什麼使用 Makefile?

  1. 簡潔的指令組織:透過 Makefile,我們可以定義一系列可重用的 Shell 指令,避免手動輸入的麻煩。
  2. 增量執行make 具有依賴關係管理的能力,只執行必要的部分,提升效能。
  3. 環境無關性:無論是 macOS、Linux 還是 Windows(透過 WSL 或 MinGW),Makefile 都能運行。
  4. 提升團隊協作:讓團隊成員透過統一的 Makefile 輕鬆執行開發、測試與部署流程。

Makefile 基本語法

Makefile 由「目標(target)」、「依賴(dependencies)」與「指令(commands)」組成,基本格式如下:

目標: 依賴
指令

例如:

build:
echo "開始編譯..."
gcc main.c -o main

執行 make build 會觸發 echogcc 指令。

進階語法

1. 使用 @ 隱藏輸出

預設情況下,Makefile 會輸出執行的指令。若要隱藏輸出,可在指令前加 @

echo_test:
@echo "這是一條隱藏指令"

執行 make echo_test 只會顯示 這是一條隱藏指令,而不會顯示 echo "這是一條隱藏指令"

2. 使用函數 (Functions)

Makefile 內建了許多函數,例如 shell 允許執行 Shell 指令並返回結果:

CURRENT_DIR := $(shell pwd)

echo_dir:
@echo "目前目錄是 $(CURRENT_DIR)"

3. 內建變數與模式規則

  • $@:表示目標名稱
  • $^:所有依賴檔案
  • $<:第一個依賴檔案
%.o: %.c
gcc -c $< -o $@

這條規則適用於所有 .c 檔案的編譯,將 .c 轉換成 .o 檔案。

.c是被依賴的另一行指令,.o是被執行的指令,你想的沒錯喔,指令可以用檔案名稱的方式命名

.PHONY: build

也因此有時你會看到 .PHONY 這個區塊,告訴 cmake build 是指令不是生成的檔案,cmake會檢查目標是否已經生成,避免重複執行

Makefile 在 DevOps 的應用

1. 自動化開發環境設置

setup:
apt update && apt install -y python3
pip install -r requirements.txt

2. 測試與持續整合

test:
pytest tests/

3. 部署與版本管理

deploy:
scp main user@server:/app/
ssh user@server "systemctl restart app"

結語

Makefile 是 Shell 指令的最佳管理工具之一,能讓開發與 DevOps 工作更加有序、高效率。如果你的專案還沒使用 Makefile,不妨開始試試,讓它成為你的自動化指揮官!