YoctoでRust①〜meta-rustのhello-worldビルド〜
はじめに
組込みLinuxでRustする場合、普通にホストマシンで開発して、普通にホストマシンのRustコンパイラでクロスビルドしたものをターゲットに持って行っています。 これで事足りているのですが、前々から興味があったため、YoctoでRustアプリケーションをビルドします。
やってみてわかったことは、アプリケーションを複数個、ディストリビューションとして一括管理したい場合でなければ、RustアプリケーションをYoctoでビルドするうまみはないように思えました。 環境だけYoctoで構築し、sysrootをCargoの設定ファイルで読み込んで開発するのが良さそうに思えます。
ターゲット
ハードはラズパイ3 & Yoctoのバージョンはrockoです。
bitbake
前準備
sudo apt install gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping libsdl1.2-dev xterm
ソースダウンロード
git clone -b rocko git://git.yoctoproject.org/poky.git git clone -b rocko git://git.yoctoproject.org/meta-raspberrypi git clone -b rocko git://git.openembedded.org/meta-openembedded git clone -b rocko https://github.com/meta-rust/meta-rust.git
NOTE: sumoではビルドが失敗します。rockoではビルドが成功することがわかっています。
環境設定
source layers/poky/oe-init-build-env build
レイヤ追加
bitbake-layers add-layer ../layers/meta-openembedded/meta-oe bitbake-layers add-layer ../layers/meta-openembedded/meta-python bitbake-layers add-layer ../layers/meta-openembedded/meta-networking bitbake-layers add-layer ../layers/meta-raspberrypi bitbake-layers add-layer ../layers/meta-rust
local.conf修正
MACHINEをラズパイ3にします。
MACHINE = "raspberrypi3"
rust-hello-worldのビルド
Rustのサンプルプロジェクトであるrust-hello-world
がビルドできるかどうか、試してみます。
bitbake rust-hello-world
i7-8565Uで2時間ほどかかりました。
rustコンパイラのバージョンを確認してみます。 ビルド生成物のnative用ツールチェインにRustコンパイラがあります。
$ build/tmp/work/x86_64-linux/rust-cross-arm$ ls 1.24.1-r0
1.24.1…。 古いですねぇ…。
Rustのツールチェイン関係では、RustコンパイラとLLVMがビルドされています。
$ ls rust* rust-cross-arm: 1.24.1-r0 rust-llvm-native: 1.24.1-r0 rust-native: 1.24.1-r0
そして、LLVMが27GB、Rustコンパイラが13GBと、ものすごい容量を占めていました。 ビルド時間も、LLVMとRustコンパイラをビルドしてる時間が長く、その割に、ツールチェインが古いので、割に合わない感じです。 Rustはデフォルトでクロスコンパイルできるので、どうしてもYoctoでビルドしてdistributionとして配布したい、という状況でなければ、わざわざYoctoでビルドするうまみはなさそうです。
muslでビルドして、完全に独立したバイナリとして作る方が、移植性が高くて良いのではないですかね?
参考
注意
どうもsumoでのビルドが失敗します。
続きはないかもしれません。