
cross“零设置”交叉编译和“交叉测试”锈板箱
该项目由Cross-RS团队开发和维护。它以前是由Rust嵌入式工作组工具团队维护的。欢迎新贡献者!请加入我们的矩阵室,打个招呼。

``cross test`板条箱
cross将提供交叉汇编所需的所有成分,而无需触摸您的系统安装。
cross提供了一个可产生最便携式二进制文件的环境,跨工具链和交叉编译的库。
“交叉测试”, cross可以测试I686和X86_64以外的架构板条。
支持稳定,beta和夜间频道。
有关详细的安装说明,请参见我们的入门指南。
这些容器引擎需要之一。如果两者都安装, cross将默认为docker 。
docker组中或使用无根的Docker。阅读所需的安装和安装后步骤的“容器引擎安装指南”。需要20.10版(API 1.40)或更高版本。cargo install cross --git https://github.com/cross-rs/cross也可以直接下载预编译的二进制文件或使用Cargo-Binstall。
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
可以在Wiki或docs/子文件夹上找到其他文档。
您有四个配置cross的选项。所有这些选项都使用TOML格式进行配置,并在此处记录了可能的配置值。
Cargo.toml中配置cross您可以在[workspace.metadata.cross]表,即键前缀下直接设置Cargo.toml文件中的配置值。一个示例配置摘要看起来像这样:
[ 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.toml文件配置cross您可以将配置放入项目根目录中的Cross.toml文件中。
CROSS_CONFIG指定配置的位置通过设置CROSS_CONFIG环境变量,您可以告诉cross应该在何处搜索配置文件。这样,您就不限于项目根中的Cross.toml文件。
cross除了基于TOML的配置文件外,配置也可以通过环境变量传递。
当从容器内部运行cross时, cross需要访问主机Docker守护程序本身。这通常是通过安装Docker Daemons插座/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需要安装Rust Development工具。
使用此设置cross必须找到并将正确的主机路径安装到用于交叉汇编的容器中。这包括原始项目目录以及父容器的根路径,以访问Rust Build工具。
要通知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
...
限制:查找容器根目录的安装点目前仅适用于OverLayfs2存储驱动程序。为了访问父容器Rust设置,孩子容器安装了父母的覆盖。在子容器之前,不得停止父母,因为如果孩子容器仍然可以访问,docker无法正确卸载。
默认情况下, cross试图按该顺序使用Docker或Podman。如果要明确选择容器引擎,则可以使用CROSS_CONTAINER_ENGINE环境变量设置二进制名称(或路径)。
例如,如果您想使用Podman,则可以设置CROSS_CONTAINER_ENGINE=podman 。
如果cross可以交叉编译“非平凡”(二进制)板条箱(通常是货物),则将目标视为“支撑”。
测试支持( cross test )更为复杂。它依赖于QEMU仿真,因此测试可能由于QEMU错误而不是板条箱中的错误而失败。也就是说,如果目标可以运行compiler-builtins测试套件,则在下表的test列中具有✓的。
另外,测试非常慢。 cross test运行单元测试顺序测试,因为当您产生多个线程时QEMU会感到不安。这意味着,如果您的单元测试之一催生线程,那么更可能失败或最坏,永远不会终止。
| 目标 | libc | 海湾合作委员会 | 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 ,有关更多信息,请参见第140页。
[2]没有std组件。
[3]对于一些 *BSD和Solaris目标,LIBC列指示从中提取LIBC的OS释放版本。
[4] libc = newlib
[5]必须更改image = "ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos" in 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" in Cross.toml中的[target.aarch64-unknown-linux-gnu]使用CentOS7相互兼容的目标。
其他目标的其他码头可以在交叉链链中找到。其中包括MSVC和Apple Darwin目标,我们无法运送预先构建的图像。
当您使用cross run以获取“外国”(非X86_64)二进制文件的系统调用时,可以设置QEMU_STRACE变量。
$ 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许可证中定义)应为双重许可,如上所述,没有任何其他条款或条件。
对该板条箱的贡献是根据《锈迹守则》条款组织的,该板条箱的维护者,交叉RS团队有望进行干预以维护该行为守则。