1 unstable release
0.26.1 | Jan 18, 2024 |
---|
#152 in FFI
470KB
12K
SLoC
DISCLAIMER THIS IS NOT THE OFFICIAL CBINDGEN CRATE
This is a last ditch effort to have a version of cbindgen with a fix required for our project while waiting on a merge in the official repository.
We are merely cloning the official cbindgen repo found here: https://github.com/mozilla/cbindgen
We added a small patch we need to fix our C API generation in a setting where a dependency has the same name as our main crate. The metadata parsing will randomly select the wrong crate to expand/parse as the cargo metadata is likely loaded in a HashMap like struct, this branch has a fix just for that.
cbindgen
cbindgen creates C/C++11 headers for Rust libraries which expose a public C API.
While you could do this by hand, it's not a particularly good use of your time. It's also much more likely to be error-prone than machine-generated headers that are based on your actual Rust code. The cbindgen developers have also worked closely with the developers of Rust to ensure that the headers we generate reflect actual guarantees about Rust's type layout and ABI.
C++ headers are nice because we can use operator overloads, constructors, enum classes, and templates to make the API more ergonomic and Rust-like. C headers are nice because you can be more confident that whoever you're interoperating with can handle them. With cbindgen you don't need to choose! You can just tell it to emit both from the same Rust library.
There are two ways to use cbindgen: as a standalone program, or as a library (presumably in your build.rs). There isn't really much practical difference, because cbindgen is a simple rust library with no interesting dependencies.
Using it as a program means people building your software will need it installed. Using it in your library means people may have to build cbindgen more frequently (e.g. every time they update their rust compiler).
It's worth noting that the development of cbindgen has been largely adhoc, as features have been added to support the usecases of the maintainers. This means cbindgen may randomly fail to support some particular situation simply because no one has put in the effort to handle it yet. Please file an issue if you run into such a situation. Although since we all have other jobs, you might need to do the implementation work too :)
Quick Start
To install cbindgen, you just need to run
cargo install --force cbindgen
(--force just makes it update to the latest cbindgen if it's already installed)
Or with Homebrew, run
brew install cbindgen
To use cbindgen you need two things:
- A configuration (cbindgen.toml, which can be empty to start)
- A Rust crate with a public C API
Then all you need to do is run it:
cbindgen --config cbindgen.toml --crate my_rust_library --output my_header.h
This produces a header file for C++. For C, add the --lang c
switch.
See cbindgen --help
for more options.
Get a template cbindgen.toml here.
Examples
We don't currently have a nice tailored example application, but the tests contain plenty of interesting examples of our features.
You may also find it interesting to browse the projects that are using cbindgen in production:
If you're using cbindgen
and would like to be added to this list, please open
a pull request!
Releases
cbindgen doesn't have a fixed release calendar, please file an issue requesting
a release if there's something fixed in trunk that you need released. Ping
@emilio
for increased effect.
Dependencies
~4–13MB
~172K SLoC