みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

Yocto meta-raspberrypi環境の作成にkasを使ってみる

はじめに

meta-raspberrypiのQuick Startを眺めていると、Quick Start with kasという項目ががあった。

kasというコマンドに見覚えがなかったので調べてみると、下記のようにあった。

This tool provides an easy mechanism to setup bitbake based projects.

bitbakeをラップして、操作を簡略化するためのツールのようだ。

試しにmeta-raspberrypiをkasで作成してみる。

kasのインストール

pipコマンドでインストールする。

$ pip3 install --user kas

meta-raspberrypiの取得

kasはプロジェクト設定が記述してあるymlにある依存関係を解決する機能がある。 この機能を確かめるために、pokyなど他のメタデータはあえてダウンロードしない。

$ mkdir kas_meta-raspberrypi
$ cd kas_meta-raspberrypi
$ git clone git://git.yoctoproject.org/meta-raspberrypi -b dunfell

kasによるビルド

下記のコマンドでビルドする。

$ kas build meta-raspberrypi/kas-poky-rpi.yml

動作ログ

meta-raspberrypiはdunfellブランチだが、依存関係があるメタデータkas-poky-rpi.ymlの内容に従う。

kasの実行時にブランチを上書きするようなオプションも見当たらないので、使用するブランチを変更したければkas-poky-rpi.ymlを編集する必要がありそう。

Build Configuration:
BB_VERSION           = "1.47.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "ubuntu-18.04"
TARGET_SYS           = "arm-poky-linux-gnueabi"
MACHINE              = "raspberrypi4"
DISTRO               = "poky"
DISTRO_VERSION       = "3.1+snapshot-20200902"
TUNE_FEATURES        = "arm vfp cortexa7 neon vfpv4 thumb callconvention-hard"
TARGET_FPU           = "hard"
meta-networking      
meta-oe              
meta-perl            
meta-python          = "master:6a2b4a8ca4fb407cc93b7eb865cb5f4e324585be"
                     = "master:5144a99a696a8a72c0765ea0e8be8ceafaa78f85"
                     = "dunfell:93305f7c3a9c338a3d2daef61514f61b4256f979"
meta                 
meta-poky            
meta-yocto-bsp       = "master:104ff3c834d9ea60de4600fca374c0bdc9ca843d"

自動生成のファイル

local.conf

kasによって生成されたlocal.confを示す。

# debug-tweaks
EXTRA_IMAGE_FEATURES = "debug-tweaks"

# diskmon
BB_DISKMON_DIRS = "\
    STOPTASKS,${TMPDIR},1G,100K \
    STOPTASKS,${DL_DIR},1G,100K \
    STOPTASKS,${SSTATE_DIR},1G,100K \
    STOPTASKS,/tmp,100M,100K \
    ABORT,${TMPDIR},100M,1K \
    ABORT,${DL_DIR},100M,1K \
    ABORT,${SSTATE_DIR},100M,1K \
    ABORT,/tmp,10M,1K"

# reduce_diskspace
INHERIT += "rm_work_and_downloads"

# standard
CONF_VERSION = "1"
PACKAGE_CLASSES = "package_rpm"
SDKMACHINE = "x86_64"
USER_CLASSES = "buildstats image-mklibs image-prelink"
PATCHRESOLVE = "noop"

MACHINE ??= "raspberrypi4"
DISTRO ??= "poky"
BBMULTICONFIG ?= ""

INHERIT += "rm_work_and_downloads"が設定されている。ディスク容量を空けるために中間ファイルを削除している。 これは、メタデータを修正する必要がないケースでは有効だが、パッチの作成やデバッグに必要なファイルが削除されてしまう。

bblayers.conf

こちらは特筆することは無い。bitbake-layersでいちいち追加しなくて良いのはラク

# standard
POKY_BBLAYERS_CONF_VERSION = "2"
BBPATH = "${TOPDIR}"
BBFILES ?= ""

