/rust フォルダーに追加することです。これを行うには、空のRustプロジェクトを作成し、必要なライブラリを Cargo.toml に追加する必要があります。また、Cargo.toml に crate-type = ["staticlib"] を追加して、新しいライブラリが staticlib としてコンパイルされるよう設定する必要もあります。
次に、Corrosion ライブラリを使用して、そのライブラリを CMake にリンクする必要があります。まず、/rust フォルダー内の CMakeLists.txt にライブラリフォルダーを追加します。その後、ライブラリディレクトリに CMakeLists.txt ファイルを追加する必要があります。その中で、Corrosion の import 関数を呼び出します。BLAKE3 を import するには、次の行を使用しました。
_ch_rust_blake3 という名前は Cargo.toml に由来しており、そこではプロジェクト名 (name = "_ch_rust_blake3") として使われていることに注意してください。
Rust のデータ型は C/C++ のデータ型と互換性がないため、この空のライブラリプロジェクトを使って、C/C++ から受け取ったデータを変換し、ライブラリのメソッドを呼び出し、さらに出力データを逆変換するためのシムメソッドを作成します。たとえば、BLAKE3 では次のメソッドを実装しました。
fill() メソッドによるポインタへの直接書き込みをサポートしていたため、変換は不要でした。ここでの主なアドバイスは、メソッド数をできるだけ少なくすることです。そうすれば、各メソッド呼び出しで必要になる変換が減り、オーバーヘッドも抑えられます。
#[no_mangle] 属性と extern "C" は、この種のすべてのメソッドで必須である点にも注意してください。これらがないと、C/C++互換で正しくコンパイルできません。さらに、これらはインテグレーションの次のステップでも必要になります。
シムメソッドのコードを記述したら、次はライブラリ用のヘッダーファイルを準備する必要があります。これは手動で行うこともできますし、cbindgen ライブラリを使って自動生成することもできます。cbindgen を使用する場合は、build.rs のビルドスクリプトを作成し、cbindgen を build-dependency に追加する必要があります。
ヘッダーファイルを自動生成できるビルドスクリプトの例:
extern "C" を使用する必要があります。これがないと、ライブラリが正しくコンパイルされなかったり、cbindgen でヘッダーの自動生成を開始できなかったりします。
これらの手順をひととおり終えたら、小規模なプロジェクトでライブラリをテストし、互換性やヘッダー生成に関する問題がないか確認できます。ヘッダー生成中に問題が発生した場合は、cbindgen.toml ファイルで設定を調整してみてください (テンプレートはこちらです: https://github.com/eqrion/cbindgen/blob/master/template.toml) 。
BLAKE3 の統合時に発生した問題についても、触れておく必要があります。
MemorySanitizer は、Rust の一部の変数が初期化されているかどうかを判別できないため、誤検知を引き起こすことがあります。この問題は、一部の変数についてより明示的に定義した メソッド を記述することで解決されました。ただし、この メソッド の実装は低速であり、MemorySanitizer のビルドを修正するためにのみ使用されます。