Вправа правил побудови

У вашій збірці Chromium додайте нову ціль Rust до файлу //ui/base/BUILD.gn, що містить:

#![allow(unused)]
fn main() {
// БЕЗПЕКА: Не існує іншої глобальної функції з таким іменем.
#[unsafe(no_mangle)]
pub extern "C" fn hello_from_rust() {
    println!("Привіт від 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!" виводиться багато разів.

Якщо ви використовуєте VSCode, налаштуйте Rust для роботи у VSCode. Це стане у нагоді у наступних вправах. Якщо вам це вдалося, ви зможете скористатися командою "Go to definition" правою кнопкою миші на println!.

Де знайти допомогу

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

Цей приклад є незвичайним, тому що він зводиться до мови взаємодії з найменшим спільним знаменником - C. І C++, і Rust можуть оголошувати та викликати функції C ABI на мові C. Пізніше у курсі ми підключимо C++ безпосередньо до Rust.

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

Якщо вам потрібен чистий виконуваний файл Rust, ви також можете зробити це за допомогою шаблону gn rust_executable.