クロスコンパイルRust from Raspberry Pi to macOS
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