Chromium で cxx を使用する

Chromium では、Rust を使用するリーフノードごとに独立した #[cxx::bridge] mod を定義します。通常は、rust_static_library ごとに 1 つずつになります。

cxx_bindings = [ "my_rust_file.rs" ]
   # すべてのソースファイルではなく、#[cxx::bridge] を含むファイルのリスト
allow_unsafe = true

上記のコードを、crate_rootsourcesと並んで、既存の rust_static_library ターゲットに追加するだけです。

C++ ヘッダーは適切な場所で生成されるため、次のようにインクルードできます。

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

//base には、Chromium C++ 型から CXX Rust 型(およびその逆方向)への変換を行うためのユーティリティ関数がいくつかあります(例: SpanToRustSlice)。

受講者から、allow_unsafe = true がなぜここでも必要なのかを尋ねられる可能性があります。

大まかに答えると、C/C++ コードは通常の Rust 標準では「安全」ではありません。Rust から C/C++ に行ったり来たりすると、メモリに対して任意の処理が行われ、Rust 独自のデータ レイアウトの安全性が損なわれる可能性があります。C/C++ の相互運用で unsafe キーワードが多すぎると、unsafeに対する注目度が薄れるので、これには 賛否両論があります。ただし厳密には、外部コードを Rust バイナリに取り込むと、Rust の観点からは想定していない動作が発生する可能性があります。

具体的な答えは、このページ の上部の図にあります。裏では、CXX は Rust の unsafe 関数と extern "C" 関数を生成します。これは前のセクションで手動で行ったのとまったく同じです。