Упражнение по правилам сборки
В вашей сборке Chromium добавьте новую цель Rust в //ui/base/BUILD.gn, содержащую:
#![allow(unused)]
fn main() {
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
// SAFETY: Нет другой глобальной функции с таким именем.
#[unsafe(no_mangle)]
pub extern "C" fn hello_from_rust() {
println!("Hello from Rust!")
}
}
Важно: обратите внимание, что no_mangle здесь компилятор Rust считает видом небезопасности, поэтому в вашей цели gn нужно разрешить небезопасный код.
Добавьте эту новую цель 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!» выводится много раз.
Если вы используете VS Code, сейчас настройте Rust так, чтобы он хорошо работал в VS Code. Это пригодится в последующих упражнениях. Если у вас получилось, вы сможете использовать «Go to definition» по правому клику на println!.
Где найти помощь
- Доступные параметры шаблона gn
rust_static_library - Информация о
#[unsafe(no_mangle)] - Информация о
extern "C" - Информация о переключателе gn
--export-rust-project - Как установить rust-analyzer в VS Code
Этот пример необычен, потому что сводится к языку взаимодействия с наименьшим общим знаменателем — C. И C++, и Rust могут нативно объявлять и вызывать функции с ABI C. Позже в курсе мы напрямую подключим C++ к Rust.
allow_unsafe = true здесь обязательно, потому что #[unsafe(no_mangle)] может позволить Rust сгенерировать две функции с одним и тем же именем, и тогда Rust больше не может гарантировать, что будет вызвана нужная.
Если нужен чисто Rust исполняемый файл, его можно собрать и с помощью шаблона gn rust_executable.