3 個功能巨集 FEATURE_A/B/C,各 0/1 共 8 種組合,需自動逐一編譯驗證無錯誤。
#!/bin/bash
set -euo pipefail
FEATURES=("FEATURE_A" "FEATURE_B" "FEATURE_C")
CONFIGS=()
# 產生 0/1 所有組合 (2^3=8)
for a in 0 1; do
for b in 0 1; do
for c in 0 1; do
CONFIGS+=("$a $b $c")
done
done
done
echo "共 ${#CONFIGS[@]} 種配置開始編譯..."
for cfg in "${CONFIGS[@]}"; do
read -r A B C <<< "$cfg"
echo "=== Building: A=$A B=$B C=$C ==="
# 清理舊產物
make clean >/dev/null 2>&1
# 傳遞巨集定義給編譯器
# 假設 Makefile 使用 CFLAGS += $(DEFINES)
make DEFINES="-DFEATURE_A=$A -DFEATURE_B=$B -DFEATURE_C=$C" all
if [ $? -ne 0 ]; then
echo "❌ FAILED: A=$A B=$B C=$C"
exit 1
fi
echo "✅ PASSED"
done
echo "🎉 所有配置編譯通過!"
CFLAGS = -Wall -Wextra -std=c11 $(DEFINES)
DEFINES = -DFEATURE_A=1 -DFEATURE_B=1 -DFEATURE_C=1 # 預設全開
all: myapp
myapp: main.o module_a.o module_b.o module_c.o
$(CC) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
rm -f *.o myapp
# 將配置寫入暫存檔,xargs 並行
printf '%s\n' "${CONFIGS[@]}" | xargs -P 4 -I {} bash -c '
read -r A B C <<< "{}"
make clean && make DEFINES="-DFEATURE_A=$A -DFEATURE_B=$B -DFEATURE_C=$C" all
'
# CMakeLists.txt
option(FEATURE_A "Enable Feature A" ON)
option(FEATURE_B "Enable Feature B" ON)
option(FEATURE_C "Enable Feature C" ON)
add_compile_definitions(
FEATURE_A=${FEATURE_A}
FEATURE_B=${FEATURE_B}
FEATURE_C=${FEATURE_C}
)
# Bash 腳本改用 cmake -D
cmake -DFEATURE_A=0 -DFEATURE_B=1 -DFEATURE_C=1 ..
make