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.3.tar.gz (123.2 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.3-py3-none-any.whl (127.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: abi_forge-1.0.3.tar.gz
  • Upload date:
  • Size: 123.2 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.3.tar.gz
Algorithm Hash digest
SHA256 a95e0bcd091bca104e256b2e1e04787422f6bb9c2ddb7a6bbf729e8cc66125bf
MD5 3ebb34802338acdd3f78d3f61ee528c5
BLAKE2b-256 f603877085af24163b3392820082aae86fe618b1646509e2f934eca75b4564f2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: abi_forge-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 127.9 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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 96a5af60abc4c245f62413584a94a5cc543078b42b8215d28bd9edda338b775c
MD5 78fb78d4e8e3af447b0cc5400ef805c9
BLAKE2b-256 899fc0fc1d494f15412f2ed9130b39926896367f05971fb30bf7fb3561c196af

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