Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Упражнение по правилам сборки

В вашей сборке 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!.

Где найти помощь

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

Этот пример необычен, потому что сводится к языку взаимодействия с наименьшим общим знаменателем — C. И C++, и Rust могут нативно объявлять и вызывать функции с ABI C. Позже в курсе мы напрямую подключим C++ к Rust.

allow_unsafe = true здесь обязательно, потому что #[unsafe(no_mangle)] может позволить Rust сгенерировать две функции с одним и тем же именем, и тогда Rust больше не может гарантировать, что будет вызвана нужная.

Если нужен чисто Rust исполняемый файл, его можно собрать и с помощью шаблона gn rust_executable.