📖

yocto: レシピ、ディストロ、local.conf の違い

に公開

yocto では様々なファイルでビルドの設定をします。
しかし、どのファイルに何の設定を書くべきか悩みます。例えば IMAGE_INSTALL をどこに書くべきか、初学者にはちんぷんかんぷんです(ですよね?)。

そこで各設定の役割をまとめてみました。

Image Recipe

インストールするパッケージの指定や、パーティションの構成などを定義します。

例:

$ cat meta-mylayer/recipes-myapp/images/myapp-image.bb

require recipes-core/images/core-image-minimal.bb
DESCRIPTION = "sample image"
inherit myapp-wic
IMAGE_INSTALL:append = " vim"

ここではcore-image-minimal をベースに、パーティション構成 myapp-wic と、vim のインストールを指定しています。
このファイルは bitbake myapp-image のように指定して使用します。
wic ファイルの作成方法は手前を参照してください:
https://zenn.dev/zakkie/articles/5a7e37e97e8843#ディスクイメージにパーティションを追加する-(レイヤに組み込む)

App Recipe

単にレシピといったらこちらを指すようですが、Image Recipe と紛らわしいので、私は App Recipe と呼んでいます。ChatGPT もそのように発しています。正しいのかよく分かりません。

このファイルでは、何かのアプリケーションのビルドやインストール方法などを定義します。
例:

SUMMARY = "Some APP"
DESCRIPTION = "Some APP"
LICENSE = "CLOSED"

# 依存するパッケージを定義
RDEPENDS:${PN} += " \
  vim \
"

SRC_URI = "file://app"

S = "${WORKDIR}"

do_install () {
        install -d ${D}${sysconfdir}/myapp
        install -m 0755 version ${D}${sysconfdir}/myapp/version
}

Distro

システム全体のルールやポリシーを書きます。

  • パッケージャーに何を使うのか PACKAGE_CLASSES = "package_rpm"
  • どの機能を有効にするのか DISTRO_FEATURES:append = " systemd ipv6 wifi"
  • SysVInit → systemd への切り替え VIRTUAL-RUNTIME_init_manager = "systemd"

などです。
例えば meta-mylayer/conf/distro/mydistro.conf といったファイルに

よくある勘違いとして、IMAGE_INSTALL はここでは定義しません。書くことはでき、エラーにもならないのですが、動作に反映されませんでした(小一時間溶かしました...)。Linux のディストリビューションとは異なる概念?のようです。

なお、DISTRO は local.conf で定義します。イメージレシピでは定義 しません
DISTRO はビルド全体の方針を決定する変数です。イメージレシピで DISTRO を定義してしまうと、複数のイメージが異なる DISTRO を要求した場合に矛盾が発生してしまいます。

例: meta-mylayer/conf/distro/mydistro.conf

DISTRO = "mydistro"
DISTRO_NAME = "Custom Distro"
DISTRO_VERSION = "1.0"
DISTRO_CODENAME = "mydistro"

require conf/distro/poky.conf

DISTRO_FEATURES:append = " wifi"
EXTRA_IMAGE_FEATURES += "package-management"
PACKAGE_CLASSES = "package_rpm"

LICENSE_FLAGS_ACCEPTED = "synaptics-killswitch"

local.conf

基本的になんでも書けます。ただし、開発等で一時的に設定を変更して試す場合などに限ります。
よく練られた Distro やイメージレシピを使った場合、本番用の local.conf は以下の2つのみになります

DISTRO = "mydistro"
MACHINE = "genericx86-64"

あるいはビルド並列数などの定義もここで定義します。

Discussion