Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/lassade/c2z
C++ to Zig bindings and transpiler
https://github.com/lassade/c2z
Last synced: 29 days ago
JSON representation
C++ to Zig bindings and transpiler
- Host: GitHub
- URL: https://github.com/lassade/c2z
- Owner: lassade
- Created: 2023-06-08T00:40:02.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-10-17T11:49:19.000Z (about 2 months ago)
- Last Synced: 2024-10-19T15:40:08.103Z (about 2 months ago)
- Language: C++
- Size: 3.54 MB
- Stars: 100
- Watchers: 3
- Forks: 7
- Open Issues: 9
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
- awesome-zig - lassade/c2z
README
inspeired by this [article](https://floooh.github.io/2020/08/23/sokol-bindgen.html) 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.13` and up
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`
4. 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