首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Linux C 專案巨集組合自動化編譯:Bash 雙重迴圈 + make -D 參數化構建完整腳本

     編輯:程式設計綜合問答

需求

3 個功能巨集 FEATURE_A/B/C,各 0/1 共 8 種組合,需自動逐一編譯驗證無錯誤。

Bash 腳本實作 (build_all.sh)


#!/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 "🎉 所有配置編譯通過!"

Makefile 關鍵片段


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

進階:平行加速 (GNU Make -j)


# 將配置寫入暫存檔,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
'

CMake 專案對應做法


# 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
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved