はじめに
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のコンフィグファイルも一緒に提供してあげると、ユーザーの間口が広がるかもしれない。