Shell 的指揮官:Makefile
· 閱讀時間約 4 分鐘
在軟體開發與 DevOps 領域,Makefile 是一個被低估但強大的工具。它不僅能自動化編譯流程,還能用於各種 Shell 任務,如測試、部署、甚至系統管理。當你需要組織並執行一連串 Shell 指令時,Makefile 就像一名指揮官,確保任務有條不紊地執行。
Makefile 是什麼?
Makefile 最早由 Unix 系統的 make
指令驅動,主要用途是管理程式碼的編譯。但隨著 DevOps 的興起,Makefile 早已超越原始用途,成為自動化腳本的優秀選擇。
為什麼使用 Makefile?
- 簡潔的指令組織:透過 Makefile,我們可以定義一系列可重用的 Shell 指令,避免手動輸入的麻煩。
- 增量執行:
make
具有依賴關係管理的能力,只執行必要的部分,提升效能。 - 環境無關性:無論是 macOS、Linux 還是 Windows(透過 WSL 或 MinGW),Makefile 都能運行。
- 提升團隊協作:讓團隊成員透過統一的 Makefile 輕鬆執行開發、 測試與部署流程。
Makefile 基本語法
Makefile 由「目標(target)」、「依賴(dependencies)」與「指令(commands)」組成,基本格式如下:
目標: 依賴
指令
例如:
build:
echo "開始編譯..."
gcc main.c -o main
執行 make build
會觸發 echo
和 gcc
指令。
進階語法
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,不妨開始試試,讓它成為你的自動化指揮官!