Cross-compiling

Проверка системы

Сделать новый проект, добавить в него библиотеку cargo add current_platform. Далее создаём и запускаем код проверки среды компиляции и исполнения:

use current_platform::{COMPILED_ON, CURRENT_PLATFORM};

fn main() {
    println!("Run from {}! Compiled on {}.", CURRENT_PLATFORM, COMPILED_ON);
}
  • Посмотреть текущую ОС компиляции: rustc -vV
  • Посмотреть список ОС для кросс-компиляции: rustc --print target-list Формат списка имеет поля <arch><sub>-<vendor>-<sys>-<env>, например, x86_64-apple-darwin => macOS на чипе Intel.

Настройка кросс-компилятора

Нужно установить cross: cargo install cross установит его по пути $HOME/.cargo/bin

Далее, нужно установить вариант Docker в системе:

  • На macOS => Docker Desktop;
  • На Linux => Podman

Запуск кода на компиляцию под ОС Windows: cross run --target x86_64-pc-windows-gnu => в папке target/x86_64-pc-windows-gnu/debug получаем EXE-файл с результатом. ❗Компиляция проходит через WINE.

Проверка среды компиляции

Cross поддерживает тестирование других платформ. Добавка проверки:

mod tests {
    use current_platform::{COMPILED_ON, CURRENT_PLATFORM};

    #[test]
    fn test_compiled_on_equals_current_platform() {
        assert_eq!(COMPILED_ON, CURRENT_PLATFORM);
    } }

Запустить проверку локально: cargo test Запустить проверку с кросс-компиляцией: cross test --target x86_64-pc-windows-gnu На Linux/macOS проверка пройдёт, а вот при компиляции под Windows - нет: `test tests::test_compiled_on_equals_current_platform … FAILED

Добавка платформенно-специфичного кода

Можно вписать код, который запустится только на определённой ОС, например, только на Windows:

use current_platform::{COMPILED_ON, CURRENT_PLATFORM};

#[cfg(target_os="windows")]
fn windows_only() {
    println!("This will only print on Windows!");
}

fn main() {
    println!("Run from {}! Compiled on {}.", CURRENT_PLATFORM, COMPILED_ON);
    #[cfg(target_os="windows")]
    {
        windows_only();
    }
}