Yocto Project レシピ名とパッケージ名の基本
はじめに
Yocto Projectが使用するBitBakeのレシピ名とパッケージ名について。 混同しがちだけど、知らないとエラーにハマるので整理する。
BitBakeのターゲット
筆者が担当する講座やYocto Projectの解説記事では以下のように説明する。
- BitBakeが処理するのはレシピ
- BitBake実行時に指定するのはレシピ名
$ bitbake <レシピ名>
実は、2については正確ではなくて、厳密に言うと「BitBake実行時に指定するのはPROVIDER」が正しい。
$ bitbake <PROVIDER>
PROVIDERはレシピにおいて「PROVIDES」で設定される値。ただしほとんどのケースでは「PROVIDER=レシピ名」となる。 そのため、説明を簡単にするために「BitBake実行時にはレシピ名を指定します」としている。
PROVIDERの例
PROVIDERとレシピ名が一致しないわかりやすい例はカーネルレシピのPROVIDER。 Yocto Projectのカーネルレシピは"linux-yocto"だが以下のようにコマンドを実行しても同じ効果が得られる
$ bitbake virtual/kernel
これはkernel.bbclassで以下のように記述されているため、カーネルレシピの大半では「virtual/kernel」がPROVIDESされているからである。
PROVIDES += "virtual/kernel"
PROVIDERの選択
複数のレシピで同じPROVIDERを提供している場合、BitBakeはどれを選択するべきか判断できないので、
PREFERRED_PROVIDER変数を使用する。ほとんどのケースではマシンのコンフィグファイルで以下のようにしている。
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
i.MX系のBSPレイヤであれば"linux-imx"や"linux-fslc"などが設定される。
インストール対象
ルートFSにソフトウェアを追加したい場合以下のようにする。
IMAGE_INSTALL:append = " <パッケージ名>"
ルートFSに追加するのはBitBakeがレシピを処理して作成されたパッケージであるため、このようになっている。 こちらもほとんどの場合「レシピ名=パッケージ名」であるため意識することが少ない。
しかし「レシピ名=パッケージ名」も正確ではなく、「レシピ名と同じ名前のパッケージ作成されるようになっている」だけで ほとんどのケースでは1つのレシピから複数のパッケージ(dbgやsrc,docなど)が作成されるようになっている。
PACKAGE変数のデフォルト値はbitbake.confで以下のように設定されている。
PACKAGES = "${PN}-src ${PN}-dbg ${PN}-staticdev ${PN}-dev ${PN}-doc ${PN}-locale ${PACKAGE_BEFORE_PN} ${PN}"
特殊なケース
meta-oeのフォント関連のレシピ(ttf-ipaなど)では、レシピ名と同名のパッケージを提供しないケースが存在する。
その場合、下記は成功する。
$ bitbake ttf-ipa
が、下記はエラーになる。
IMAGE_INSTALL:append "ttf-ipa
具体的には以下のようなエラーになる。
$ bitbake core-iamge-minimal ... (snip) ... ERROR: Nothing RPROVIDES 'ttf-ipa' (but /home/mickey/yocto/scarthgap/poky/meta/recipes-core/images/core-image-minimal.bb RDEPENDS on or otherwise requires it) NOTE: Runtime target 'ttf-ipa' is unbuildable, removing... Missing or unbuildable dependency chain was: ['ttf-ipa'] ERROR: Required build target 'core-image-minimal' has no buildable providers. Missing or unbuildable dependency chain was: ['core-image-minimal', 'ttf-ipa']
エラーの原因
原因は、ttf-ipaのレシピでは以下のようにPACKAGE変数を設定していること。
PACKAGES = "ttf-ipag ttf-ipagp ttf-ipam ttf-ipamp"
このためレシピ名と一致するパッケージ名が存在しない。
PACKAGESとRPROVIDES
厳密に言うと、IMAGE_INSTALLで参照するのは「RPROVIDER」である。RPROVIDERはレシピにおいて「RPROVIDES」で設定される。 ほとんどの場合「RPROVIDER=パッケージ名」となる。
PROVIDES同様、別名をつけることも可能となっている。
対処方法
このようなエラーになった場合、正しいRPROVIDERを調べる必要がある。 RPROVDERは未定義のケースがほとんどで「PACKAGES」を調べる必要がある。 そのため確実に調べるには以下のようにする。
$ bitbake <PROVIDER> -e | grep '^RPROVIDES.*=' $ bitbake <PROVIDER> -e | grep '^PACKAGES='
ttf-ipaのケースでは以下のようになるので見つかったどれかをIMAGE_INSTALLに含めれば良い。
$ bitbake ttf-ipa -e | grep '^PACKAGES=' PACKAGES="ttf-ipag ttf-ipagp ttf-ipam ttf-ipamp"
まとめ
レシピ名とパッケージ名 PROVIDESとRPROVIDESについて紹介した。
普段はあまり意識しないが理解していないと解決できないエラーに遭遇することがある。