みつきんのメモ

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

Yocto Project レシピ名とパッケージ名の基本

はじめに

Yocto Projectが使用するBitBakeのレシピ名とパッケージ名について。 混同しがちだけど、知らないとエラーにハマるので整理する。

BitBakeのターゲット

筆者が担当する講座やYocto Projectの解説記事では以下のように説明する。

  1. BitBakeが処理するのはレシピ
  2. 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について紹介した。

普段はあまり意識しないが理解していないと解決できないエラーに遭遇することがある。