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 ...
cargo install cargo-zigbuild
2.Cargoでビルド
cargo zigbuild --release --target aarch64-unknown-linux-musl
※ OpenSSLの代替
OpenSSLのクロスコンパイルに失敗する場合は、代わりにrustls
というTLSライブラリを用いる。
主要なクレートではfeatures
でrustls
を指定できる。(HTTPクライアントのreqwest
では"rustls-tls"
、SQLクレートのsqlx
では"runtime-tokio-rustls"
)
Cargo.toml
に記述。 詳細は各クレートのDOCS.RSまたはcrates.ioを参照。
[dependencies.reqwest] version = "*" features = ["rustls-tls"]
コメント