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}
- 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
- make sure
zig
in your PATH, you will need the version0.13
and up - build the project and copy the
c2z
executable fromzig-out
to your desired location - or just run the project using
zig build run -- ARGS
zig build run -- lib.h
orc2z lib.h
- pass any clang argument like include and defines e.g.
zig build run -- -DNDEBUG -I.\include -target x86-linux -- .\include\lib.h
- modify the generated bindings until it works ;) you might need to import
cpp.zig
it is located in the src folder
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, useReleaseFast
or at least-O1
, you might also wan't to find a way of define_ITERATOR_DEBUG_LEVEL
to something different than2
.
-
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
andParamCommandComment
inFullComment
-
(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
- fpng (99.99 %)
- xatlas (86.40 %)
- imgui (67.21 %)
- msdfgen (~80% ish)
- box2d
- basis_universal
- JoltPhysics
- astc-encoder
- SDL2
- stbi
- raylib
- meshoptimizer
- tinyexr
- minimp3