四種運算符
| 運算符 | 名稱 | 行為 | 範例 |
= | 遞歸/延遲展開 | 賦值時不展開,使用時才遞歸展開 | VAR = $(OTHER) → 使用時才取 OTHER 當前值 |
:= | 立即/簡單展開 | 賦值時**立即**展開右側,鎖定值 | VAR := $(OTHER) → 當下 OTHER 的值 |
?= | 條件賦值 | **僅當變數未定義**時賦值 | VAR ?= default → 若 VAR 已有值則保留 |
== | 非標準賦值 | Make 內建無此賦值運算符;條件判斷用 ifeq ($(VAR), value) | 可能為誤寫 |
實例演示
A = a
B = $(A) b # 遞歸展開
C := $(A) c # 立即展開
A = NEW_A
# 此時
$(info B = $(B)) # 輸出: B = NEW_A b (跟隨 A 變化)
$(info C = $(C)) # 輸出: C = a c (鎖定賦值時的值)
# 條件賦值
D ?= first
D ?= second
$(info D = $(D)) # 輸出: D = first (第二次 ?= 不生效)
最佳實踐
- 預設使用
:= 避免意外的遞歸展開導致效能問題或難以除錯。
- 環境變數覆蓋預設值時用
?=:CC ?= gcc。
- 複雜字串構建(如編譯旗標)用
:= 鎖定。