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" を右クリックで利用できるようになります。

参考情報

It's really important that students get this running, because future exercises will build on it.

この例は、共通の相互運用言語である 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 テンプレートを使用して行うこともできます。