積雲が映像制作したMV『RANGEFINDER』公開中
専門88IO

RustでAArch64へクロスコンパイル

専門

Rustで書いたDiscord BotをRaspberry Pi 3 Model Bで動かすために行ったクロスコンパイルの方法をまとめる。

環境はManjaro LinuxでパッケージマネージャはPacman、Rustup導入済みであることを想定する。

スポンサーリンク

1.リンカーのインストール

ARMv8は別名AArch64といい、ARMアーキテクチャの64ビット命令セットである。

sudo pacman -S aarch64-linux-gnu-gcc
スポンサーリンク

2.ターゲットの追加

バイナリサイズは大きくなるが外部依存をなくすため、静的リンク版である-muslを選択する。

rustup target add aarch64-unknown-linux-musl

3.Cargoの設定記述

追加したターゲットで使用するリンカーを指定する。以下を~/.cargo/configに記述。

[target.aarch64-unknown-linux-musl]
linker = "aarch64-linux-gnu-gcc"
ar = "aarch64-linux-gnu-gcc-ar"

4(a).Cargoでビルド

cargo build --release --target aarch64-unknown-linux-musl

4(b).Zigを用いたビルド

C言語依存のあるコードは(a)でビルド失敗することがある。筆者の場合は依存クレートringのビルドに失敗した。その場合はZigを用いて依存問題を回避する。

1.cargo-zigbuildをインストール

GitHub - rust-cross/cargo-zigbuild: Compile Cargo project with zig as linker
Compile Cargo project with zig as linker. Contribute to rust-cross/cargo-zigbuild development by creating an account on GitHub.
cargo install cargo-zigbuild

2.Cargoでビルド

cargo zigbuild --release --target aarch64-unknown-linux-musl

※ OpenSSLの代替

OpenSSLのクロスコンパイルに失敗する場合は、代わりにrustlsというTLSライブラリを用いる。

主要なクレートではfeaturesrustlsを指定できる。(HTTPクライアントのreqwestでは"rustls-tls"、SQLクレートのsqlxでは"runtime-tokio-rustls"

Cargo.tomlに記述。 詳細は各クレートのDOCS.RSまたはcrates.ioを参照。

[dependencies.reqwest]
version = "*"
features = ["rustls-tls"]

コメント

タイトルとURLをコピーしました