
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團隊有望進行干預以維護該行為守則。