複数のアーキテクチャのためのRustコードのクロスコンパイル

アイデアを得て、計画し、Rustコードを実装し、最終ビルドをリリースすることは、予期しない問題に満ちた長いプロセスです。 コードをクロスコンパイルすると、より多くのユーザーにリーチできますが、さまざまなランタイム環境用の実行可能ファイルを構築するための知識が必要です。 幸いなことに、この投稿は、Windows用のx86を含む複数のアーキテクチャでRustアプリケーションを実行するのに役立ちます。

概要

できるだけ多くのユーザーでアイデアを精査したいので、複数のアーキテクチャ用にコードをコンパイルできる必要があります。 ユーザーは使用するマシンとOSについて独自の好みを持っているため、好みのセットアップでそれらを満たすために最善を尽くす必要があります。 そのため、開発者の労力を最小限に抑えて、複数のターゲット環境にコードをエクスポートする複数の方法をサポートするのに適した言語またはフレームワークを選択することが重要です。 また、このエクスポートプロセスを自動化するのに役立つツールを用意しておくことをお勧めします。

最初に時間をかけて適切なコーディング言語と自動化ツールを選択すれば、面倒な手動手順を使用せずにより多くのオーディエンスにリーチできないという頭痛の種を回避できます。 基本的に、コードとオーディエンスの間の障壁をできるだけ取り除く必要があります。

この投稿では、カスタムDockerイメージの構築、そのイメージからのコンテナのインスタンス化、そして最後にそのコンテナを使用してRustコードをクロスコンパイルする方法について説明します。 コードがコンパイルされ、作業ディレクトリ内にターゲット環境用の実行可能ファイルが作成されます。

必要なもの

始める

私のRustディレクトリの構造は次のとおりです。

.
├── Cargo.lock
├── Cargo.toml
└── src
  └── main.rs

 

ロックファイルと toml ファイルはどちらも同じ形式を共有します。 ロックファイルには、パッケージとそのプロパティが一覧表示されます。 Cargoプログラムはロックファイルを保持しており、このファイルを手動で編集しないでください。 この toml ファイルは、プロジェクトのメタデータを指定するマニフェスト ファイルです。 ロックファイルとは異なり、ファイルを編集できます toml 。 実際のRustコードは.main.rs私の例では、 main.rs ファイルにはASCIIアートグラフィックスを使用するゲームSnakeのバージョンが含まれています。 これらのファイルはLinuxマシン上で実行され、私たちの目標はそれらをWindows実行可能ファイルにクロスコンパイルすることです。

Rustコードのクロスコンパイルは、Dockerを介して行われます。 最新バージョンの Docker デスクトップをダウンロードしてインストール します。ワークステーションのOSに一致するバージョンを選択し、macOSを実行している場合は、IntelまたはApple(Mシリーズ)プロセッサバリアントのいずれかを選択することを忘れないでください。

ドッカーイメージの作成

Docker Desktop をインストールしたら、Rust ディレクトリに移動します。 次に、そのディレクトリ内に という Dockerfile 空のファイルを作成します。 これには Dockerfile 、Docker イメージの作成に必要な手順が含まれます。 次のコードを に貼り付けます Dockerfile

FROM rust:latest 

RUN apt update && apt upgrade -y 
RUN apt install -y g++-mingw-w64-x86-64 

RUN rustup target add x86_64-pc-windows-gnu 
RUN rustup toolchain install stable-x86_64-pc-windows-gnu 

WORKDIR /app 

CMD ["cargo", "build", "--target", "x86_64-pc-windows-gnu"]

 

イメージのセットアップ

最初の行は、Rustベースイメージからイメージを作成します。 次のコマンドは、イメージのパッケージの内容を最新バージョンにアップグレードし、Windows アプリケーションをビルドするオープン ソース プログラムである mingw をインストールします。

ウィンドウ用のコンパイル

次の2行は、クロスコンパイルを機能させるための鍵です。 rustupプログラムは、Rustのコマンドラインツールチェーンマネージャーであり、Rustがさまざまなターゲットプラットフォームのコンパイルをサポートできるようにします。 Rustに追加するターゲットプラットフォームを指定する必要があります(ターゲットはRustでコンパイルできるアーキテクチャを指定します)。 次に、そのツールチェーンをRustにインストールします。 ツールチェーンは、アプリケーションを目的のターゲットアーキテクチャにコンパイルするために必要な一連のプログラムです。

