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

Uploaded Python 3

File details

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

File metadata

  • Download URL: abi_forge-1.0.5.tar.gz
  • Upload date:
  • Size: 164.7 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.5.tar.gz
Algorithm Hash digest
SHA256 c5b816c09c9eb66c8c02e4c52be6305d9145e989ae5027aa82b4a8f68007fb40
MD5 7d2fe286a9a4e0dd26066e774222258e
BLAKE2b-256 efcf271a8d58c37fb75abd24ceba2c29b599768c4091d04054e17cfb8dfe4c17

See more details on using hashes here.

File details

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

File metadata

  • Download URL: abi_forge-1.0.5-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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 eae39c282145625df6ef518f71e27787fb0b8ff5e42278c70d9712142f3a22b4
MD5 61a4785829d6f50673468f399b974c77
BLAKE2b-256 e523f9306db88fe514532324a4ce015e2b68a019865822e86195b0d57efb345a

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