如何通过单个make命令完成多配置编译(仅用Makefile实现)
纯Makefile实现多配置批量编译方案
可以通过Makefile的目标依赖、变量扩展以及内置Shell支持来实现,无需外部脚本。以下是适配你需求的完整方案:
核心思路
- 自动扫描所有defconfig文件,生成对应的编译目标
- 为每个配置创建独立的构建流程:生成
.config→ 编译 → 产物归档 - 确保串行执行(避免
.config文件冲突),编译失败立即终止
完整Makefile代码
# 自动扫描conf目录下所有defconfig文件 DEFCONFIGS := $(wildcard conf/*.defconfig) # 为每个defconfig生成对应的构建目标(例如:xxxxx_yyyy.build) BUILD_TARGETS := $(DEFCONFIGS:conf/%.defconfig=%.build) # 匹配编译生成的elf文件模式(和你的脚本保持一致) ELF_PATTERN := xxx*_* # 字符截取参数:对应原脚本中cut -b yy-zz的起始位置(Shell下标从0开始,需转换) # 例如原脚本cut -b 3-7,这里设置为START=2 LENGTH=5 START := yy-1 LENGTH := zz-yy+1 # 主目标:触发所有配置的编译 .PHONY: all $(BUILD_TARGETS) all: $(BUILD_TARGETS) # 强制串行执行,避免.config文件被并行编译覆盖 .NOTPARALLEL: # 单个配置的构建规则 %.build: conf/%.defconfig # 生成当前配置的.config文件 @echo "=== 生成配置: $< ===" @make $< # 执行编译 @echo "=== 开始编译 ===" @make # 检查编译结果,失败则终止 @if [ $$? -ne 0 ]; then \ echo "=== 编译失败,终止流程 ==="; \ exit 1; \ fi # 创建目标目录并移动产物 @echo "=== 归档产物 ===" @for xxxfile in $(ELF_PATTERN); do \ xxxdir=$${xxxfile:$(START):$(LENGTH)}; \ mkdir -p $$xxxdir; \ mv $$xxxfile $$xxxdir/; \ echo "移动 $$xxxfile 到 $$xxxdir/"; \ done @echo "=== 配置 $* 编译完成 ==="
关键说明
- 自动扫描配置:
$(wildcard conf/*.defconfig)会自动获取conf目录下所有.defconfig文件,无需手动维护50个配置列表 - 串行执行:
.NOTPARALLEL:确保Make逐个处理每个配置,避免多个编译进程同时修改.config文件导致的冲突 - 错误终止:通过
if [ $$? -ne 0 ]; then exit 1; fi实现编译失败时立即停止整个流程,和原脚本逻辑一致 - 产物归档:用Shell字符串截取替代
cut命令,避免依赖外部工具,同时保持和原脚本相同的目录命名规则 - PHONY目标:标记
all和所有.build目标为伪目标,避免和同名文件冲突
使用方式
直接执行:
make all
内容的提问来源于stack exchange,提问作者Yogesh Sharma
相关产品推荐
相关产品推荐

