Crosscompiling

probe-rs はほとんどのシステムで実行できますが、システム権限やリソースの制限により cargo install を使用できない場合があります。

そのような場合は、別のアーキテクチャ向けに probe-rs をクロスコンパイルして cargo-flashcargo-embed で使用し、生成された静的バイナリを対象システムへ移動できます。

ここでは対象システムの例として Raspberry pi 400 を使用します。これは、デフォルトの Raspberry PI OS インストール環境では、システムメモリの制限により rustc の最終リンク手順を cargo install で通過できないためです。

対象システムのアーキテクチャを定義したら、この例では armv7-unknown-linux-gnueabihf ですが、クロスコンパイルする方法は 2 つあり、それぞれに長所と短所があります。

Cross を使う

Cross は自身を次のように定義しています。

Rust クレートの「セットアップ不要」のクロスコンパイルと「クロステスト」

主な利点は、静的バイナリのビルドに Docker イメージを使用することで、ホストマシンの共有オブジェクトライブラリを使用することで発生する一般的なクロスコンパイルの問題の影響を受けにくいことです。

この方法の欠点は、Cross Project に依存する必要があることと、ビルド環境の Dockerfile を用意しなければならないことです。その Dockerfile は、クロス C ツールチェーンをインストールした状態で、ビルド対象のシステムにできるだけ近いものにする必要があります。

x86_64 Linux システム上で、Raspberry Pi 400 向けに cargo-flash などのツールをビルドする手順は次のとおりです。

Terminal window
# バイナリをビルドするシステム上で probe-rs をクローンします。
git clone https://github.com/probe-rs/probe-rs
# cross をインストールします
cargo install cross
# probe-rs リポジトリに `cd` で移動し、
# `crossimage` フォルダを作成します
cd probe-rs && mkdir crossimage
# 対象システムに似せた Dockerfile を作成し、
# それを `crossimage` フォルダ内に配置します。

rust-embedded/cross Docker Hub コンテナレジストリから armv7-unknown-linux-gnueabihf のベースシステムを利用できます。

その後、ビルド手順の準備のために、probe-rs前提条件 に従ってイメージを準備してください。

この例で使用する Dockerfile は こちら からダウンロードできます。

Terminal window
# クローンしたリポジトリのルートに Cross.toml ファイルを作成して編集します。
vim Cross.toml

Cross.toml に以下を追加します。これにより、対象アーキテクチャに対してどのコンテナを使用するかを cross に定義できます。

[target.armv7-unknown-linux-gnueabihf]
image = "crossimage"
Terminal window
# `Cross.toml` で定義した名前を指定して、
# コンテナイメージをビルドし、タグ付けします。
docker build -t crossimage crossimage/
# cross を実行してコンパイルします。cross の引数は `cargo` のものと同じです
cross build \
-p probe-rs-tools \
--release \
--target=armv7-unknown-linux-gnueabihf
# 完了

これで、静的にビルドされた cargo-flash バイナリが、クローンしたリポジトリのルートディレクトリにある target/<architecture>/release フォルダ内に生成されます。これを Raspberry Pi 400cargo bin path フォルダ(通常は ~/.cargo/bin)へ移動できます。

LLVM を使う

クロスコンパイルに LLVM を使用する場合は、単に cargo-flash バイナリを生成する範囲を超える可能性があるため、LLVMガイド にあるクロスコンパイル手順に従ってください。