Build rules exercise

在 Chromium build 中,向 //ui/base/BUILD.gn 添加新的 Rust 目标,其中包含:

  1. #![allow(unused)]
  2. fn main() {
  3. #[no_mangle]
  4. pub extern "C" fn hello_from_rust() {
  5. println!("Hello from Rust!")
  6. }
  7. }

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 顶部声明此函数(稍后,我们将介绍如何通过绑定生成工具来自动执行此操作):

  1. extern "C" void hello_from_rust();

ui/base/resource/resource_bundle.cc 中的某个位置调用此函数,我们建议在从 ResourceBundle::MaybeMangleLocalizedString 的顶部调用此函数。构建并运行 Chromium,并确保多次显示 “Hello from Rust!”。

如果您使用 VSCode,现在就请设置 Rust,以便其能在 VSCode 中正常运行。这对后续练习会很有帮助。如果操作成功,则可使用右键点击 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,因为 #[no_mangle] 可能会支持 Rust 生成两个同名函数,而 Rust 无法保证会调用正确的函数。

如果需要纯 Rust 可执行文件,也可以使用 rust_executable gn 模板执行此操作。