「cross」:箱から出してすぐに使える、パフォーマンスを損なわないRustクロスコンパイル
珍しいアーキテクチャ用にRustプロジェクトをビルドする必要がある状況に遇到过ことはありますか?例えば、ARMボード、組み込みシステム、さらには异なるLinuxディストリビューション用の場合です。多くの場合、これは本格的な冒険になります:特定のツールチェーンをインストールし、環境を構成し、リンカーや依存関係と格闘する。すべてを動作させるまでに数時間、甚至是数日かかることもあります。そして、ビルドだけでなく、ターゲットプラットフォームでコードをテストする必要がある場合はどうでしょうか?
ここでcrossが活躍します — 「ゼロ設定」のRustクレートのクロスコンパイルとクロステストを約束するプロジェクトです。魔法のように聞こえますが?基本的に、crossはDockerまたはPodmanコンテナを使用して、クロスコンパイル用の環境準備に関連するすべてのルーティンワークを処理します。このユーティリティがRust開発者の жизньをどのように大幅に简化できるか、見てみましょう。
crossとは?谁に 필요한가?
crossは、Rust標準のパッケージマネージャー兼ビルドシステムであるcargoのラッパーです。しかし、crossはローカルのツールチェーンを使用する代わりに、ビルドまたはテストプロセスを специально подготовленныйコンテナ内で実行します。仮想マシン想象できますが、ずっと軽量でクロスコンパイルという特定のタスクに特化しています。このコンテナ内では、必要なものがすべて揃っています:クロストールチェーン、ライブラリ、ターゲットアーキテクチャ用のビルドに必要なすべてのコンポーネント。
誰がこれが役立つと思うでしょうか?以下のニーズを持つほぼすべてのRust開発者にとって便利です:
- 組み込みシステム向け開発:ARMマイコン、Raspberry Pi、その他のシングルボードコンピュータ。
- モバイル開発:Android用のコンポーネントをビルド。
- 다양한 Linuxディストリビューションまたはアーキテクチャ用のサーバーアプリケーション作成(例:クラウドサーバー上のAArch64)。
- Windows、Linux、各种BSDシステムで動作するクロスプラットフォームユーティリティの開発。
- CI/CDの自動化:テストとビルドが任意のビルドマシンで同样に可靠的に実行されるように。
crossの主な利点:動作する魔法
crossは、それを真有価値なツールにするいくつかの主要な機能で際立っています:
1.「ゼロ設定」— もう環境で苦労しない
これは 아마도 crossの最大の「機能」です。gcc-arm-none-eabiの手動インストール、linker scriptsの設定、libcの正しいバージョンの検索とはお別れです。crossが必要なすべてをコンテナ内で処理します。DockerまたはPodmanがインストール되어 있어야그리고当然 rustupがRustツールチェーンの管理用にあります。その後、ターゲットアーキテクチャを指定するだけで、crossが残りを処理します。
2. クロステスト:ビルドだけでなく、検証も!
异なるアーキテクチャ用のコードをビルドするのは半分にすぎません。それが実際に動作することを確認するのははるかに難しいです。crossは、ターゲットプラットフォーム用のコードのコンパイルだけでなく、QEMUエミュレーションを使用してテストを実行することもできます。これは、実際のハードウェアにデプロイするのを待つことなく、バグを早期に捕获できる信じられないほど強力な機能です。
想像してみてください:AArch64用のコードを書いているのに、x86_64ラップトップでテストを実行できます。crossがこれを現実のものにしますもちろん、QEMUには制限があります( например、多スレッドテストは遅くなるか、正しく動作しない場合があります)がほとんどのユニットテストにとっては命綱です。
3. ターゲットプラットフォームの最も広いサポート
プロジェクトのREADMEを見ると、サポートされているターゲットのリストは驚くべきものです!AndroidからARM、MIPS、PowerPC、RISC-V、S390x、Sparc上の的各种Linuxバージョン、そしてもちろんWindowsとFreeBSDまで。Emscripten経由のWASMサポートすらあります。これは、crossが most diverseプロジェクト向けの汎用ツールになれることを意味します。
cross testがaarch64-unknown-linux-gnuアーキテクチャ用に実行されている例
動作の仕組み:コンテナとエミュレーションの魔法の裏側
crossの中核原理はコンテナの使用です。cross build --target <target-triple>を呼び出すと、crossはそのターゲットアーキテクチャ用の定義済みDocker(またはPodman)イメージを検索またはダウンロードします。このイメージ内では、コンパイラ、リンカー、ライブラリですべてがすでに構成されています。あなたのコードはこのコンテナにマウントされ、cargoがその中で実行されます。
クロステストcrossはQEMUbinfmt_misc機能を使用します。binfmt_miscにより、カーネルは他のアーキテクチャ用の実行ファイルを実行でき、QEMU経由で自動的にプロキシします。これにより、cross testがARM用にコンパイルされたバイナリを実行すると、カーネルはこれがネイティブ実行可能ファイルではないことを「理解し」、エミュレーションのためにQEMUに渡します。
この elegantなソリューションにより、すべてのクロスコンパイル依存関係がメインベースから分離され、クリーンで安定した状態が維持されます。
crossを始める:思っているより簡単
すでにrustupとコンテナエンジン(DockerまたはPodman)のいずれかがインストール되어 있으면、crossのインストールは非常に簡単です:
cargo install cross --git https://github.com/cross-rs/cross
または、GitHub Releasesからビルド済みバイナリをダウンロードできます。インストール後、crossの使用はcargoの使用とほぼ同じです:
# Сборка проекта для ARM64 Linux
cross build --target aarch64-unknown-linux-gnu
# Запуск тестов для MIPS64 Linux
cross test --target mips64-unknown-linux-gnuabi64
# Компиляция с дополнительными флагами Rustc
cross rustc --target powerpc-unknown-linux-gnu --release -- -C lto
見るわかるように、crossをbuild、test、またはrunコマンドの前に追加し、ターゲットプラットフォームを指定するだけで完了です — Rustプログラムが完全に异なるアーキテクチャ用にコンパイルされ、さらにはテストされます!
ニーズに合わせた柔軟な設定
crossは 또한広範なカスタマイズ機能を提供します。ビルド動作コンテナイメージ、環境変数などを構成できます。設定は、プロジェクトの[workspace.metadata.cross]セクションのCargo.toml、プロジェクトルートにある別のCross.tomlファイルに保存したり、環境変数を通じて渡したりできます。これにより、開発者はcrossを特定のプロジェクト要件に適応させる最大の柔軟性を 얻ます。たとえば、イメージに追加のシステム依存関係を追加したり、独自のDockerイメージを指定したりできます。
誰が特にcrossの恩恵を受けるでしょうか?
- 組み込みシステム開発者:マイコンやシングルボードコンピュータ用にRustでファームウェアを書いている場合、
crossは環境設定に费やす時間を大幅に節約します。 - クロスプラットフォームライブラリまたはアプリケーションに取り組むチーム:コードがサポートされているすべてのプラットフォームで正しく動作することを確認することがはるかに簡単になります。
- CI/CDエンジニア:パイプラインに
crossを統合すると、多くのターゲット向けのビルドとテストの自動化が可能になり、より信頼性の高いリリースを確保できます。 - 新しいアーキテクチャを実験する人々:RISC-VやPowerPCでRustを試してみたいですか?
crossは、VMを設定してコンパイラを手動で構成する必要なく、すぐに使える環境を提供します。
結論:crossを試す価値はありますか?
確かにあります!Rustでのクロスコンパイルの痛苦を経験したことがあれば、crossは本当のの発見になります。それは単なるユーティリティではなく、「箱から出してすぐに動作する」という哲学であり、ツールとの格闘ではなくコードの作成に集中できます。使いやすさ、強力なクロステスト機能、広いプラットフォームサポートにより、 seriousなRust開発者のツールキットにとって不可欠なツールになります。
したがって、まだcrossを試したことがなければ、おそらくこれがチャンスであり、今後のクロスコンパイルの問題のほとんどに別れを告げる時かもしれません。インストールして試してみてください、そしてきっと,长期間にわたってあなたの 곁에 있을 것입니다!
関連プロジェクト