Build rules exercise
Chromium のビルドで、以下を含む新しい Rust ターゲットを //ui/base/BUILD.gn
に追加します。
#![allow(unused)] fn main() { // SAFETY: There is no other global function of this name. #[unsafe(no_mangle)] pub extern "C" fn hello_from_rust() { println!("Hello from Rust!") } }
Important: note that no_mangle
here is considered a type of unsafety by the Rust compiler, so you'll need to allow unsafe code in your gn
target.
この新しい Rust ターゲットを //ui/base:base
の依存関係として追加します。この関数を ui/base/resource/resource_bundle.cc
の先頭で宣言します(後ほど、バインディング生成ツールでこれを自動化する方法を説明します)。
extern "C" void hello_from_rust();
この関数を ui/base/resource/resource_bundle.cc
内のどこかから呼び出します。おすすめはResourceBundle::MaybeMangleLocalizedString
の先頭から呼び出すことです。Chromium をビルドして実行し、"Hello from Rust!" が何度も出力されていることを確認します。
VSCode を使用している場合は、VSCode で適切に動作するように Rust を設定します。これは、後続の演習で役立ちます。設定が完了したら、println!
で "Go to definition" を右クリックで利用できるようになります。
参考情報
rust_static_library
gn テンプレート で使用できるオプション- Information about
#[unsafe(no_mangle)]
extern "C"
に関する情報- gn の
--export-rust-project
スイッチに関する情報 - VSCode に rust-analyzer をインストールする方法
この例は、共通の相互運用言語である C に集約されているため、一般的ではありません。C++ と Rust はどちらも、C ABI 関数をネイティブに宣言して呼び出すことができます。コースの後半で、C++ を Rust に直接接続します。
allow_unsafe = true
is required here because #[unsafe(no_mangle)]
might allow Rust to generate two functions with the same name, and Rust can no longer guarantee that the right one is called.
純粋な Rust 実行可能ファイルが必要な場合は、rust_executable
gn テンプレートを使用して行うこともできます。