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();
}
}