关于 make-moonbit-c-bindings
make-moonbit-c-bindings 是用于端到端构建 MoonBit C 绑定的开发技能,面向封装 C/C++ 库的开发者,强调安全 API 设计、FFI 边界和可重复验证。
主要功能
- 01检查上游头文件与 ABI 类型
- 02设计安全的 MoonBit API
- 03生成 C 包装层与私有 FFI
- 04供应源码并生成配置头文件
- 05运行格式、测试与 ASan 验证
适用场景
- 01为 C 库创建 MoonBit 绑定
- 02将 C 内存所有权纳入包装层处理
- 03为原生目标配置可重复源码供应
- 04验证绑定的类型、测试与文档
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ moonbitlang/ skills --skill make-moonbit-c-bindings安装后在 Claude Code 中输入/make-moonbit-c-bindings确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/lifecycle-and-ownership.mdtesting-and-documentation.mdvendoring-and-package-setup.mdtemplates/api.mbtffi.mbtmoon.mod.jsonmoon.pkgprepare.pyREADME.mbt.mdwrapper.c详细介绍
构建 MoonBit C 绑定
将此技能用于端到端绑定项目。实现之前,还要阅读 moonbit-c-binding,了解底层 FFI 语法、所有权注解以及 moonbit.h 的详细信息。
快速开始
- 在临时目录中克隆或检查上游 C/C++ 项目。
- 找出公共头文件、生成的配置头文件、源代码布局、分配器 API 以及构建时的类型宽度。
- 确定安全的 MoonBit API 范围;不要机械地暴露每个 C API。
- 使用
templates/prepare.py将源代码纳入项目;只有在明确需要时,才链接系统库。 - 编写精简的 C 封装、私有 MoonBit extern 以及安全的公共 MoonBit 封装。
- 使用
moon check、原生测试、ASan、moon info和 vendoring 脚本幂等性检查进行验证。
绑定架构
优先采用以下布局,并根据库调整名称。请从捆绑模板开始,而不是从头重写脚手架:
scripts/prepare.py # optional: pinned upstream download + generated stubs
moon.mod.json # preferred/supported native targets
src/moon.pkg # native-stub list and file target gates
src/wrapper.c # ABI normalization and ownership boundaries
src/ffi.mbt # private extern "c" declarations
src/<domain>.mbt # safe public MoonBit API
src/<domain>_test.mbt # regression tests
src/README.mbt.md # tested documentation examples
README.md -> src/README.mbt.md
模板映射:
templates/prepare.py->scripts/prepare.pytemplates/moon.mod.json->moon.mod.jsontemplates/moon.pkg->src/moon.pkgtemplates/wrapper.c->src/wrapper.ctemplates/ffi.mbt->src/ffi.mbttemplates/api.mbt->src/<domain>.mbttemplates/README.mbt.md->src/README.mbt.md
进行 ASan 验证时,将配套运行器从 moonbit-c-binding/scripts/run-asan.py 复制或调用为 scripts/run-asan.py;除非该运行器无法适配项目,否则不要另行编写 ASan 补丁脚本。
工作流
1. 调查上游项目
- 先阅读公共头文件;它们定义了绑定契约。
- 记录项目专用 typedef 的配置宽度:索引类型、标量类型、大小/计数类型、句柄类型、枚举底层类型以及回调。
- 将库 API 与仅供 CLI 使用的 API、内部代码、生成代码或测试代码区分开。
- 查找会分配内存、修改输入、存储回调或需要配对调用
destroy/free的函数。
2. 设计 MoonBit API
- 尽可能公开与当前 C 库相匹配的领域专用 MoonBit 类型,而不是裸指针和数组。
- 在进入 C 之前验证形状和选项长度。
- 如果安全封装无法保证其语义,就省略不安全或容易误导的 C 特性。
- 将 C 状态码映射为 MoonBit 错误;对于输出参数,返回结构化结果记录。
3. 纳入源代码或链接库
- 对于可移植的包,将 C 源代码纳入
native-stub,并固定修订版本、提供可重复运行的脚本。 - 如果 MoonBit 要求存根位于单个包目录中,就将源文件拍平,并以确定性方式重写 include。
- 生成配置头文件,而不是依赖临时编译器标志。
- 确保 vendoring 脚本可重复运行,且不会产生受跟踪文件的差异。
4. 构建 FFI 边界
- C 封装负责 ABI 规范化:类型宽度断言、可选指针转换、输出复制以及释放由 C 分配的内存。
ffi.mbt应将 extern 保持为私有,并明确使用#borrow/#owned。- 公共 MoonBit 文件应只调用安全的封装函数,绝不直接调用原始 C API。
- 避免为可选数组增加额外的布尔哨兵参数;优先使用空的 MoonBit 数组,并在 C 中检查
Moonbit_array_length。
5. 验证
至少运行:
moon fmt
moon check --target all --warn-list +73
moon test --target native
python3 scripts/run-asan.py
moon info --target native
python3 scripts/prepare.py
git status --short
对于仅支持原生平台的包,在 moon.mod.json 中设置 "preferred-target": "native",并将 "supported-targets" 设为最小且真实可用的值。
必需参考资料
评论
支持 Markdown