🚀 Nimmake for RISC-V — 让 RISC-V 固件构建像写 Python 一样简单
告别手写复杂的 Makefile,用 Python 优雅地管理 RISC-V 嵌入式项目。
Nimmake 是一款专为嵌入式开发打造的轻量级跨平台构建工具原生支持 RISC-V 和 ARM 架构。基于 Python 驱动动,内置丰富的 MCU 配置和工具链预设,让你从繁琐的编译脚本中解放出来。
🎯 为什么 RISC-V 开发需要 Nimmake?
RISC-V 生态正在飞速发展,但构建工具链却依然碎片化:
| 痛点 | Nimmake 的解决方案 |
|---|---|
RISC-V 编译参数冗长难记(-march/-mabi/-mcmodel) | 内置预设配置 — RISCV_32_IMAC_CFG 开箱即用 |
| 外设库集成需要手动添加大量源文件和头文件路径 | Party 模块系统 — 自动扫描源码,自动管理 -I 和 -D |
| 项目结构混乱,团队协作困难 | 声明式 Python 配置,清晰可维护 |
—## 🔥 核心特性:⚡ 内置 RISC-V 预设配置设配置
Nimmake 内置了完整的 RISC-V 覆盖 32 位与 64 位架构:架构:
| 配置 | CPU | ABI | 适用场景 | ------------------- | ---------- | ------- | ----------------------- |
| RISCV_32_IMAC_CFG | rv32imac | ilp32 | CH32V 系列、GD32VF 系列 |列 |
| RISCV_64_GC_CFG | rv64gc | lp64d高性能 RISC-V 64 位芯片,仅需一行代码即可加载:加载:
from nimmake.datasets import RISCV_32_IMAC_CFG
CFG = RISCV_32_IMAC_CFG.clone()
CFG.set("cpu", "rv32imac_zicsr_zifencei") # 自定义扩展
hlp.Config(CFG)
自动生成的编译标志示例:
`-mabi=ilp32 -march=rv32imac_zicsr_zifencei -mcmodel=medany -O2 -Wal### 🧩 Party 模块系统 — 告别手动源码管理管理源码
将代码组织为逻辑模块(Party),Nimmake 自动处理:
- 源码扫描 — 自动递归扫描目录下的
.c/.S文件 - 头文件路径 — 自动添加
-I包含路径 - 宏定义 — 自动注入
-D宏定义 - 依赖管理 — 模块间依赖关系自动排序
# 定义代码模块
core = hlp.Parties("CORE", "Core", params=PARTY_PARAM)
driver = hlp.Parties("Driver", "Peripheral",
defines={"CH32V20x_D6": ""},
params=PARTY_PARAM,
)
user = hlp.Parties("USER", "User", params=PARTY_PARAM)
# 声明依赖关系(自动处理编译顺序)
core.DependOn([driver, user])
driver.DependOn([core, useuser.DependOn([core, driver])
🔧 多工具链无缝切换,多种编译器自由切换:随意切换:
# RISC-V GCC
ToolChain_riscv = {
"TOOLPATH": r"D:\LLVM\xpack-riscv-none-elf-gcc-15\bin",
"TOOL": "gcc",
"TOOL_PREFIX": "riscv-none-elf-",
}
# 也可以切换到 LLVM/Clang 或 ARM GCC
ToolChain_clang = {
"TOOLPATH": r"D:\LLVM\ETArm\bin",
"TOOL": "clang",
"TOOL_PREFIX": "",
}
hlp.Update(ToolChain_riscv)
hlp.Refresh()
⚡ 极速构建体验
- 增量编译 — 只编译变大幅减少等待
- 多进程并行程并行** —
-j参数充分利用多核 - 构建缓存 —
--ca让二次构建速度快到飞起建快到飞起 - Ninja 后端 —
-n模式获得极致速度 - Dry-Run 模式 —
--dry-run预览构## 📦 快速上手:CH32V20x RISC-V 实战:沁恒 CH32V20x(RISC-V)完整构建外设库与应用程序: 应用程序:
1️⃣ 项目结构
project/
├── Nimmake.py # 构建脚本(替代 Makefile)
├── Core/ # 核心代码
│ ├── core_riscv.c
│ └── core_riscv.h
├── Debug/ # 调试模块
│ ├── debug.c
│ └── debug.h
├── Peripheral/ # 外设驱动库
│ ├── inc/ # 头文件
│ └── src/ # 源文件(自动扫描)
├── Startup/ # 启动文件
│ └── startup_ch32v20x_D6.s
├── User/ # 用户应用
│ ├── main.c
│ ├── system_ch32v20x.c
│ └── ch32v20x_it.c
└── Ld/
└── Link.ld # 链接脚本
2️⃣ 编写 Nimmake.py
from nimmake.datasets import RISCV_32_IMAC_CFG
from nimmake.Helper import Helper
# 工具链路径
toolpath_riscv = r"D:\LLVM\xpack-riscv-none-elf-gcc-15\bin"
toolchain = {
"TOOLPATH": toolpath_riscv,
"TOOL": "gcc",
"TOOL_PREFIX": "riscv-none-elf-",
}
hlp = Helper()
# 1. 芯片配置
CFG = RISCV_32_IMAC_CFG.clone()
CFG.set("cpu", "rv32imac_zicsr_zifencei")
hlp.Config(CFG)
hlp.set_cfg("linkscript", "LD/Link.ld")
# 2. 工具链配置
hlp.Update(toolchain)
hlp.Refresh()
# 3. Party 模块定义
PARTY_PARAM = {
"CPU": hlp._cfg.cpu,
"ABI": hlp._cfg.abi,
"FPU": hlp._cfg.fpu,
"MODEL": hlp._cfg.model,
}
core = hlp.Parties("CORE", "Core", params=PARTY_PARAM)
debug = hlp.Parties("DEBUG", "Debug", params=PARTY_PARAM)
user = hlp.Parties("USER", "User", params=PARTY_PARAM)
driver = hlp.Parties("Driver", "Peripheral",
defines={"CH32V20x_D6": ""},
params=PARTY_PARAM,
)
# 4. 依赖关系
core.DependOn([driver, debug, user])
driver.DependOn([core, user])
# 5. 构建目标
lib = hlp.Library_STATIC("driver") # 静态库
hlp.DefaultTarget(lib)
3️⃣ 一键构建
# 安装
pip install nimmake
# 构建
cd project/
nimmake
# 预览编译命令
nimmake --dry-ru## 🌟 实际编译命令对比数,容易出错。
### Nimmake 自动生成
编译 C 文件
riscv-none-elf-gcc -c -mabi=ilp32 -mcmodel=medany
-march=rv32imac_zicsr_zifencei -O2 -Wall -g
-fdata-sections -ffunction-sections -std=gnu99
-DCH32V20x_D6
-IDebug -IPeripheral/inc -IUser -ICore
Core/core_riscv.c -o BUILD/OBJ/CORE/core_riscv.o
编译汇编启动文件
riscv-none-elf-gcc -c -mabi=ilp32 -march=rv32imac_zicsr_zifencei
Startup/startup_ch32v20x_D6.s -o BUILD/OBJ/_DEFAULT/startup_ch32v20x_D6.o
链接
riscv-none-elf-gcc -mabi=ilp32 -march=rv32imac_zicsr_zifencei
-nostartfiles “-Wl,–gc-sections” “-TLd/Link.ld”
-lm -lc -lgccBUILD/OBJ/CORE/core_riscv.o BUILD/OBJ/DEBUG/debug.o BUILD/OBJ/USER/main.o BUILD/OBJ/DRIVER/.oVER/.o
-o BUILD/test.el
Nimmake 自动处理了所有 -march、-mabi、-mcmodel、-I、-D你仅需关注业务代码!关注业务代码!
📊 与其他构建工具对比
| 特性 | Nimmake | Makefile | CMake | GN |
|---|---|---|---|---|
| RISC-V 预设配置 | ✅ 内置 | ❌ 手写 | ❌ 手写 | ❌ 手写 |
| Party 模块系统 | ✅ 声明式 | ❌ 繁琐 | ⚠️ 复杂 | ⚠️ 复杂 |
| 增量编译 | ✅ 内置 | ⚠️ 需配置 | ✅ 内置 | ✅ 内置 |
| 多工具链切换 | ✅ 一键切换 | ❌ 手写 | ✅ 内置 | ❌ 需适配 |
| 学习成本 | 🔥 低(Python) | ❌ 高 | ⚠️ 中 | ⚠️ 中 |
| 内建 FreeRTOS/LVGL 等 | ✅ 即插即用 | ❌ 需手动 | ❌ 需手动 | ❌ 需手动 |
🎯 适用场景
| 场景 | 说明 |
|---|---|
| 🏭 RISC-V MCU 量产项目 | CH32V、GD32VF、ESP32-C 等系列 |
| 🔬 RISC-V 研究/教学 | 快速搭建实验环境,专注于算法和架构 |
| 🚀 快速原型验证 | 从零搭建编译环境只需几分钟 |
| 👥 团队协作 | 统一构建系统,消除环境差异 |
| 🔄 CI/CD 集成 | 纯命令行驱动,轻松集成流水线 |
📦 安装与资源
# 安装
pip install nimmake
# 验证
nimmake --version
# 查看 RISC-V 示例
git clone https://github.com/pophu/nimmake.git
cd nimmake/samples/07_riscv32
nimmake
| 资源 | 链接 |
|---|---|
| GitHub 仓库 | https://github.com/pophu/nimmake |
| PyPI | pip install nimmake |
| 问题反馈 | https://github.com/pophu/nimmake/issues |
💬 结语
构建工具,专为 RISC-V 开发而生RISC-V 开发)而生的构建工具。如果你还在不妨试试 Nimmake。ile,不妨试试 Nimmake。用 Python 的优雅,驾驭 RISC-V 的强大。
立即体验:
pip install nimmake && nimmake --help
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/ebiobiz/article/details/165584864