コードの構築

次に、画像の作業ディレクトリを app フォルダーに設定します。 最後の行は、 CMD 実行中のコンテナの命令を利用します。 私たちのコマンドは、RustビルドシステムであるCargoに、指定されたターゲットアーキテクチャにRustコードをビルドするように指示します。

イメージの構築

を保存し Dockerfile、ターミナルでそのディレクトリに移動しましょう。 ターミナルで、次のコマンドを実行します。

ドッカービルド。 -t rust_cross_compile/ウィンドウズ

 

Docker は、現在のディレクトリの Dockerfile. このコマンドは、この画像 rust_cross_compile/windowsに .

コンテナの実行

イメージを作成したら、次のコマンドを実行してコンテナーを実行できます。

docker run --rm -v 'your-pwd':/app rust_cross_compile/windows

 

-rm このオプションは、コマンドの完了時にコンテナーを削除します。このコマンド -v を使用すると、コンテナー ストレージをローカル コンピューターにリンクすることで、コンテナーが存在した後もデータを永続化できます。 Rustディレクトリへの絶対パスに置き換え ‘your-pwd’ ます。 上記のコマンドを実行すると、Rustディレクトリ内に次のディレクトリ構造が表示されます。

.
├── Cargo.lock
├── Cargo.toml
└── src
  └── main.rs
└── target
  └── debug
  └── x86_64-pc-windows-gnu
  	└── debug
		termsnake.exe

 

Rustコードの実行

新しく作成されたディレクトリ targetが表示されます。 このディレクトリには、ターゲットとするアーキテクチャにちなんで名付けられるサブディレクトリが含まれます。 このディレクトリ内には、実行可能ファイルを含むデバッグディレクトリが表示されます。 実行可能ファイルをクリックすると、Windowsマシンでアプリケーションを実行できます。 私の場合、私はゲームスネークをプレイし始めることができました:

 

ヘビのgif、

 

armv7で錆を実行する

アプリケーションをWindows実行可能ファイルにコンパイルしましたが、アプリケーションをarmv7アーキテクチャで実行するために、次のように変更できます Dockerfile

FROM rust:latest 

RUN apt update && apt upgrade -y 
RUN apt install -y g++-arm-linux-gnueabihf libc6-dev-armhf-cross

RUN rustup target add armv7-unknown-linux-gnueabihf 
RUN rustup toolchain install stable-armv7-unknown-linux-gnueabihf 

WORKDIR /app 

ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc CC_armv7_unknown_Linux_gnueabihf=arm-linux-gnueabihf-gcc CXX_armv7_unknown_linux_gnueabihf=arm-linux-gnueabihf-g++

CMD ["cargo", "build", "--target", "armv7-unknown-linux-gnueabihf"]

 

aarch64で錆を実行する

または、aarch64をサポートするために以下で編集 Dockerfile することもできます。

FROM rust:latest 

RUN apt update && apt upgrade -y 
RUN apt install -y g++-aarch64-linux-gnu libc6-dev-arm64-cross

RUN rustup target add aarch64-unknown-linux-gnu 
RUN rustup toolchain install stable-aarch64-unknown-linux-gnu

WORKDIR /app 

ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc CC_aarch64_unknown_linux_gnu=aarch64-linux-gnu-gcc CXX_aarch64_unknown_linux_gnu=aarch64-linux-gnu-g++

CMD ["cargo", "build", "--target", "aarch64-unknown-linux-gnu"]

 

作成せずに Dockerfile 異なるアーキテクチャ用にコンパイルする別の方法は、 cargo install -f cross コマンドを使用してクロスプロジェクトをインストールすることです。 そこから、次のコマンドを実行してビルドを開始します。

クロスビルド --ターゲット x86_64-PC-ウィンドウズ-GNU

結論

Docker Desktop を使用すると、さまざまな言語やフレームワークをサポートできる開発環境をすばやく構築できます。 多くのターゲットアーキテクチャ用にコードをビルドしてコンパイルできます。 この投稿では、Windowsで実行するためにLinuxで書かれたRustコードを取得しましたが、その例だけに限定する必要はありません。 他の多くの言語やアーキテクチャを選択できます。 または、Docker Buildxは、これらの同じ問題を解決するのに役立つように設計されたツールです。 Buildx のその他のドキュメント については、こちらをご覧ください

フィードバック

「複数のアーキテクチャのRustコードのクロスコンパイル」に関する0の考え