🐧 Linux 総合学習プラットフォーム
組込みビルド Yocto/Buildroot ・ 上級

Yoctoレシピを書く(.bb・レイヤ)

Yoctoの本当の力は「自分のソフトを組込みイメージに組み込む」ところで発揮されます。その設計図がレシピ(.bb ファイル)です。ここでは1本のソフトの取得元・ライセンス・ビルド手順・インストール先をレシピにどう書くか、自作レイヤ meta-mylayer をどう作って自分の変更をきれいに分離するか、既存レシピを上書きする bbappend までを学びます。最初の一歩は、画面に文字を出すだけの hello を1本、自力でイメージに乗せることです。

Yocto でイメージを一度ビルドできても、そこに「自分のソフト」を1本も乗せられなければ半人前だ。既製品を組み合わせるだけでなく、自作物を組込みイメージに載せる——そこからが本番になる。

その鍵がレシピ(bs-recipe)だ。レシピとは、ある1つのソフトについて「どこから取ってきて、どう作って、どこに置くか」を書いた設計図で、ファイル名は .bb で終わる。

最初は .bb の中身が呪文のように見えるかもしれない。だが書いてあることは案外シンプルで、「取得元・ライセンス・ビルド手順・インストール手順」の4点にほぼ集約される。

🔗
たとえレシピは料理のレシピそのものだ。材料の仕入れ先(SRC_URI)、この料理の権利表示(LICENSE)、調理の手順(do_compile)、盛り付けと配膳(do_install)——並びまでよく似ている。

📄 レシピ(.bb)=1ソフトの作り方

1つの .bb ファイルは、原則として1つのソフトウェアに対応する。curl のレシピ、自作アプリのレシピ、というように、ソフトごとに設計図が1枚ずつある。

レシピの先頭では、そのソフトの説明とライセンスを宣言する。LICENSE 行は必須で、Yocto はここが空だとビルドを止める。素性の分からないものを混ぜない、という組込みの規律がここに表れている。

SRC_URI は、ソースの取得元を書く行だ。ネット上の tarball の URL、git リポジトリ、あるいは自分のレシピの隣に置いたファイルを file:// で指すこともできる。

LICENSE = "MIT" SRC_URI = "file://hello.c" (ライセンスはMIT、ソースは隣の hello.c を使う、という宣言)
取得元SRC_URILICENSE組み立てdo_compile配置do_installrootfsbitbake がこの順にタスクを実行する

🛠️ do_compile と do_install

レシピの中身のうち、実際の作業を書くのが do_ で始まる関数群だ。中でも要になるのが、ソースをビルドする do_compile と、成果物を置き場所へ収める do_install の2つになる。

do_compile には「どうビルドするか」を書く。多くのソフトは Makefile や configure を持つので、Yocto 側の定型クラスを継承すれば、この関数を自分で書かずに済むことも多い。単純な hello なら数行で足りる。

do_install には「作ったものをどこへ置くか」を書く。ここで置き先に指すのは、実機の / ではなく ${D} という一時的な組み立て場所だ。この ${D} の中身が、最終的に rootfs へと畳み込まれる。

💡
ポイントdo_install の宛先は ${D}${bindir} のように必ず ${D} を頭に付ける。${D} は「このソフト専用の仮の置き場」で、実機のディレクトリを直接触るわけではない。

🧱 自作レイヤ meta-mylayer

自分のレシピを、Yocto 本体のフォルダに直接置いてはいけない。混ざってしまい、更新のときに衝突するからだ。自作物は自分専用の区画にまとめる。その区画がレイヤ(bs-layer)だ。

レイヤは bitbake-layers create-layer で雛形を生成できる。慣習として名前は meta- で始め、たとえば meta-mylayer とする。中には conf・recipes- といった決まった構造ができる。

$ bitbake-layers create-layer meta-mylayer $ bitbake-layers add-layer meta-mylayer (レイヤを作り、ビルドに参加させる。add-layer を忘れるとレシピは見つからない)

作っただけではビルド対象にならない。add-layer で登録して初めて、bitbake がそのレイヤの中のレシピを認識する。「作る」と「登録する」は別の一手だと覚えておく。

📥 IMAGE_INSTALL でイメージに乗せる

レシピを書き、レイヤに置き、登録した。しかしそれだけでは、そのソフトはまだイメージに入らない。「このソフトをイメージに含めよ」と別途指示する必要がある。

その指示が IMAGE_INSTALL だ。イメージ側の設定で IMAGE_INSTALL:append = " hello" のように書き足すと、hello レシピの成果物が rootfs に組み込まれる。先頭の空白は区切りのためで、省くと前の語とくっつく。

つまずきレシピを書けたのに実機に入っていない——原因の多くは IMAGE_INSTALL への追加忘れだ。「レシピが存在する」ことと「イメージに含める」ことは、はっきり別の操作である。

🩹 bbappend で既製レシピを上書き

既存のレシピを、丸ごとコピーせずに一部だけ変えたいことがある。設定を1行足す、パッチを当てる、といった小さな上書きだ。これには bbappend(bs-bbappend)を使う。

元レシピが foo_1.0.bb なら、自分のレイヤに foo_%.bbappend という名前のファイルを置く。すると Yocto は元レシピの上に、この追記分を重ねて解釈する。元には一切手を触れない。

🔗
たとえbbappend は本に貼る付箋だ。本文(元レシピ)は書き換えず、余白に「ここはこう変更」と付箋を貼る。付箋を剥がせば元通りで、更新にも強い。
元レシピ(触らない)foo_1.0.bb本体の定義自分のレイヤの付箋foo_%.bbappend変更点だけ追記重ねる合成後の最終レシピ

🚑 手早く試す devtool

レシピをゼロから手書きするのは骨が折れる。そこで devtool という補助ツールがある。既存のソースから雛形レシピを自動生成したり、ビルドの試行錯誤を対話的に回したりできる。

たとえば devtool add にソースを渡すと、SRC_URI や依存の当たりを付けたレシピの下書きを作ってくれる。まずこれを叩き台にして、手で整えていくと早い。

コツいきなり完璧なレシピを目指さない。devtool で下書きを出し、bitbake でエラーを見ながら1行ずつ直す。エラーメッセージは「次に何を足すべきか」を教えてくれる先生だ。

🎯 最初は hello 1本

ここまでの要素を全部いっぺんに使う必要はない。最初の目標は、画面に文字を出すだけの hello を1本、自作レイヤのレシピとして書き、IMAGE_INSTALL に足して、実機で走らせることだ。

この hello が動いた瞬間、SRC_URI・do_compile・do_install・レイヤ登録・IMAGE_INSTALL という一連の流れが全部つながって腑に落ちる。あとは中身を本物のアプリに差し替えていくだけだ。

💡
ポイントYocto レシピ習得の最短路は「まず hello を1本、端から端まで通す」こと。小さく1周させてから、複雑なソフトへ広げるのが結局いちばん速い。

この項目に出てくる用語

do_compile / do_installどぅーこんぱいる どぅーいんすとーる
Yoctoレシピ内で、ソフトのビルドと配置の手順を書くタスク関数。
SRC_URIそーすゆーあーるあい
Yoctoレシピで、ソースコードの取得元を指定する変数。
bbappendびーびーあぺんど
既存レシピを丸写しせず、差分だけを重ねて上書きする追記ファイル。

関連コマンド

bitbakebitbake-layers

▶ 学習アプリでこの続きを学ぶ・演習する