lassade / c2z

C++ to Zig bindings and transpiler

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

inspeired by this article uses zig to create zig bindgens for c++

zig cc -x c++ -std=c++11 -Xclang -ast-dump=json {input_file}

Notes

  • Glue is invitable ... snap ... and needed to make the bindings cross platform
  • Transpiled code can leak memory (implicit destructors aren't called)
  • Manual adjustments are required, specially to make bindings idiomatic and easer to read
  • Meant to work with libraries that follow the C with classes coding style
  • No Zig side inheritance, instead create bindings of a C++ implementation

Usage

Setup

  1. make sure zig in your PATH, you will need the version 0.12.0-dev.1817+f88b52306
  2. build the project and copy the c2z executable from zig-out to your desired location
  3. or just run the project using zig build run -- ARGS

Running it

  1. zig build run -- lib.h or c2z lib.h
  2. pass any clang argument like include and defines e.g. zig build run -- -DNDEBUG -I.\include -target x86-linux -- .\include\lib.h
  3. modify the generated bindings until it works ;) you might need to import cpp.zig it is located in the src folder

Misc

  • msvc has a second tier support, just pass it as target tuple like as: -no-glue -target x86_64-windows-msvc to generate a target specifc binding for it. Debug builds aren't fully supported, use ReleaseFast or at least -O1, you might also wan't to find a way of define _ITERATOR_DEBUG_LEVEL to something different than 2.

Todo

  • transpile inline or constexpr constructors when the class isn't polymorphic

  • use function pointers to handle varidact functions

  • (hard) #include -> @import

  • (easy) walk a directory tree

  • transpile vector of vectors

  • (easy) better input file not found error

  • (easy) verbose option

  • (easy) handle BlockCommandComment and ParamCommandComment in FullComment

  • (easy) resolve return of function with a aliased return type

  • (easy) fail when clang ast-bump has failed, because missing headers or wrong code

  • (hard) if (*data++ == v) { ... } should generate { const __tmp0 = data; data += 1; if (__tmp0.* == v) { ... } }

  • (hard) solve UnresolvedMemberExpr, maybe when integrating clang ast directly

  • (hard) solve implicit destructors calls

  • (easy) handle private members, class is default private, struct default public, in code is referenced as self.public

  • (hard) handle varidact functions myFunction(va_args) -> myFunction(args: [*c]u8) and myFunction__VA(...)

  • (hard) apply keywordFix

  • use @compileError for objects that couldn't be transpiled

  • write layout tests

Test cases

C++ libs

  • fpng (99.99 %)
  • xatlas (86.40 %)
  • imgui (67.21 %)
  • msdfgen (~80% ish)
  • box2d
  • basis_universal
  • JoltPhysics
  • astc-encoder

C libs (or with builtin C bindings)

  • SDL2
  • stbi
  • raylib
  • meshoptimizer
  • tinyexr
  • minimp3

About

C++ to Zig bindings and transpiler


Languages

Language:C++ 47.2%Language:C 31.1%Language:POV-Ray SDL 14.7%Language:Zig 6.0%Language:Objective-C++ 0.8%Language:Objective-C 0.2%