EBuild (Embedded Build System) 是一个基于 SCons 的统一嵌入式构建框架,为嵌入式项目提供配置管理、工具链配置、组件注册和工程导出等一站式解决方案。
- 统一构建入口 - 通过
PrepareBuilding/DoBuilding简化构建流程 - 灵活配置管理 - 支持 menuconfig 图形配置和 attachconfig 快速配置方案
- 智能工具链检测 - 自动从
~/.env或项目配置检测 GCC 工具链路径 - 组件化构建 - 支持
DefineGroup和package.json两种组件组织方式 - 多 IDE 支持 - 可导出 VS Code、CMake、Keil MDK 工程文件
- 条件编译 - 基于配置项的依赖检查和条件编译支持
在项目根目录的 SConstruct 中:
from ebuild import PrepareBuilding, DoBuilding
# 准备构建环境
env = Environment()
build = PrepareBuilding(env, proj_config=proj_config)
# 注册组件(在 SConscript 中)
# env.DefineGroup('my_component', ['src/*.c'], depend=['CONFIG_MY_FEATURE'])
# 执行构建
DoBuilding(env, 'target.elf')# 打开图形配置界面
scons --menuconfig
# 查看可用的 attachconfig 配置方案
scons --attach=?
# 应用某个配置方案
scons --attach=stm32f103-basic# 默认构建
scons
# 清理构建
scons -c
# 详细输出
scons --verbose# 导出 VS Code 工程
scons --target=vscode
# 导出 CMake 工程
scons --target=cmake
# 导出 Keil MDK 工程
scons --target=mdk5- proj_config.py - 项目配置,定义工具链、MCU 系列、工程名称等
- proj_config.h - 由 menuconfig 生成的 C 头文件,包含所有配置宏
- Kconfig - menuconfig 配置描述文件
ProjectRoot 指 SCons 的执行根目录(scons 或 scons -C dir 的 dir),上述配置文件与 .config、.ci/attachconfig 都应位于该目录下。
EBuild 提供两种组件组织方式:
# 在 SConscript 中
src = ['init.c', 'driver.c']
depend = ['CONFIG_USE_DRIVER']
CPPPATH = ['./include']
CPPDEFINES = ['DEBUG_MODE=1']
env.DefineGroup('my_component', src, depend=depend, CPPPATH=CPPPATH, CPPDEFINES=CPPDEFINES){
"type": "rt-thread-component",
"name": "my_component",
"dependencies": ["CONFIG_USE_DRIVER"],
"defines": ["DEBUG_MODE=1"],
"sources": [
{
"dependencies": [],
"includes": ["./include"],
"files": ["*.c"]
}
]
}EBuild 支持多种工具链配置方式:
- 自动检测 - 从
~/.env/tools/scripts/packages自动检测 - proj_config.py - 设置
EXEC_PATH和CC_PREFIX - 命令行参数 - 使用
--cross-compile、--cpu等
# proj_config.py 示例
TOOLCHAIN_CONFIG = {
'CC_PREFIX': 'arm-none-eabi-',
'EXEC_PATH': '/opt/gcc-arm-none-eabi/bin',
'MCU_SERIES': {
'CONFIG_STM32F103': {
'cpu': 'cortex-m3',
'link_script': 'linkstm32f103xe.ld'
}
},
'BUILD': 'release' # or 'debug'
}
# 可选:构建结束后执行的动作(如生成 bin)
POST_ACTION = "$OBJCOPY -O binary $TARGET build/stm32f103.bin"非 GCC 工具链可通过以下配置项定制命令行参数:
- DEVICE_FLAGS:编译器的设备参数(支持
{cpu}占位符) - AS_DEVICE_FLAGS:汇编器的设备参数(支持
{cpu}占位符) - LINK_DEVICE_FLAGS:链接器的设备参数(支持
{cpu}占位符) - LINK_SCRIPT_FLAG:链接脚本参数前缀(如
-T、--scatter)
| 选项 | 说明 |
|---|---|
--target=TYPE |
导出工程:mdk4/mdk5/cmake/vscode |
--menuconfig |
打开配置菜单 |
--attach=NAME |
应用 attachconfig 方案(? 查看列表,default 恢复) |
--verbose |
显示完整编译命令 |
--cross-compile=PREFIX |
交叉编译器前缀 |
| 架构 | 配置模块 |
|---|---|
| ARM | ebuild.configs.arm_gcc |
| ARM (Keil MDK, ARMCC) | ebuild.configs.armcc |
| ARM (Keil MDK, ARMCLANG) | ebuild.configs.armclang |
| AArch64 | ebuild.configs.aarch64_gcc |
| RISC-V | ebuild.configs.riscv_gcc |
| Linux | ebuild.configs.linux_gcc |
| Windows MSVC | ebuild.configs.msvc |
project/
├── .config # menuconfig 配置输出
├── proj_config.py # 项目配置
├── proj_config.h # 生成的配置头文件
├── Kconfig # 配置菜单定义
├── SConstruct # 主构建脚本
└── SConscript # 组件注册脚本
AttachConfig 允许预定义常用配置方案,快速切换:
# 查看可用方案
scons --attach=?
# 应用方案
scons --attach=nrf52832-peripheral
# 恢复默认配置
scons --attach=default# 仅当依赖满足时才编译该组件
env.DefineGroup('feature_x', ['feature_x.c'], depend=['CONFIG_FEATURE_X'])# 扫描并构建当前目录下的 package.json
env.BuildPackage('.')
# 构建指定路径的包
env.BuildPackage('path/to/package')# 自动扫描子目录并执行其中的 SConscript
groups = env.Bridge()PrepareBuilding(env, proj_config)- 初始化构建系统DoBuilding(env, target, objs)- 执行构建或导出
env.DefineGroup(name, src, depend, **kwargs)- 注册组件组env.BuildPackage(path)- 构建 package.json 组件env.Bridge()- 桥接子目录组件env.GetDepend(dep)- 检查配置依赖env.GlobFiles(pattern)- 获取文件列表env.SrcRemove(src, remove)- 从源文件列表中移除env.DoBuilding(target, objs)- 执行构建
# 安装 SCons
pip install scons
# 安装 kconfiglib(用于 menuconfig)
pip install kconfiglib
# 安装 PyYAML(用于 attachconfig)
pip install pyyaml本项目为内部构建工具,遵循项目许可证。