Yoctoのレイヤーって結局何? meta-xxxというディレクトリがたくさんあって意味がわからない——。
Yocto Projectを使いこなす上で 最も重要な概念が「レイヤー」 だ。この記事では、レイヤーの仕組みを解説し、カスタムレイヤーの作成から外部BSPレイヤーの追加、bblayers.confの設定までを実践的に紹介する。
Yoctoレイヤーとは
レイヤー(Layer) とは、関連するレシピ・設定・パッチをまとめた「モジュール」だ。
Yoctoのビルドシステムは、複数のレイヤーを 積み重ねる(Stack) ことで動作する。これにより、ベースを壊さずにカスタマイズできる。
上のレイヤーは下のレイヤーを「上書き」できる。同じレシピが複数のレイヤーに存在する場合、優先度が高いレイヤーのレシピが使われる。
なぜレイヤーが必要なのか
- 再利用性 :同じレイヤーを複数プロジェクトで使い回せる
- 保守性 :アップストリームとの分離。Pokyをアップデートしても自分の変更が消えない
- コラボレーション :チームで分担しやすい。BSP担当・アプリ担当など
- バージョン管理 :レイヤーごとにGitリポジトリを分けられる
レイヤーの種類と構造
レイヤーの種類
| 種類 | 目的 | 例 |
|---|---|---|
| BSPレイヤー | 特定ハードウェア向けの設定 | meta-raspberrypi, meta-ti, meta-intel |
| ディストリビューションレイヤー | ディストリビューション設定 | meta-poky, meta-angstrom |
| ソフトウェアレイヤー | 追加パッケージ群 | meta-openembedded, meta-qt5 |
| カスタムレイヤー | プロジェクト固有のレシピ | meta-mylayer, meta-mycompany |
プロジェクトでは必ず カスタムレイヤー を作成して、自分のレシピや設定をそこに置こう。
ディレクトリ構造
すべてのレイヤーは同じ基本構造を持っている。
meta-mylayer/
├── conf/
│ └── layer.conf # レイヤーの設定ファイル(必須)
├── COPYING.MIT # ライセンスファイル
├── README # レイヤーの説明
├── recipes-bsp/ # BSP関連レシピ
├── recipes-core/ # コア機能のレシピ
├── recipes-example/ # サンプルレシピ
│ └── myapp/
│ ├── myapp_1.0.bb
│ └── files/
├── recipes-kernel/ # カーネル関連
├── recipes-graphics/ # グラフィック関連
└── classes/ # 共通クラス(.bbclass)
recipes-* というディレクトリ名は慣習で、BitBakeが自動的に中のレシピを検索する。
layer.confの中身
conf/layer.conf はレイヤーの「身分証明書」だ。このファイルがあって初めてYoctoがそのディレクトリをレイヤーとして認識する。
# conf/layer.conf
# レイヤーのパスをBBPATHに追加
BBPATH .= ":${LAYERDIR}"
# レシピを検索するパス
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
# このレイヤーのコレクション名(一意である必要がある)
BBFILE_COLLECTIONS += "meta-mylayer"
BBFILE_PATTERN_meta-mylayer = "^${LAYERDIR}/"
# レイヤーの優先度(高いほど優先される。6〜10が一般的)
BBFILE_PRIORITY_meta-mylayer = "6"
# レイヤーの互換性(対応するYoctoバージョン)
LAYERSERIES_COMPAT_meta-mylayer = "scarthgap"
# 依存レイヤー
LAYERDEPENDS_meta-mylayer = "core"
カスタムレイヤーを作成する
bitbake-layersコマンドを使う(推奨)
bitbake-layers コマンドを使うのが一番簡単で確実だ。
# ビルド環境に入る
cd ~/yocto/poky
source oe-init-build-env build
# Pokyの親ディレクトリに移動してレイヤーを作成
cd ..
bitbake-layers create-layer meta-myproject
# 作成されたファイルを確認
ls meta-myproject/
conf COPYING.MIT README recipes-example
cat meta-myproject/conf/layer.conf
手動で作成する
layer.confの内容を理解したい場合は手動で作ると勉強になる。
# ディレクトリ構造を作成
mkdir -p meta-myproject/conf
mkdir -p meta-myproject/recipes-example/myapp
# layer.confを作成
cat > meta-myproject/conf/layer.conf << 'EOF'
BBPATH .= ":${LAYERDIR}"
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
${LAYERDIR}/recipes-*/*/*.bbappend"
BBFILE_COLLECTIONS += "meta-myproject"
BBFILE_PATTERN_meta-myproject = "^${LAYERDIR}/"
BBFILE_PRIORITY_meta-myproject = "6"
LAYERSERIES_COMPAT_meta-myproject = "scarthgap"
EOF
レイヤーをビルドに追加する
bblayers.confの編集
# コマンドで追加(推奨)
cd ~/yocto/poky
source oe-init-build-env build
bitbake-layers add-layer ../meta-myproject
# 直接編集する場合
nano conf/bblayers.conf
conf/bblayers.conf の例:
BBLAYERS ?= " \
/home/user/yocto/poky/meta \
/home/user/yocto/poky/meta-poky \
/home/user/yocto/poky/meta-yocto-bsp \
/home/user/yocto/meta-myproject \
"
絶対パスで記述するのが一般的だ。bitbake-layers add-layer も絶対パスを挿入する。
レイヤーの確認と削除
# 現在のレイヤー一覧を確認
bitbake-layers show-layers
layer path priority
==========================================================================
meta /home/user/yocto/poky/meta 5
meta-poky /home/user/yocto/poky/meta-poky 5
meta-yocto-bsp /home/user/yocto/poky/meta-yocto-bsp 5
meta-myproject /home/user/yocto/meta-myproject 6
# レイヤーをビルドから削除(ファイル自体は削除しない)
bitbake-layers remove-layer meta-myproject
既存レシピのカスタマイズ
既存のレシピを変更したい場合、元のファイルを編集せずに .bbappend を使う。bbappendはYoctoの「非破壊カスタマイズ」の核心だ。詳しい使い方はbbappend実践ガイドを参照してほしい。
外部BSPレイヤーを追加する
Raspberry Pi用のBSPレイヤー「meta-raspberrypi」を追加する例だ。
レイヤーをダウンロード
# Pokyと同じディレクトリにクローン
cd ~/yocto
git clone -b scarthgap git://git.yoctoproject.org/meta-raspberrypi
# meta-openembeddedも必要(meta-raspberrypiが依存)
git clone -b scarthgap git://git.openembedded.org/meta-openembedded
レイヤーを追加して設定
cd ~/yocto/poky
source oe-init-build-env build
# meta-oe(meta-openembeddedの基本レイヤー)を追加
bitbake-layers add-layer ../meta-openembedded/meta-oe
# meta-raspberrypiを追加
bitbake-layers add-layer ../meta-raspberrypi
# 追加されたか確認
bitbake-layers show-layers
conf/local.conf でターゲットマシンを設定:
MACHINE = "raspberrypi4-64"
Raspberry Piでのビルド手順の全体像はRPiビルドガイドを参照してほしい。
OpenEmbedded Layer Index
公開されているレイヤーは「OpenEmbedded Layer Index」で検索できる。
https://layers.openembedded.org
ここで「raspberrypi」「qt5」「nodejs」など検索すると、対応レイヤーが見つかる。何か追加したいパッケージがあれば、まずここを確認してみよう。
よく使われるレイヤー
| レイヤー名 | 用途 |
|---|---|
meta-raspberrypi | Raspberry Pi向けBSP |
meta-ti | Texas Instruments向けBSP |
meta-intel | Intel向けBSP |
meta-openembedded | 追加パッケージ(Python, Networking等) |
meta-qt5 / meta-qt6 | Qt5/Qt6 GUI |
meta-virtualization | Docker, LXC等 |
よくあるエラーと解決方法
Layer 'xxx' is not compatible
ERROR: Layer xxx is not compatible with the current version
原因: LAYERSERIES_COMPAT が現在のYoctoバージョンと一致しない。
解決: layer.conf の LAYERSERIES_COMPAT を現在のYoctoブランチ名に更新する。
LAYERSERIES_COMPAT_meta-mylayer = "scarthgap"
Layer depends on 'xxx'
ERROR: Layer xxx depends on layer xxx
原因: 依存レイヤーが追加されていない。
解決: 依存レイヤーを先に bitbake-layers add-layer で追加する。
まとめ
- 自作レシピは必ずカスタムレイヤーに置く (Pokyを直接編集しない)
- 既存レシピの変更は .bbappend を使う
- レイヤー名は「meta-」で始める (慣習)
- LAYERSERIES_COMPAT を適切に設定する
- レイヤーごとにGitリポジトリを分ける (チーム開発時)
レイヤーの基礎を押さえたら、次のステップに進もう。
- レシピの書き方 — 自作アプリをイメージに追加する
- bbappend実践ガイド — 既存レシピのカスタマイズパターン
- Raspberry PiでカスタムLinuxをビルドする — 実機で動かす
組み込みLinuxの世界をもっと深く学びたい人には、以下の書籍がおすすめだ。