BBLAYERS ?= " \
    /home/mickey/work/yocto/kas_meta-raspberrypi/meta-openembedded/meta-networking \
    /home/mickey/work/yocto/kas_meta-raspberrypi/meta-openembedded/meta-oe \
    /home/mickey/work/yocto/kas_meta-raspberrypi/meta-openembedded/meta-perl \
    /home/mickey/work/yocto/kas_meta-raspberrypi/meta-openembedded/meta-python \
    /home/mickey/work/yocto/kas_meta-raspberrypi/meta-qt5/ \
    /home/mickey/work/yocto/kas_meta-raspberrypi/meta-raspberrypi/ \
    /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta \
    /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta-poky \
    /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta-yocto-bsp"

コンパイルエラー

通常のbitbakeとほぼ同じ。特に解析に役立つ付加情報があるわけではなさそう。

| ../libnl-3.5.0/lib/route/cls/ematch_syntax.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
| WARNING: /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628:191 exit 1 from 'exit 1'
| WARNING: Backtrace (BB generated script):
|   #1: bbfatal_log, /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628, line 191
|   #2: die, /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628, line 166
|   #3: oe_runmake, /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628, line 161
|   #4: autotools_do_compile, /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628, line 156
|   #5: do_compile, /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628, line 151
|   #6: main, /home/mickey/work/yocto/kas_meta-raspberrypi/build/tmp/work/cortexa7t2hf-neon-vfpv4-poky-linux-gnueabi/libnl/1_3.5.0-r0/temp/run.do_compile.9628, line 195
| 
| Backtrace (metadata-relative locations):
|   #1: bbfatal_log, /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta/classes/logging.bbclass, line 72
|   #2: die, /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta/classes/base.bbclass, line 56
|   #3: oe_runmake, /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta/classes/base.bbclass, line 65
|   #4: autotools_do_compile, /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta/classes/autotools.bbclass, line 243
|   #5: do_compile, autogenerated, line 2
ERROR: Task (/home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta/recipes-support/libnl/libnl_3.5.0.bb:do_compile) failed with exit code '1'
NOTE: Tasks Summary: Attempted 5670 tasks of which 1 didn't need to be rerun and 1 failed.

Summary: 1 task failed:
  /home/mickey/work/yocto/kas_meta-raspberrypi/poky/meta/recipes-support/libnl/libnl_3.5.0.bb:do_compile
Summary: There were 2 WARNING messages shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.

kasの-d, --debug Enable debug loggingオプションは、kas自身のデバッグ用っぽいので、こちらもあまりbitbakeのエラーには有効ではなさそう。

他のマシンむけビルド

デフォルト以外のマシン向けにビルドしたい場合は環境変数KAS_MACHINEで設定する。

$ KAS_MACHINE="raspberrypi3" kas build meta-raspberrypi/kas-poky-rpi.yml

他のイメージのビルド

core-image-satoをビルドする場合は下記のように--targetオプションで指定する。

$ kas build meta-raspberrypi/kas-poky-rpi.yml --target core-image-sato

個別のパッケージをビルドする

個別のパッケージのみビルドする場合も--targetオプションで指定する。

$ kas build meta-raspberrypi/kas-poky-rpi.yml --target virtual/kernel

個別のタスクを実行する

do_compileなど個別のタスクを実行したい場合は-c TASK, --cmd TASK, --task TASKオプションで指定する。

$ kas build meta-raspberrypi/kas-poky-rpi.yml --target virtual/kernel -c compile

まとめ

kasを使ってmeta-raspberrypiをビルドしてみた。

第一印象としてはカーネルなどにパッチを作成する必要がある場合や、メタデータ自体が開発中の場合はkasを使用するよりもbitbakeを直接使用するほうが便利。

meta-raspberrypiの例では、kas-poky-rpi.ymlで指定されたブランチをコマンド実行時に上書きできないため、 meta-raspberrypi以外のメタデータはmasterブランチが適用されてしまうため、zeusなどさらに古いブランチを使用する場合は、 各パッケージのバージョンのミスマッチによってビルドエラーになる可能性が高くなる。

これについてはmeta-raspberrypi側で各ブランチ毎にkas-poky-rpi.ymlをメンテナンスするなどで対処できるかもしれないが。

kas自体は、リリースバージョンなどのカスタマイズが必要ない状態のメタデータからLinuxイメージを作成する場合に、 メタデータ同士の依存関係の解決などを自動化してくれるため、便利なツールだと言える。

自分がメタデータを公開する際には、kasのコンフィグファイルも一緒に提供してあげると、ユーザーの間口が広がるかもしれない。