
cross「ゼロセットアップ」クロスコンピレーションとラストクレートの「クロステスト」
このプロジェクトは、Cross-RSチームによって開発および維持されています。以前は、Rust Embedded Working Group Toolsチームによって維持されていました。新しい貢献者は大歓迎です!マトリックスの部屋に参加して、こんにちはと言ってください。

`Cross Test」AARCH64-UNKNOUNT-LINUX-GNUターゲットのクレート
cross 、システムのインストールに触れることなく、クロスコンピレーションに必要なすべての材料を提供します。
cross 、最もポータブルなバイナリを生成する環境、Cross Toolchain、Cross Compiledライブラリを提供します。
「クロステスト」、 cross I686およびX86_64以外のアーキテクチャについてクレートをテストできます。
安定した、ベータ、および毎晩のチャネルがサポートされています。
詳細なインストール手順については、開始ガイドをご覧ください。
これらのコンテナエンジンの1つが必要です。両方がインストールされている場合、 crossデフォルトでdockerになります。
dockerグループにいるか、Rootless 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
追加のドキュメントは、wikiまたはdocs/ subfolderで見つけることができます。
crossを構成する4つのオプションがあります。これらのオプションはすべて、構成にTOML形式を使用し、可能な構成値をここに文書化します。
Cargo.tomlで直接crossを構成します。TOML [workspace.metadata.cross]テーブル、つまりキープレフィックスの下に、貨物Cargo.tomlファイルに構成値を直接設定できます。 configスニペットの例は次のようになります:
[ 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に伝えることができます。これにより、プロジェクトルートのCross.tomlファイルに限定されません。
crossの構成TOMLベースの構成ファイルに加えて、構成も環境変数に渡すことができます。
コンテナ内からcrossを走るとき、 crossホストのDockerデーモン自体にアクセスする必要があります。これは通常、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を見つけてマウントする必要があります。これには、元のプロジェクトディレクトリと、Rustビルドツールにアクセスできる親コンテナのルートパスが含まれます。
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のバグのためにテストが失敗する可能性があります。とはいえ、ターゲットには、 compiler-builtinsテストスイートを実行できる場合、以下の表のtest列に✓があります。
また、テストは非常に遅いです。 cross test 、複数のスレッドを生成するとQEMUが動揺するため、ユニットテストを順番に実行します。これは、ユニットテストの1つがスレッドを生成する場合、失敗する可能性が高いか、最悪の場合、終了しないことを意味します。
| ターゲット | 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一部のテストが失敗する可能性があります。
[2] stdコンポーネントは利用できません。
[3]一部の *BSDおよびSolarisターゲットの場合、LIBC列はLIBCが抽出されたOSリリースバージョンを示します。
[4] libc = newlib
[5] Cross.toml for [target.x86_64-unknown-linux-gnu]のimage = "ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main-centos"変更する必要があります。
[6] libc = emscriptenおよびgcc = clang
[7] image = "ghcr.io/cross-rs/aarch64-unknown-linux-gnu:main-centos" for [target.aarch64-unknown-linux-gnu]のtoml in Cross.toml incentos7互換ターゲットを使用する必要があります。
他のターゲット用の追加のDockerFilesは、クロスツールチェーンにあります。これらには、MSVCとApple Darwinのターゲットが含まれます。
cross runを使用して「Foreign」(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チームは、その行動規範を支持するために介入することを約束します。