
crossการรวบรวม“ การตั้งค่าเป็นศูนย์” และ“ การทดสอบข้าม” ของลังสนิม
โครงการนี้ได้รับการพัฒนาและดูแลโดยทีม Cross-RS ก่อนหน้านี้มันได้รับการดูแลโดยทีมเครื่องมือคณะทำงาน Rust Embedded Working Working ยินดีต้อนรับผู้มีส่วนร่วมใหม่! กรุณาเข้าร่วมห้องเมทริกซ์ของเราและทักทาย

`cross test`ing ลังสำหรับเป้าหมาย Aarch64-unknown-linux-gnu
cross จะให้ส่วนผสมทั้งหมดที่จำเป็นสำหรับการรวบรวมข้ามโดยไม่ต้องสัมผัสการติดตั้งระบบของคุณ
cross ให้สภาพแวดล้อม, Cross Toolchain และ Cross Compiled Libraries ซึ่งสร้างไบนารีแบบพกพามากที่สุด
“ การทดสอบข้าม”, cross สามารถทดสอบลังสำหรับสถาปัตยกรรมอื่นที่ไม่ใช่ I686 และ X86_64
รองรับช่องทางที่มั่นคงเบต้าและยามค่ำคืน
ดูคู่มือการเริ่มต้นใช้งานของเราสำหรับคำแนะนำการติดตั้งโดยละเอียด
หนึ่งในเครื่องยนต์คอนเทนเนอร์เหล่านี้เป็นสิ่งจำเป็น หากติดตั้งทั้งคู่ cross จะเริ่มต้นเป็น docker
docker หรือใช้ Rootless Docker อ่านคู่มือการติดตั้งเครื่องยนต์คอนเทนเนอร์สำหรับขั้นตอนการติดตั้งที่จำเป็นและขั้นตอนหลังการติดตั้ง ต้องการเวอร์ชัน 20.10 (API 1.40) หรือใหม่กว่าcargo install cross --git https://github.com/cross-rs/crossนอกจากนี้ยังเป็นไปได้ที่จะดาวน์โหลดไบนารีรีลีสที่คอมไพล์ล่วงหน้าโดยตรงหรือใช้การติดตั้งค่าขนส่งสินค้า
cross มี CLI ที่แน่นอนเช่นเดียวกับสินค้า แต่อาศัย Docker หรือ Podman สำหรับนักเทียบท่าคุณจะต้องเริ่มต้น daemon ก่อนที่คุณจะสามารถใช้งานได้
# (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/ subfolder
คุณมีสี่ตัวเลือกในการกำหนด 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 ว่าควรค้นหาไฟล์ config วิธีนี้คุณไม่ได้ จำกัด อยู่ที่ไฟล์ Cross.toml ในรูทโครงการ
cross ผ่านตัวแปรสภาพแวดล้อมนอกเหนือจากไฟล์การกำหนดค่าที่ใช้ TOML แล้วการกำหนดค่าสามารถส่งผ่านตัวแปรสภาพแวดล้อมได้เช่นกัน
เมื่อวิ่ง cross จากภายในคอนเทนเนอร์ cross จำเป็นต้องเข้าถึงโฮสต์ Docker Daemon เอง โดยปกติจะทำได้โดยการติดตั้งซ็อกเก็ต 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 ต้องใช้เครื่องมือพัฒนาสนิม
ด้วยการตั้งค่า cross นี้จะต้องค้นหาและติดตั้งเส้นทางโฮสต์ที่ถูกต้องลงในคอนเทนเนอร์ที่ใช้สำหรับการรวบรวมข้าม ซึ่งรวมถึงไดเรกทอรีโครงการดั้งเดิมรวมถึงเส้นทางรูทของคอนเทนเนอร์หลักเพื่อให้สามารถเข้าถึงเครื่องมือสร้างสนิม
เพื่อแจ้งให้ 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 เท่านั้น ในการเข้าถึงการตั้งค่าการเกิดสนิมของคอนเทนเนอร์พาเรนต์ตู้คอนเทนเนอร์เด็กจะติดตั้งผู้ปกครองซ้อนทับ ผู้ปกครองจะต้องไม่หยุดก่อนที่จะมีคอนเทนเนอร์เด็กเนื่องจาก OverlayFs ไม่สามารถถูกวางไม่ได้อย่างถูกต้องโดย Docker หากคอนเทนเนอร์เด็กยังคงเข้าถึงได้
โดยค่าเริ่ม cross พยายามใช้ Docker หรือ Podman ตามลำดับ หากคุณต้องการเลือกเครื่องยนต์คอนเทนเนอร์อย่างชัดเจนคุณสามารถตั้งค่าชื่อไบนารี (หรือเส้นทาง) โดยใช้ตัวแปรสภาพแวดล้อม CROSS_CONTAINER_ENGINE
ตัวอย่างเช่นในกรณีที่คุณต้องการใช้ Podman คุณสามารถตั้งค่า CROSS_CONTAINER_ENGINE=podman
เป้าหมายถูกพิจารณาว่าเป็น "รองรับ" หาก cross สามารถรวบรวม "ลังที่ไม่ใช่เรื่องสำคัญ" (ไบนารี) ซึ่งมักจะขนส่งสินค้าสำหรับเป้าหมายนั้น
การสนับสนุนการทดสอบ ( cross test ) มีความซับซ้อนมากขึ้น มันขึ้นอยู่กับการจำลอง QEMU ดังนั้นการทดสอบอาจล้มเหลวเนื่องจากข้อบกพร่อง QEMU แทนที่จะเป็นข้อบกพร่องในลังของคุณ ที่กล่าวว่าเป้าหมายมี✓ในคอลัมน์ test ของตารางด้านล่างหากมันสามารถเรียกใช้ชุดทดสอบ compiler-builtins
นอกจากนี้การทดสอบช้ามาก cross test รันหน่วยทดสอบ ตามลำดับ เนื่องจาก QEMU อารมณ์เสียเมื่อคุณวางไข่หลายเธรด ซึ่งหมายความว่าหากหนึ่งในหน่วยการทดสอบของคุณวางไข่เธรดแล้วก็มีแนวโน้มที่จะล้มเหลวหรือแย่ที่สุดไม่เคยยุติ
| เป้า | 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 = bionic; ใช้งานได้กับการทดสอบแบบดั้งเดิมเท่านั้นนั่นคือการทดสอบที่ไม่ได้ขึ้นอยู่กับรันไทม์ Android สำหรับ I686 การทดสอบบางอย่างอาจล้มเหลวด้วย assertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERR ดูปัญหา #140 สำหรับข้อมูลเพิ่มเติม
[2] ไม่มีส่วนประกอบ std
[3] สำหรับเป้าหมาย *BSD และ Solaris บางส่วนคอลัมน์ LIBC ระบุเวอร์ชันการเปิดตัว OS ที่สกัด 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 เพิ่มเติมสำหรับเป้าหมายอื่น ๆ สามารถพบได้ใน cross-toolchains เหล่านี้รวมถึงเป้าหมาย 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)
ลังนี้รับประกันได้ว่าจะรวบรวม Rust ที่มีเสถียรภาพ 1.77.2 ขึ้นไป มัน อาจ คอมไพล์ด้วยเวอร์ชันเก่า แต่อาจเปลี่ยนแปลงในการเปิดตัวแพทช์ใหม่ใด ๆ
เป้าหมายการรวบรวมข้ามบางอย่างต้องใช้เวอร์ชันสนิมในภายหลังและการใช้ XARGO ต้องใช้เครื่องมือที่เป็นสนิมทุกคืน
ได้รับใบอนุญาตภายใต้
ตามตัวเลือกของคุณ
หากคุณไม่ได้ระบุอย่างชัดเจนการบริจาคใด ๆ ที่ส่งโดยเจตนาเพื่อรวมไว้ในงานโดยคุณตามที่กำหนดไว้ในใบอนุญาต Apache-2.0 จะได้รับใบอนุญาตคู่ดังกล่าวข้างต้นโดยไม่มีข้อกำหนดหรือเงื่อนไขเพิ่มเติมใด ๆ
การมีส่วนร่วมในลังนี้ถูกจัดระเบียบภายใต้ข้อกำหนดของจรรยาบรรณสนิมผู้ดูแลของลังนี้ทีม Cross-RS สัญญาว่าจะเข้าไปแทรกแซงเพื่อรักษาจรรยาบรรณนั้น