みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

yoctoでセルフコンパイル環境を作成する

yoctoではクロスコンパイル用のSDKを簡単に作成することができる。

実はセルフコンパイル環境もさほど難しくなく作成できるが、こちらはあまり知られていない気がする。

ロスコンパイルできる環境があれば、PCのほうがリソースはリッチなのでコンパイル時間も短くて住むので、セルフコンパイル環境を構築する必要性を感じないかもしれない。

しかし、Makefileなどがセルフコンパイルにしか対応していない場合などで、 クロスコンパイル対応が難しい場合など、手っ取り早くセルフコンパイルしたい場合がある。

(EXTRA_)IMAGE_FEATURESを設定することで、セルフコンパイル環境が作成できることを調査したのでメモ。

環境構築

ラズベリーパイ3向けの環境。いつものやつ。

ソース取得

$ mkdir -p rpi-sumo/layers
$ cd rpi-sumo/layers
$ git clone git://git.yoctoproject.org/poky.git -b sumo
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b sumo
$ git clone git://git.openembedded.org/meta-openembedded -b sumo
$ cd ../

環境変数設定

$ source layers/poky/oe-init-build-env build

自動的にビルドディレクトリに移動される。 これで、bitbake関連のツールが使用可能になる。

レイヤ追加

$ 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/

local.confの修正

MACHINEの行を修正する。

MACHINE = "raspberrypi3"
DL_DIR ?= "${TOPDIR}/../downloads"

# enable uart
ENABLE_UART = "1"

# systemd
DISTRO_FEATURES_append = " systemd pam"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""

セルフコンパイル環境の調査

セルフコンパイル環境を含んでいると見られるイメージには次の2つがある。

  • core-image-lsb-sdk
  • core-image-sato-sdk

これらにはそれぞれ「-sdk」がついていないイメージがある。

  • core-image-lsb
  • core-image-sato

「bitbake -e」で「IMAGE_FEATURES」変数を見てみる。

$ bitbake core-image-lsb -e | grep '^IMAGE_FEATURES='
IMAGE_FEATURES="debug-tweaks hwcodecs package-management splash ssh-server-openssh"

$ bitbake core-image-lsb-sdk -e | grep '^IMAGE_FEATURES='
IMAGE_FEATURES="debug-tweaks dev-pkgs eclipse-debug hwcodecs package-management splash ssh-server-openssh tools-debug tools-profile tools-sdk tools-testapps"

$ bitbake core-image-sato -e | grep '^IMAGE_FEATURES='
IMAGE_FEATURES="debug-tweaks hwcodecs package-management splash ssh-server-dropbear x11-base x11-sato"

$ bitbake core-image-sato-sdk -e | grep '^IMAGE_FEATURES='
IMAGE_FEATURES="debug-tweaks dev-pkgs eclipse-debug hwcodecs package-management splash ssh-server-openssh tools-debug tools-profile tools-sdk tools-testapps x11-base x11-sato"

それぞれのイメージで「-sdk」によって追加されるは次のようになっている。

  • dev-pkgs
  • eclipse-debug
  • tools-debug
  • tools-profile
  • tools-sdk
  • tools-testapp

「core-image-base-sdk」のようなイメージは標準では存在しないので、「core-image-base」に対して「sdk」相当の機能を追加するには、これら6つの機能を「IMAGE_FEATURES」に追加してやればよい。 ただしlocal.confからは「IMAGE_FEATURES」変数を操作することは推奨されていない1ので「EXTRA_IMAGE_FEATURES」変数に追加する。

local.confに次の内容を追加する。

EXTRA_IMAGE_FEATURES_append = " dev-pkgs eclipse-debug tools-debug tools-profile tools-sdk tools-testapp"

エラー

ERROR: Nothing PROVIDES 'core-image-base'
core-image-base was skipped: 'tools-testapp' in IMAGE_FEATURES (added via EXTRA_IMAGE_FEATURES) is not a valid image feature. Valid features: allow-empty-password dbg-pkgs debug-tweaks dev-pkgs doc doc-pkgs eclipse-debug empty-root-password hwcodecs nfs-client nfs-server package-management post-install-logging ptest-pkgs read-only-rootfs splash ssh-server-dropbear ssh-server-openssh staticdev-pkgs tools-debug tools-profile tools-sdk tools-testapps x11 x11-base x11-sato

tools-testappが原因でエラーが発生したので削除する。

EXTRA_IMAGE_FEATURES_append = " dev-pkgs eclipse-debug tools-debug tools-profile tools-sdk"

その他のツール

cmakeやgitなどはインストールされないので、必要に応じて追加する。

IMAGE_INSTALL_append = " git cmake"

  1. best practices dictate using IMAGE_FEATURES from within a recipe and using EXTRA_IMAGE_FEATURES from within your local.conf file, which is found in the Build Directory.