
crossالتجميع المتقاطع "Zero Setup" و "الاختبار المتقاطع" من صناديق الصدأ
تم تطوير هذا المشروع وصيانته من قبل فريق Cross-RS. تم الاحتفاظ به سابقًا من قبل فريق أدوات مجموعة العمل المضمّن Rust. المساهمون الجدد مرحب بهم! يرجى الانضمام إلى غرفة المصفوفة لدينا وقل مرحبًا.

`cross test` strate لهدف AARCH64-unknown-linux-gnu
سيوفر cross جميع المكونات اللازمة للتجميع المتقاطع دون لمس تثبيت النظام الخاص بك.
يوفر cross بيئة ومكتبات الأدوات المتقاطعة والمكتبات المتقاطعة التي تنتج أكثر الثنائيات محمولة.
"الاختبار المتقاطع" ، يمكن لـ cross اختبار الصناديق للبنية غير I686 و X86_64.
يتم دعم القنوات المستقرة والبيتا والقنوات الليلية.
انظر دليل البدء لدينا للحصول على إرشادات التثبيت التفصيلية.
مطلوب واحد من محركات الحاويات هذه. إذا تم تثبيت كلاهما ، فسيقوم cross بالتخلف عن docker .
docker أو استخدام Docker بدون جذور. اقرأ دليل تثبيت محرك الحاوية لخطوات التثبيت وبعد التثبيت المطلوبة. يتطلب الإصدار 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 Daemon نفسه. يتم تحقيق ذلك عادة عن طريق تركيب 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 يجب العثور على مسارات المضيف الصحيحة وتثبيتها في الحاوية المستخدمة لتجميع المتقاطع. يتضمن ذلك دليل المشروع الأصلي بالإضافة إلى مسار الجذر للحاوية الأصل لإتاحة الوصول إلى أدوات بناء الصدأ.
لإبلاغ 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. من أجل الوصول إلى إعداد صدأ الحاويات الأم ، تقوم حاوية الطفل بتركيب الوالدين. يجب ألا يتم إيقاف الوالد قبل حاوية الطفل ، حيث لا يمكن أن يكون التراكب غير محمولة بشكل صحيح بواسطة Docker إذا كانت حاوية الطفل لا تزال تصل إليها.
بشكل افتراضي ، يحاول cross استخدام Docker أو Podman ، بهذا الترتيب. إذا كنت ترغب في اختيار محرك حاوية بشكل صريح ، فيمكنك تعيين الاسم الثنائي (أو المسار) باستخدام متغير بيئة CROSS_CONTAINER_ENGINE .
على سبيل المثال ، إذا كنت ترغب في استخدام Podman ، يمكنك تعيين CROSS_CONTAINER_ENGINE=podman .
يعتبر الهدف "مدعومًا" إذا كان بإمكان cross تجميع قفص "غير تافهة" (ثنائي) ، عادةً البضائع ، لهذا الهدف.
اختبار الدعم ( cross test ) أكثر تعقيدًا. يعتمد على مضاهاة QEMU ، لذلك قد يفشل الاختبار بسبب بق الحشرات QEMU بدلاً من الأخطاء في قفصك. ومع ذلك ، يحتوي الهدف على عمود test في الجدول أدناه إذا كان بإمكانه تشغيل جناح اختبار compiler-builtins .
أيضا ، الاختبار بطيء جدا. يقوم 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 | ✓ | ن/أ | ✓ |
i586-unknown-linux-musl | 1.2.3 | 9.2.0 | ✓ | ن/أ | ✓ |
i686-unknown-freebsd | 1.5 | 6.4.0 | ✓ | ن/أ | |
i686-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
i686-pc-windows-gnu | ن/أ | 9.4 | ✓ | ن/أ | ✓ |
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 | ✓ | ن/أ | |
thumbv6m-none-eabi [4] | 3.3.0 | 9.2.1 | ن/أ | ||
thumbv7em-none-eabi [4] | 3.3.0 | 9.2.1 | ن/أ | ||
thumbv7em-none-eabihf [4] | 3.3.0 | 9.2.1 | ن/أ | ||
thumbv7m-none-eabi [4] | 3.3.0 | 9.2.1 | ن/أ | ||
thumbv7neon-linux-androideabi [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
thumbv7neon-unknown-linux-gnueabihf | 2.31 | 9.4.0 | ✓ | ن/أ | ✓ |
thumbv8m.base-none-eabi [4] | 3.3.0 | 9.2.1 | ن/أ | ||
thumbv8m.main-none-eabi [4] | 3.3.0 | 9.2.1 | ن/أ | ||
thumbv8m.main-none-eabihf [4] | 3.3.0 | 9.2.1 | ن/أ | ||
wasm32-unknown-emscripten [6] | 3.1.14 | 15.0.0 | ✓ | ن/أ | ✓ |
x86_64-linux-android [1] | 9.0.8 | 9.0.8 | ✓ | 6.1.0 | ✓ |
x86_64-pc-windows-gnu | ن/أ | 9.3 | ✓ | ن/أ | ✓ |
x86_64-pc-solaris | 1.22.7 | 8.4.0 | ✓ | ن/أ | |
x86_64-unknown-freebsd | 1.5 | 6.4.0 | ✓ | ن/أ | |
x86_64-unknown-dragonfly [2] [3] | 6.0.1 | 10.3.0 | ✓ | ن/أ | |
x86_64-unknown-illumos | 1.20.4 | 8.4.0 | ✓ | ن/أ | |
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 | ✓ | ن/أ | ✓ |
x86_64-unknown-netbsd [3] | 9.2.0 | 9.4.0 | ✓ | ن/أ |
[1] libc = bionic ؛ يعمل فقط مع الاختبارات الأصلية ، أي الاختبارات التي لا تعتمد على وقت تشغيل Android. بالنسبة إلى i686 ، قد تفشل بعض الاختبارات مع assertion failed: signal(libc::SIGPIPE, libc::SIG_IGN) != libc::SIG_ERR ، انظر العدد رقم 140 لمزيد من المعلومات.
[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 ، بالتدخل لدعم مدونة قواعد السلوك.