Chromium で cxx を使う

Chromium では、Rust を使いたい各リーフノードごとに、独立した #[cxx::bridge] mod を定義します。通常は、rust_static_library ごとに 1 つ用意します。次を追加します。

cxx_bindings = [ "my_rust_file.rs" ]
   # #[cxx::bridge] を含むファイルの一覧であり、すべてのソースファイルではありません
allow_unsafe = true

これを既存の rust_static_library ターゲットの crate_root および sources と並べて追加します。

C++ ヘッダーは適切な場所に生成されるので、単に次のようにできます。

#include "ui/base/my_rust_file.rs.h"

Chromium の C++ 型と CXX の Rust 型を相互に変換するためのユーティリティ関数が //base にいくつかあります。たとえば SpanToRustSlice です。

受講者からは次のような質問があるかもしれません — それでもなお allow_unsafe = true が必要なのはなぜでしょうか?

大まかな答えは、通常の Rust の基準では、どの C/C++ コードも「安全」ではないということです。 Rust から C/C++ を行き来しながら呼び出すと、メモリに対して任意のことを行う可能性があり、 Rust 自身のデータレイアウトの安全性を損なうおそれがあります。C/C++ 相互運用において 多すぎる unsafe キーワードが存在すると、そのようなキーワードのシグナル対ノイズ比を損なう可能性があり、 これは 議論のある点 ですが、厳密に言えば、Rust バイナリに外部コードを取り込むこと自体が、 Rust の観点からは予期しない動作を引き起こし得ます。

狭義の答えは このページ の先頭にある図にあります — 内部では、 CXX は前のセクションで手作業で行ったのと同じように、Rust の unsafe かつ extern "C" な関数を生成します。