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でビルドして、完全に独立したバイナリとして作る方が、移植性が高くて良いのではないですかね?

参考

pagefault.blog

注意

どうもsumoでのビルドが失敗します。

github.com

続きはないかもしれません。