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.4.tar.gz (164.8 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.4-py3-none-any.whl (173.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: abi_forge-1.0.4.tar.gz
  • Upload date:
  • Size: 164.8 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.4.tar.gz
Algorithm Hash digest
SHA256 af85ad41d84bd34c3f376764a118da6d1c702e3a9c135c052c38ba59ae546559
MD5 05ad9f73cbf6d64d979c7643c0bbd451
BLAKE2b-256 bfb53cce6a020ee6dd5e804e495e2d0c1a540689cd4deff34b0750df12cc030c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: abi_forge-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 173.2 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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 81d6d952f961871cdf0e2b87c54522eba0b25aaedba6f78486d66b49c00c8630
MD5 c44d486c34c120084d25dd04bb0169d8
BLAKE2b-256 f942ec4acd19ac049c883030fe96721a25a8cc6e4a8bafa3a6e551ef882110ac

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