Кросс-компиляция
Rust позволяет собирать бинарные файлы для операционных систем, отличных от той, которую вы сейчас используете. Это значит, что код можно писать в одной ОС, а собирать бинарники для совсем другой. Например, можно разрабатывать под Linux и собирать .exe-файлы, которые запускаются в Windows. Можно даже собирать под «голые» микроконтроллеры, такие как ESP32 или STM32. В этом разделе мы разберём, как это работает и что означают такие понятия, как target triple.
TL;DR
Для сборки под ESP32 нужно использовать target
xtensa-esp32-none-elf.
cargo build --target xtensa-esp32-none-elfМожно также задать target в
.cargo/config.toml, чтобы не вводить его каждый раз.
Сборка для вашей системы
Допустим, мы работаем на компьютере с Linux. Когда вы выполняете обычную команду сборки, Rust компилирует код для текущей платформы, то есть в данном случае для Linux:
cargo build
Проверить, какой бинарный файл был создан, можно с помощью команды file:
file ./target/debug/std_to_no_std
Вывод будет примерно таким. Он говорит, что это 64-битный ELF-файл, динамически связанный и собранный под Linux.
./target/debug/std_to_no_std: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Build...
Кросс-компиляция под Windows
Теперь допустим, что вы хотите собрать бинарный файл под Windows, не покидая свою машину с Linux. Вот тут и пригодится кросс-компиляция.
Сначала нужно сообщить Rust о целевой платформе. Делать это нужно только один раз:
rustup target add x86_64-pc-windows-gnu
Это добавляет поддержку генерации 64-битных бинарников для Windows с помощью GNU-тулчейна (MinGW).
Теперь соберите проект снова, на этот раз указав цель:
cargo build --target x86_64-pc-windows-gnu
Вот и всё. Rust создаст Windows-файл .exe, хотя вы по-прежнему находитесь в Linux. Итоговый бинарник будет лежать в target/x86_64-pc-windows-gnu/debug/std_to_no_std.exe.
Тип файла можно проверить так:
file target/x86_64-pc-windows-gnu/debug/std_to_no_std.exe
Вывод будет примерно таким: 64-битный файл формата PE32+ для Windows.
target/x86_64-pc-windows-gnu/debug/std_to_no_std.exe: PE32+ executable (console) x86-64, for MS Windows
Что такое target triple?
Что же означает строка x86_64-pc-windows-gnu?
Это называется target triple («тройка» цели), и она точно сообщает компилятору, какой результат вам нужен. Обычно она имеет такой формат:
`<architecture>-<vendor>-<os>-<abi>`
Но шаблон не всегда соблюдается. Иногда часть ABI отсутствует. В других случаях может отсутствовать и вендор, или и вендор, и ABI. Структура бывает запутанной, и исключений хватает. Если хотите глубже разобраться во всех нюансах, посмотрите статью «What the Hell Is a Target Triple?» из списка ссылок ниже.
Разберём, что на самом деле означает этот target triple:
-
Архитектура (x86_64): 64-битная x86, то есть тип процессора, который используется в большинстве современных ПК. Её также называют AMD64 или x64.
-
Вендор (pc): по сути, это заглушка. В большинстве случаев он не очень важен. Для macOS вендором будет
apple. -
ОС (windows): сообщает Rust, что мы хотим собрать программу для Windows.
-
ABI (gnu): эта часть указывает Rust использовать GNU-тулчейн для сборки бинарника.