💭

クロスコンパイルRust from Raspberry Pi to macOS

2023/07/17に公開

Raspberry Pi上のRustでmacOS向けのツールを作るためにクロスコンパイルしてみました。

Rustはクロスコンパイルしやすいということを聞いたことがあったのですがちょっとかかりました。

環境

Raspberry Pi OS

cat /etc/debian_version
11.6

cat /proc/version
Linux version 5.15.84-v8+ (dom@buildbot) (aarch64-linux-gnu-gcc-8 (Ubuntu/Linaro 8.4.0-3ubuntu1) 8.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #1613 SMP PREEMPT Thu Jan 5 12:03:08 GMT 2023

macOS

sw_vers
ProductName:	macOS
ProductVersion:	12.6.7
BuildVersion:	21G651

Mac

MacBook Pro(Intel)

プロジェクト作成&プログラム作成

Raspberry Pi上でプロジェクトを作成しツールを作成、ツールはjpgファイルをリサイズする単純なツールで外部クレートはimageを使用

クロスコンパイル

ツールチェインを追加

rustup target listコマンドで対象のターゲットを確認し追加(今回はintel Mac)

rustup target add x86_64-apple-darwin

cargo build --release --target x86_64-apple-darwinでビルドしてみると失敗、cross(クロスコンパイルツールでも失敗)

Cross toolchain for Linux and *BSDをビルド

別(?)のツールチェインをインストール
Cross compiling Rust from Linux to macOSを参考にインストールしてみました。

途自分の環境ではclangとmakeパッケージが不足しているエラーになりパッケージを追加

sudo apt install clang
sudo apt install cmake

また、configure: error: Cannot configure without xml2-configエラーが発生、libxml2-devをインストール

sudo apt install libxml2-dev

しばらく待っていると以下のメッセージが表示してとりあえず完了

esting x86_64-apple-darwin21.4-clang++ -stdlib=libc++ -std=c++11 ... works

testing x86_64h-apple-darwin21.4-clang ... works
testing x86_64h-apple-darwin21.4-clang++ ... works

testing arm64-apple-darwin21.4-clang ... works
testing arm64-apple-darwin21.4-clang++ ... works

testing arm64e-apple-darwin21.4-clang ... clang: error: invalid arch name '-arch arm64e'
failed (ignored)
testing arm64e-apple-darwin21.4-clang++ ... clang: error: invalid arch name '-arch arm64e'
failed (ignored)

testing x86_64-apple-darwin21.4-clang ... works
testing x86_64-apple-darwin21.4-clang++ ... works

Do not forget to add

/home/hoto/src/simple_jpg_resize_for_mac/osxcross/target/bin

to your PATH variable.

All done! Now you can use o32-clang(++) and o64-clang(++) like a normal compiler.

Example usage:

Example 1: CC=o32-clang ./configure --host=i386-apple-darwin21.4
Example 2: CC=i386-apple-darwin21.4-clang ./configure --host=i386-apple-darwin21.4
Example 3: o64-clang -Wall test.c -o test
Example 4: x86_64-apple-darwin21.4-strip -x test

!!! Use aarch64-apple-darwin21.4-* instead of arm64-* when dealing with Automake !!!
!!! CC=aarch64-apple-darwin21.4-clang ./configure --host=aarch64-apple-darwin21.4 !!!
!!! CC="aarch64-apple-darwin21.4-clang -arch arm64e" ./configure --host=aarch64-apple-darwin21.4 !!!

Your SDK does not support i386 anymore.
Use <= 10.13 SDK if you rely on i386 support.

Your SDK does not support libstdc++ anymore.
Use <= 10.13 SDK if you rely on libstdc++ support.

configファイル

[プロジェクト]/.cargo/configファイル作成

[target.x86_64-apple-darwin]
linker = "x86_64-apple-darwin21.4-clang"
ar = "x86_64-apple-darwin21.4-ar"

プログラムのビルド

PATH="$(pwd)/osxcross/target/bin:$PATH" \
cargo build --target x86_64-apple-darwin

debug情報付きの場合はtarget/x86_64-apple-darwin/debug配下に—releaseオプションを付けてビルドするとtarget/x86_64-apple-darwin/releaseフォルダに配下に実行ファイルが作成される

macOS上での実行

scpやsmb等でmac上に実行ファイルをコピーして実行できればOK(※自分の環境ではファイルに実行権限を付与する必要があった)

Discussion