You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过单个make命令完成多配置编译(仅用Makefile实现)

纯Makefile实现多配置批量编译方案

可以通过Makefile的目标依赖、变量扩展以及内置Shell支持来实现,无需外部脚本。以下是适配你需求的完整方案:

核心思路

  1. 自动扫描所有defconfig文件,生成对应的编译目标
  2. 为每个配置创建独立的构建流程:生成.config → 编译 → 产物归档
  3. 确保串行执行(避免.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 05:55:47