Generate MoonBit native C FFI declarations from C headers with Clang.
C header + config-v1
│
▼
Clang 23 JSON AST ──► provenance-aware declaration model
│
typedef/enum/opaque-type environment
│
▼
conservative ABI lowering
│
┌─────────────┴─────────────┐
▼ ▼
bindings.mbt moonbindgen-report-v2moon add shop1111/moonbindgen@0.1.0import {
"shop1111/moonbindgen" @bindgen,
}let config_text =
#|{"schema":"moonbindgen-config-v1","unsupported_policy":"report"}
let config = @bindgen.parse_config(config_text)
let result = @bindgen.generate_with_config(clang_ast_json, "library.h", config)
println(result.bindings)moon run -q cmd/main -- generate fixtures/basic.h --out _build/basic --clang 'C:\Program Files\LLVM\bin\clang.exe'
moon run -q cmd/main -- generate fixtures/basic.h --out _build/basic --clang 'C:\Program Files\LLVM\bin\clang.exe' --check{
"schema": "moonbindgen-config-v1",
"include_functions": ["library_open"],
"exclude_functions": [],
"renames": { "library_open": "open_library" },
"type_overrides": { "library_size_t": "UInt64" },
"utf8_inputs": ["library_open.path"],
"unsupported_policy": "error"
}| C declaration | MoonBit output | Policy |
|---|---|---|
| char, signed/unsigned fixed mappings | Byte, Int, UInt, Int64, UInt64 | Direct value ABI |
| float, double | Float, Double | Direct value ABI |
| typedef chains and 32-bit enums | Canonical scalar / Int | Resolved from Clang facts |
| pointer to an opaque struct typedef | #external type | Raw pointer; caller owns lifetime rules |
| configured input const char * | Bytes plus #borrow | Valid only for the duration of the call |
| returned strings, output pointers, callbacks, variadics, by-value structs | none | Reported and skipped, or rejected in strict mode |
{
"schema": "moonbindgen-report-v2",
"clang": { "version": "clang version 23.1.1 ...", "target": "x86_64-pc-windows-msvc" },
"summary": { "functions_generated": 4, "functions_skipped": 0, "unsupported": 0 },
"declarations": [{ "c_name": "abi_add", "status": "generated", "reason_code": "generated" }]
}./scripts/verify.ps1moon run -q examples/sqlite
# SELECT 42 => 42#deprecated("`ConfigError::equal` is deprecated, use `Eq::equal` instead.")
fn ConfigError::equal(ConfigError, ConfigError) -> Bool#deprecated("`ConfigError::not_equal` is deprecated, use `Eq::not_equal` instead.")
fn ConfigError::not_equal(x : ConfigError, y : ConfigError) -> Bool#deprecated("`ConfigError::to_repr` is deprecated, use `@moonbitlang/core/debug.Debug::to_repr` instead.")
fn ConfigError::to_repr(ConfigError) -> Reprpub struct GenerateResult {
bindings : String
report : String
generated : Int
skipped : Int
}pub struct ToolMetadata {
clang_version : String
clang_target : String
}#deprecated("`UnsupportedPolicy::equal` is deprecated, use `Eq::equal` instead.")
fn UnsupportedPolicy::equal(UnsupportedPolicy, UnsupportedPolicy) -> Bool#deprecated("`UnsupportedPolicy::not_equal` is deprecated, use `Eq::not_equal` instead.")
fn UnsupportedPolicy::not_equal(x : UnsupportedPolicy, y : UnsupportedPolicy) -> Bool#deprecated("`UnsupportedPolicy::to_repr` is deprecated, use `@moonbitlang/core/debug.Debug::to_repr` instead.")
fn UnsupportedPolicy::to_repr(UnsupportedPolicy) -> Reprfn generate_with_config(ast_text : String, header : String, config : GenerateConfig) -> GenerateResult raisefn generate_with_metadata(ast_text : String, header : String, config : GenerateConfig, metadata : ToolMetadata) -> GenerateResult raiseInstall
Download zipGenerate MoonBit native C FFI declarations from C headers with Clang.