
crossKompilasi silang "Zero Setup" dan "Cross Testing" dari Rust Crates
Proyek ini dikembangkan dan dikelola oleh tim Cross-RS. Sebelumnya dikelola oleh tim alat kelompok kerja yang tertanam karat. Kontributor baru dipersilakan! Silakan bergabung dengan ruang matriks kami dan menyapa.

`Cross Test`ing Peti untuk target AARCH64-UKNOWN-LINUX-GNU
cross akan menyediakan semua bahan yang dibutuhkan untuk kompilasi silang tanpa menyentuh pemasangan sistem Anda.
cross menyediakan lingkungan, cross toolchain, dan perpustakaan yang dikompilasi silang, yang menghasilkan binari yang paling portabel.
"Pengujian silang", cross dapat menguji peti untuk arsitektur selain i686 dan x86_64.
Saluran stabil, beta, dan malam malam didukung.
Lihat Panduan Memulai kami untuk instruksi instalasi terperinci.
Salah satu mesin wadah ini diperlukan. Jika keduanya diinstal, cross akan default ke docker .
docker atau menggunakan Docker tanpa akar. Baca panduan instalasi mesin kontainer untuk langkah instalasi dan pasca-instalasi yang diperlukan. Membutuhkan versi 20.10 (API 1.40) atau lebih baru.cargo install cross --git https://github.com/cross-rs/crossDimungkinkan juga untuk langsung mengunduh biner rilis yang telah dikompilasi sebelumnya atau menggunakan cargo-binstall.
cross memiliki CLI yang sama persis dengan kargo tetapi bergantung pada Docker atau Podman. Untuk Docker, Anda harus memulai daemon sebelum Anda bisa menggunakannya.
# (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
Dokumentasi tambahan dapat ditemukan di wiki atau docs/ subfolder.
Anda memiliki empat opsi untuk mengonfigurasi cross . Semua opsi ini menggunakan format TOML untuk konfigurasi dan nilai konfigurasi yang mungkin didokumentasikan di sini.
cross Langsung Di Cargo.toml Anda Anda dapat secara langsung mengatur nilai konfigurasi di file Cargo.toml Anda, di bawah tabel [workspace.metadata.cross] , yaitu awalan kunci. Contoh cuplikan konfigurasi akan terlihat seperti ini:
[ 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 melalui file Cross.toml Anda dapat menempatkan konfigurasi Anda di dalam file Cross.toml di direktori root proyek Anda.
CROSS_CONFIG untuk menentukan lokasi konfigurasi Anda Dengan mengatur variabel lingkungan CROSS_CONFIG , Anda dapat memberi tahu cross di mana ia harus mencari file konfigurasi. Dengan cara ini Anda tidak terbatas pada file Cross.toml di root proyek.
cross LingkunganSelain file konfigurasi berbasis TOML, konfigurasi dapat dilewatkan melalui variabel lingkungan juga.
Saat menjalankan cross dari dalam wadah, cross membutuhkan akses ke host Docker Daemon itu sendiri. Ini biasanya dicapai dengan memasang soket Docker Daemons /var/run/docker.sock . Misalnya:
$ 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 yang berjalan gambar membutuhkan alat pengembangan karat untuk diinstal.
Dengan cross pengaturan ini harus menemukan dan memasang jalur host yang benar ke dalam wadah yang digunakan untuk kompilasi silang. Ini termasuk direktori proyek asli serta jalur akar dari wadah induk untuk memberikan akses ke alat pembangun karat.
Untuk menginformasikan cross bahwa itu berjalan di dalam wadah set CROSS_CONTAINER_IN_CONTAINER=true .
Pengembangan atau wadah CI dapat dibuat seperti ini:
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
...
Keterbatasan : Menemukan titik pemasangan untuk Direktori Root Containers saat ini hanya tersedia untuk driver penyimpanan OverlayFS2. Untuk mengakses pengaturan karat wadah induk, wadah anak -anak memasang overlayf orang tua. Orang tua tidak boleh dihentikan sebelum wadah anak, karena overlayf tidak dapat tidak dipasang dengan benar oleh Docker jika wadah anak masih mengaksesnya.
Secara default, cross mencoba menggunakan Docker atau Podman, dalam urutan itu. Jika Anda ingin memilih mesin kontainer secara eksplisit, Anda dapat mengatur nama biner (atau jalur) menggunakan variabel lingkungan CROSS_CONTAINER_ENGINE .
Misalnya jika Anda ingin menggunakan Podman, Anda dapat mengatur CROSS_CONTAINER_ENGINE=podman .
Target dianggap sebagai "didukung" jika cross dapat mengkompilasi peti "non-sepele" (biner), biasanya kargo, untuk target itu.
Dukungan pengujian ( cross test ) lebih rumit. Ini bergantung pada emulasi QEMU, sehingga pengujian mungkin gagal karena bug QEMU daripada bug di peti Anda. Yang mengatakan, target memiliki ✓ dalam kolom test tabel di bawah ini jika dapat menjalankan rangkaian uji compiler-builtins .
Juga, pengujian sangat lambat. cross test Uji unit secara berurutan karena QEMU marah ketika Anda memunculkan banyak utas. Ini berarti bahwa, jika salah satu tes unit Anda memicu utas, maka itu lebih mungkin gagal atau, terburuk, tidak pernah berakhir.
| Target | libc | 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 = bionik; Hanya bekerja dengan tes asli, yaitu tes yang tidak tergantung pada runtime Android. Untuk i686 beberapa tes mungkin gagal dengan assertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERR , lihat masalah #140 untuk informasi lebih lanjut.
[2] Tidak ada komponen std yang tersedia.
[3] Untuk beberapa target *BSD dan Solaris, kolom LIBC menunjukkan versi rilis OS dari mana LIBC diekstraksi.
[4] libc = newlib
[5] Harus mengubah image = "ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos" di Cross.toml untuk [target.x86_64-unknown-linux-gnu] untuk menggunakan target yang kompatibel dengan centos7.
[6] libc = emscripten dan gcc = dentang
[7] Harus mengubah image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main-centos" di Cross.toml untuk [target.aarch64-unknown-linux-gnu] untuk menggunakan target yang kompatibel dengan Centos7.
Dockerfile tambahan untuk target lain dapat ditemukan di cross-toolchains. Ini termasuk target MSVC dan Apple Darwin, yang tidak dapat kami kirimkan gambar yang sudah dibangun sebelumnya.
Anda dapat mengatur variabel QEMU_STRACE saat Anda menggunakan cross run untuk mendapatkan Backtrace of System Calls dari biner "asing" (non 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)
Peti ini dijamin akan dikompilasi pada karat stabil 1.77.2 ke atas. Ini mungkin dikompilasi dengan versi yang lebih lama tetapi itu dapat berubah dalam rilis patch baru.
Beberapa target kompilasi silang memerlukan versi karat di kemudian hari, dan menggunakan Xargo membutuhkan rust toolchain malam.
Berlisensi di bawah salah satu dari
di pilihan Anda.
Kecuali jika Anda secara eksplisit menyatakan sebaliknya, kontribusi apa pun secara sengaja diserahkan untuk dimasukkan dalam pekerjaan oleh Anda, sebagaimana didefinisikan dalam lisensi APACHE-2.0, harus dilisensikan ganda seperti di atas, tanpa syarat atau ketentuan tambahan.
Kontribusi untuk peti ini diselenggarakan di bawah ketentuan Kode Etik Karat, pengelola peti ini, tim Cross-RS, berjanji untuk mengintervensi untuk menegakkan kode perilaku itu.