
crossПоперечная компиляция «нулевая установка» и «перекрестное тестирование» ящиков ржавчины
Этот проект разрабатывается и поддерживается командой Cross-RS. Ранее он поддерживался командой инструментов рабочей группы встроенной ржавчины. Приглашаются новые участники! Пожалуйста, присоединяйтесь к нашей комнате Matrix и скажите привет.

`Cross Test, выводя ящик для цели AARCH64-Unknown-Linux-GNU
cross предоставит все ингредиенты, необходимые для перекрестного компиляции, не касаясь установки вашей системы.
cross предоставляет среду, кросс -набор инструментов и Cross, составленные библиотеками, которые создают наиболее портативные двоичные файлы.
«Поперечное тестирование», cross может проверить ящики на архитектуры, отличные от I686 и x86_64.
Конюшня, бета и ночные каналы поддерживаются.
Смотрите наше руководство по началу работы для подробных инструкций по установке.
Требуется один из этих контейнерных двигателей. Если оба установлены, cross по умолчанию будет docker .
docker или использовать Docker без root. Прочитайте руководство по установке двигателя контейнера для необходимой установки и шагов после установки. Требуется версия 20.10 (API 1.40) или позже.cargo install cross --git https://github.com/cross-rs/crossТакже можно напрямую загрузить предварительно скомпилированные двоичные файлы релизов или использовать грузовой бинсталл.
cross имеет точно такой же CLI, что и груз, но полагается на Docker или Podman. Для Docker вам придется запустить демон, прежде чем вы сможете его использовать.
# (ONCE PER BOOT, on Linux)
# Start the Docker daemon, if it's not already running using systemd
# on WSL2 and other systems using SysVinit, use `sudo service docker start`.
$ sudo systemctl start docker
# MAGIC! This Just Works
$ cross build --target aarch64-unknown-linux-gnu
# EVEN MORE MAGICAL! This also Just Works
$ cross test --target mips64-unknown-linux-gnuabi64
# Obviously, this also Just Works
$ cross rustc --target powerpc-unknown-linux-gnu --release -- -C lto
Дополнительную документацию можно найти на вики или docs/ подпапке.
У вас есть четыре варианта настройки cross . Все эти параметры используют формат TOML для конфигурации, и здесь документированы возможные значения конфигурации.
cross непосредственно в вашем Cargo.toml Вы можете напрямую установить значения конфигурации в вашем файле Cargo.toml в таблице [workspace.metadata.cross] , т.е. префикс ключей. Пример фрагмента конфигурации будет выглядеть так:
[ workspace . metadata . cross . target . aarch64-unknown-linux-gnu ]
# Install libssl-dev:arm64, see <https://github.com/cross-rs/cross/blob/main/docs/custom_images.md#adding-dependencies-to-existing-images>
pre-build = [
" dpkg --add-architecture $CROSS_DEB_ARCH " ,
" apt-get update && apt-get --assume-yes install libssl-dev:$CROSS_DEB_ARCH "
]
[ workspace . metadata . cross . target . armv7-unknown-linux-gnueabi ]
image = " my/image:latest "
[ workspace . metadata . cross . build ]
env.volumes = [ " A_DIRECTORY=/path/to/volume " ]cross через файл Cross.toml Вы можете поместить свою конфигурацию в файл Cross.toml в корневом каталоге проекта.
CROSS_CONFIG для указания местоположения вашей конфигурации Установив переменную среды CROSS_CONFIG , вы можете сказать cross , где он должен искать файл конфигурации. Таким образом, вы не ограничены файлом Cross.toml в корне проекта.
cross через переменные средыПомимо файлов конфигурации на основе TOML, конфигурация также может быть передана через переменные среды.
При запуске cross изнутри контейнера cross доступ к самому демону докеров. Обычно это достигается путем монтажа Docker Daemons Socket /var/run/docker.sock . Например:
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v .:/project
-w /project my/development-image:tag cross build --target mips64-unknown-linux-gnuabi64
Для установки изображения, работающего cross , требуется установка инструментов разработки ржавчины.
С помощью этого cross настройки должен найти и установить правильные пути хоста в контейнер, используемый для поперечного компиляции. Это включает в себя оригинальный каталог проектов, а также корневой путь родительского контейнера, чтобы предоставить доступ к инструментам сборки Rust.
Чтобы сообщить cross , что он работает внутри контейнера, установленного CROSS_CONTAINER_IN_CONTAINER=true .
Поэтому можно создать контейнер для разработки или CI:
FROM rust:1
# set CROSS_CONTAINER_IN_CONTAINER to inform `cross` that it is executed from within a container
ENV CROSS_CONTAINER_IN_CONTAINER=true
# install `cross`
RUN cargo install cross
...
Ограничения : поиск точки монтирования для корневого каталога контейнеров в настоящее время доступна только для драйвера хранения OutplayFS2. Чтобы получить доступ к родительским контейнерам, настройка ржавчины, дочерний контейнер связывает перекрытие родителей. Родитель не должен быть остановлен перед детским контейнером, так как Docker не может быть правильно размонтировано, если дочерний контейнер все еще доступен к нему.
По умолчанию cross пытается использовать Docker или Podman, в таком порядке. Если вы хотите явно выбрать контейнерный двигатель, вы можете установить двоичное имя (или путь), используя переменную среды CROSS_CONTAINER_ENGINE .
Например, если вы хотите использовать Podman, вы можете установить CROSS_CONTAINER_ENGINE=podman .
Цель считается «поддерживаемой», если cross может пересекать «нетривиальный» (бинарный) ящик, обычно груз, для этой цели.
Поддержка тестирования ( cross test ) более сложна. Он опирается на эмуляцию QEMU, поэтому тестирование может выйти из строя из -за ошибок QEMU, а не ошибок в вашем ящике. Тем не менее, цель имеет ✓ В test столбце таблицы ниже, если она может запустить тестовый набор compiler-builtins .
Кроме того, тестирование очень медленное. cross test запускает единицы тесты последовательно, потому что Qemu расстраивается, когда вы появляетесь в нескольких потоках. Это означает, что, если один из ваших модульных тестов порождает потоки, то это, скорее всего, потерпит неудачу или, что хуже всего, никогда не прекращается.
| Цель | либ | GCC | C ++ | Qemu | test |
|---|---|---|---|---|---|
aarch64-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
aarch64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
aarch64-unknown-linux-gnu:centos [7] | 2.17 | 4.8.5 | 4.2.1 | ✓ | |
aarch64-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
arm-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-gnueabi | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-gnueabihf | 2.31 | 8.5.0 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-musleabi | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
arm-unknown-linux-musleabihf | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
armv5te-unknown-linux-gnueabi | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
armv5te-unknown-linux-musleabi | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
armv7-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-gnueabi | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-gnueabihf | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-musleabi | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
armv7-unknown-linux-musleabihf | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
i586-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | N/a | ✓ |
i586-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | N/a | ✓ |
i686-unknown-freebsd | 1.5 | 6.4.0 | ✓ | N/a | |
i686-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
i686-pc-windows-gnu | N/a | 9.4 | ✓ | N/a | ✓ |
i686-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
loongarch64-unknown-linux-gnu | 2.36 | 14.2.0 | ✓ | 8.2.2 | ✓ |
loongarch64-unknown-linux-musl | 1.2.5 | 14.2.0 | ✓ | 8.2.2 | ✓ |
mips-unknown-linux-gnu | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mips-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
mips64-unknown-linux-gnuabi64 | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mips64-unknown-linux-muslabi64 | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
mips64el-unknown-linux-gnuabi64 | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mips64el-unknown-linux-muslabi64 | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
mipsel-unknown-linux-gnu | 2.30 | 9.4.0 | ✓ | 6.1.0 | ✓ |
mipsel-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | 6.1.0 | ✓ |
powerpc-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
powerpc64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
powerpc64le-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
riscv64gc-unknown-linux-gnu | 2.35 | 11.4.0 | ✓ | 8.2.2 | ✓ |
s390x-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
sparc64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
sparcv9-sun-solaris | 1.22.7 | 8.4.0 | ✓ | N/a | |
thumbv6m-none-eabi [4] | 3.3.0 | 9.2.1 | N/a | ||
thumbv7em-none-eabi [4] | 3.3.0 | 9.2.1 | N/a | ||
thumbv7em-none-eabihf [4] | 3.3.0 | 9.2.1 | N/a | ||
thumbv7m-none-eabi [4] | 3.3.0 | 9.2.1 | N/a | ||
thumbv7neon-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
thumbv7neon-unknown-linux-gnueabihf | 2.31 | 9.4.0 | ✓ | N/a | ✓ |
thumbv8m.base-none-eabi [4] | 3.3.0 | 9.2.1 | N/a | ||
thumbv8m.main-none-eabi [4] | 3.3.0 | 9.2.1 | N/a | ||
thumbv8m.main-none-eabihf [4] | 3.3.0 | 9.2.1 | N/a | ||
wasm32-unknown-emscripten [6] | 3.1.14 | 15.0.0 | ✓ | N/a | ✓ |
x86_64-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
x86_64-pc-windows-gnu | N/a | 9.3 | ✓ | N/a | ✓ |
x86_64-pc-solaris | 1.22.7 | 8.4.0 | ✓ | N/a | |
x86_64-unknown-freebsd | 1.5 | 6.4.0 | ✓ | N/a | |
x86_64-unknown-dragonfly [2] [3] | 6.0.1 | 10.3.0 | ✓ | N/a | |
x86_64-unknown-illumos | 1.20.4 | 8.4.0 | ✓ | N/a | |
x86_64-unknown-linux-gnu | 2.31 | 9.4.0 | ✓ | 6.1.0 | ✓ |
x86_64-unknown-linux-gnu:centos [5] | 2.17 | 4.8.5 | ✓ | 4.2.1 | ✓ |
x86_64-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | N/a | ✓ |
x86_64-unknown-netbsd [3] | 9.2.0 | 9.4.0 | ✓ | N/a |
[1] libc = bionic; Работает только с нативными тестами, то есть тестами, которые не зависят от времени выполнения Android. Для i686 Некоторые тесты могут пройти неудачу с ошибкой assertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERR
[2] Компонент std нет.
[3] Для некоторых целей BSD и Solaris столбец LIBC указывает версию выпуска ОС, из которой был извлечен LIBC.
[4] libc = newlib
[5] должен изменить image = "ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos" в Cross.toml для [target.x86_64-unknown-linux-gnu] для использования Centos7-совместимой цели.
[6] libc = emscripten и gcc = clang
[7] должны изменить image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main-centos" в Cross.toml для [target.aarch64-unknown-linux-gnu] для использования centos7-совместимой цели.
Дополнительные Dockerfiles для других целей можно найти в перекрестных обстановках. К ним относятся цели MSVC и Apple Darwin, которые мы не можем отправить предварительно построенные изображения.
Вы можете установить переменную QEMU_STRACE, когда вы используете cross run , чтобы получить обратную передачу системных вызовов из «иностранных» (не x86_64) двоичных файлов.
$ cargo new --bin hello && cd $_
$ QEMU_STRACE=1 cross run --target aarch64-unknown-linux-gnu
9 brk(NULL) = 0x0000004000023000
9 uname(0x4000823128) = 0
(..)
9 write(1,0xa06320,14)Hello, world!
= 14
9 sigaltstack(0x4000823588,(nil)) = 0
9 munmap(0x0000004000b16000,16384) = 0
9 exit_group(0)
Этот ящик гарантированно будет компилироваться на стабильной ржавчине 1,77,2 и выше. Он может собираться со старыми версиями, но это может измениться в любом новом выпуске патча.
Некоторые мишени для перекрестнойкомпиляции требуют более поздней версии ржавчины, и использование Xargo требует ночного набора инструментов ржавчины.
Лицензирован под одним из
на вашем варианте.
Если вы явно не заявляете иное, какой-либо вклад, преднамеренно предназначенный для включения в работу вами, как определено в лицензии Apache-2.0, должен быть двойной лицензией, как указано выше, без каких-либо дополнительных условий или условий.
Вклад в этот ящик организован в соответствии с условиями Кодекса поведения ржавчины, сопровождающего этого ящика, команды Cross-RS, обещает вмешаться, чтобы поддержать этот кодекс поведения.