In Chromium, we define an independent
#[cxx::bridge] mod for each leaf-node
where we want to use Rust. You’d typically have one for each
rust_static_library. Just add
cxx_bindings = [ "my_rust_file.rs" ]
# list of files containing #[cxx::bridge], not all source files
allow_unsafe = true
to your existing
rust_static_library target alongside
C++ headers will be generated at a sensible location, so you can just
You will find some utility functions in
//base to convert to/from Chromium C++
types to CXX Rust types — for example
Students may ask — why do we still need
allow_unsafe = true?
The broad answer is that no C/C++ code is “safe” by the normal Rust standards.
Calling back and forth to C/C++ from Rust may do arbitrary things to memory, and
compromise the safety of Rust’s own data layouts. Presence of too many
unsafe keywords in C/C++ interop can harm the signal-to-noise ratio of such a
keyword, and is controversial, but strictly, bringing any foreign code into
a Rust binary can cause unexpected behavior from Rust’s perspective.
The narrow answer lies in the diagram at the top of this page — behind
the scenes, CXX generates Rust
extern "C" functions just like we
did manually in the previous section.