Skip to main content

ABI governance and polyglot binding generator for C shared libraries

Project description

abi-forge

Reusable ABI governance and polyglot binding generator for C shared libraries.

From a single C header, abi-forge produces a versioned IDL snapshot and generates bindings for every language you need — with built-in breakage detection and governance.

What it does

Stage What happens
Parse Clang-preprocesses your C header into a stable IDL JSON snapshot
Govern Diffs every new snapshot against the baseline; flags removals, signature changes, enum shifts as typed errors (ABI001–ABI007, SARIF-compatible)
Generate Runs your chosen language generators from the IDL: C#, Python, Rust, TypeScript, Go
Enforce CI fails on ABI regressions; waivers require explicit approval with TTL

Language targets

Language Output Mechanism
C# (.NET) P/Invoke + SafeHandle wrappers + async layer Roslyn source generator (generator_sdk/csharp/)
Python ctypes module with IntEnum, OOP handles, CFUNCTYPE generator_sdk/python_bindings_generator.py
Rust #[repr(C)] enums + extern "C" block generator_sdk/rust_ffi_generator.py
TypeScript ffi-napi + OOP wrappers with [Symbol.dispose] generator_sdk/typescript_bindings_generator.py
Go cgo package with struct wrappers and runtime.SetFinalizer generator_sdk/go_bindings_generator.py

Real-world example

LumenRTC — a .NET wrapper over libwebrtc — uses abi-forge to govern its C ABI and generate all language bindings from a single IDL snapshot. See abi/config.json there for a complete production configuration.

Quick start

Requirements

  • Python 3.10+
  • clang (for header parsing)
  • .NET SDK 10+ (optional, only for C# bindings)

Bootstrap a new target

# Add abi-forge as a submodule
git submodule add https://github.com/vitkuz573/abi-forge.git tools/abi_framework

# Bootstrap: scaffolds abi/config.json + initial metadata
python3 tools/abi_framework/abi_framework.py bootstrap \
  --target mylib \
  --header path/to/mylib.h \
  --namespace MyLib \
  --generate-python \
  --generate-rust

# Parse header → IDL snapshot
python3 tools/abi_framework/abi_framework.py generate \
  --config abi/config.json --skip-binary

# Generate all bindings from IDL
python3 tools/abi_framework/abi_framework.py codegen \
  --config abi/config.json --skip-binary

# Lock current IDL as baseline (first time)
python3 tools/abi_framework/abi_framework.py generate-baseline --target mylib

ABI governance in CI

# Fail on regressions
python3 tools/abi_framework/abi_framework.py check \
  --config abi/config.json --skip-binary

# Full SARIF report for GitHub code scanning
python3 tools/abi_framework/abi_framework.py check-all \
  --config abi/config.json --skip-binary --sarif-out abi-report.sarif

Health dashboard

python3 tools/abi_framework/abi_framework.py status --config abi/config.json

Repository structure

abi-forge/
├── abi_framework.py            # CLI entry point
├── src/abi_framework_core/     # core: parse, diff, snapshot, policy, orchestration
│   └── commands/               # subcommands: generate, codegen, check, release, status, …
├── generator_sdk/              # language generators (Python, Rust, TypeScript, Go, C#-scaffold)
│   └── plugin.manifest.json    # plugin declarations for all built-in generators
├── abi_codegen_core/           # shared codegen primitives (native exports, required functions)
├── abi_roslyn_codegen/         # Roslyn source generator for C# P/Invoke + managed API
├── tests/                      # 99 tests covering orchestration, generators, governance
└── schemas/                    # JSON schemas for IDL, config, managed_api

Config overview (abi/config.json)

{
  "targets": {
    "mylib": {
      "header": {
        "path": "include/mylib.h",
        "symbol_prefix": "mylib_",
        "api_macro": "MYLIB_API"
      },
      "codegen": {
        "idl_output": "abi/generated/mylib/mylib.idl.json"
      },
      "baseline_path": "abi/baselines/mylib.json",
      "bindings": {
        "generators": [
          {
            "manifest": "{repo_root}/tools/abi_framework/generator_sdk/plugin.manifest.json",
            "plugins": [
              "abi_framework.python_bindings",
              "abi_framework.rust_ffi",
              "abi_framework.typescript_bindings",
              "abi_framework.go_bindings"
            ]
          }
        ]
      }
    }
  }
}

ABI error types (SARIF rules)

Rule Meaning
ABI001 Function removed from public API
ABI002 Function signature changed
ABI003 Enum value added, removed, or renumbered
ABI004 Struct layout changed
ABI005 Bindings metadata mismatch
ABI006 Version policy violation
ABI007 Warning (non-breaking)

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

abi_forge-1.0.0.tar.gz (123.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

abi_forge-1.0.0-py3-none-any.whl (127.7 kB view details)

Uploaded Python 3

File details

Details for the file abi_forge-1.0.0.tar.gz.

File metadata

  • Download URL: abi_forge-1.0.0.tar.gz
  • Upload date:
  • Size: 123.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for abi_forge-1.0.0.tar.gz
Algorithm Hash digest
SHA256 8bc31b6004bba2c098c897ea607bc18bb56a084fade62a26cafa7361cfc32070
MD5 bd1eb3418d94dfe2172e3578cc858be9
BLAKE2b-256 37420923e3afe4a6e2424708b71662a653602adbfa00475cad640942d7d78c8b

See more details on using hashes here.

File details

Details for the file abi_forge-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: abi_forge-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 127.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for abi_forge-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a552f790ff3acfcdc0abaf86936fceee8c4cf7b89a17f7630d127ff687a236a1
MD5 bcb7d613d7b73f31e49cf70dfa371a11
BLAKE2b-256 772366b763e03699f1fec88fccb93422ad25256196692479d965ba91cd608ee1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page