32blogby StudioMitsu
Archive10 min read

【図解】Yoctoレイヤーの作成と追加方法|meta-xxxの仕組みを理解する

Yoctoレイヤーの仕組みをわかりやすく解説。カスタムレイヤーの作成から外部BSPレイヤーの追加、bblayers.confの設定、.bbappendによるカスタマイズまで網羅。

Yoctoのレイヤーって結局何?

meta-xxxというディレクトリがたくさんあって意味がわからない

Raspberry Pi用のBSPレイヤーを追加したい

Yocto Projectを使いこなす上で 最も重要な概念が「レイヤー」 です。この記事では、レイヤーの仕組みを解説し、実際にカスタムレイヤーを作成する手順を紹介します。

この記事の前提条件

  • Yoctoの基本(BitBake、レシピ)を理解している
  • Pokyでcore-image-minimalのビルドが成功している

まだの方は先に「Yocto入門ガイド」をお読みください。

この記事でわかること

  • レイヤーとは何か、なぜ必要なのか
  • レイヤーの種類(BSP、ディストリビューション、ソフトウェア)
  • カスタムレイヤーの作成手順
  • 外部レイヤー(meta-raspberrypi等)の追加方法
  • layer.confとbblayers.confの設定
  • .bbappendを使った既存レシピのカスタマイズ

Yoctoレイヤーとは?

レイヤー(Layer) とは、関連するレシピ・設定・パッチをまとめた「モジュール」です。

Yoctoのビルドシステムは、複数のレイヤーを 積み重ねる(Stack) ことで動作します。これにより、ベースを壊さずにカスタマイズできます。

上のレイヤーは下のレイヤーを「上書き」できます。同じレシピが複数のレイヤーに存在する場合、優先度が高いレイヤーのレシピが使われます。

なぜレイヤーが必要なのか?

  • 再利用性:同じレイヤーを複数プロジェクトで使い回せる
  • 保守性:アップストリームとの分離。Pokyをアップデートしても自分の変更が消えない
  • コラボレーション:チームで分担しやすい。BSP担当・アプリ担当など
  • バージョン管理:レイヤーごとにGitリポジトリを分けられる

「Pokyのソースを直接編集する」はやってはいけない典型例です。Yoctoのバージョンを上げた瞬間に全部消えます。

レイヤーの種類

種類目的
BSPレイヤー特定ハードウェア向けの設定meta-raspberrypi, meta-ti, meta-intel
ディストリビューションレイヤーディストリビューション設定meta-poky, meta-angstrom
ソフトウェアレイヤー追加パッケージ群meta-openembedded, meta-qt5
カスタムレイヤープロジェクト固有のレシピmeta-mylayer, meta-mycompany

プロジェクトでは必ずカスタムレイヤーを作成して、自分のレシピや設定をそこに置くようにしましょう。

レイヤーのディレクトリ構造

すべてのレイヤーは同じ基本構造を持っています。

text
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がそのディレクトリをレイヤーとして認識します。

bash
# 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 styhead"

# 依存レイヤー(このレイヤーが必要とする他のレイヤー)
LAYERDEPENDS_meta-mylayer = "core"

【実践1】カスタムレイヤーを作成する

方法1: bitbake-layersコマンドを使う(推奨)

bitbake-layersコマンドを使うのが一番簡単で確実です。

bash
# ビルド環境に入る
$ 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の内容が表示される

方法2: 手動で作成する

layer.confの内容を理解したい場合は手動で作ると勉強になります。

bash
# ディレクトリ構造を作成
$ 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 styhead"
EOF

【実践2】レイヤーをビルドに追加する

bblayers.confの編集

bash
# 方法1: コマンドで追加(推奨)
$ cd ~/yocto/poky
$ source oe-init-build-env build
$ bitbake-layers add-layer ../meta-myproject

# 方法2: 直接編集
$ nano conf/bblayers.conf

conf/bblayers.confの例:

bash
# 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 \
  "

絶対パスで記述することに注意してください。相対パスは使えません。

レイヤーの確認・削除

bash
# 現在のレイヤー一覧を確認
$ 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

【実践3】外部BSPレイヤーを追加する

Raspberry Pi用のBSPレイヤー「meta-raspberrypi」を追加する例です。

Step 1: レイヤーをダウンロード

bash
# Pokyと同じディレクトリにクローン
$ cd ~/yocto
$ git clone -b styhead git://git.yoctoproject.org/meta-raspberrypi

# meta-openembeddedも必要(meta-raspberrypiが依存)
$ git clone -b styhead git://git.openembedded.org/meta-openembedded

Step 2: レイヤーを追加

bash
$ 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

Step 3: ターゲットマシンを設定

bash
# conf/local.confを編集
$ nano conf/local.conf

# MACHINEをRaspberry Pi向けに変更
MACHINE = "raspberrypi4-64"

# 利用可能なマシン一覧
# raspberrypi      - Raspberry Pi 1
# raspberrypi2     - Raspberry Pi 2
# raspberrypi3     - Raspberry Pi 3
# raspberrypi3-64  - Raspberry Pi 3 (64bit)
# raspberrypi4     - Raspberry Pi 4
# raspberrypi4-64  - Raspberry Pi 4 (64bit)
# raspberrypi5     - Raspberry Pi 5

OpenEmbedded Layer Index

公開されているレイヤーは「OpenEmbedded Layer Index」で検索できます。

https://layers.openembedded.org

ここで「raspberrypi」「qt5」「nodejs」など検索すると、対応レイヤーが見つかります。何か追加したいパッケージがあれば、まずここを確認してみてください。

便利な公式レイヤー一覧

レイヤー名用途
meta-raspberrypiRaspberry Pi向けBSP
meta-tiTexas Instruments向けBSP
meta-intelIntel向けBSP
meta-openembedded追加パッケージ(Python, Networking等)
meta-qt5 / meta-qt6Qt5/Qt6 GUI
meta-virtualizationDocker, LXC等

.bbappendでレシピをカスタマイズする

既存のレシピを変更したい場合、元のファイルを編集せずに.bbappendを使います。これがYoctoの「非破壊カスタマイズ」の核心です。

bash
# 例:busyboxにパッチを当てる
# meta-mylayer/recipes-core/busybox/busybox_%.bbappend

# パッチファイルを追加
FILESEXTRAPATHS:prepend := "${THISDIR}/files:"
SRC_URI += "file://my-fix.patch"

# 設定を追加
EXTRA_OECONF += "--enable-feature-x"

%はワイルドカードで、任意のバージョンにマッチします。バージョンが変わっても.bbappendが機能するので、Pokyのアップデートに追従しやすくなります。

よくあるエラーと解決方法

エラー: Layer 'xxx' is not compatible

text
ERROR: Layer xxx is not compatible with the current version

原因: LAYERSERIES_COMPATが現在のYoctoバージョンと一致しない

解決: layer.confLAYERSERIES_COMPATを現在のYoctoブランチ名に更新する

bash
LAYERSERIES_COMPAT_meta-mylayer = "scarthgap styhead"

エラー: Layer depends on 'xxx'

text
ERROR: Layer xxx depends on layer xxx

原因: 依存レイヤーが追加されていない

解決: 依存レイヤーを先にbitbake-layers add-layerで追加する

まとめ:レイヤー管理のベストプラクティス

  • 自作レシピは必ずカスタムレイヤーに置く(Pokyを直接編集しない)
  • 既存レシピの変更は.bbappendを使う
  • レイヤー名は「meta-」で始める(慣習)
  • LAYERSERIES_COMPATを適切に設定する
  • レイヤーごとにGitリポジトリを分ける(チーム開発時)

レイヤーの仕組みを理解すると、Yoctoのビルドシステムがぐっとクリアに見えてきます。最初は難しく感じるかもしれませんが、「フォルダ分けして積み重ねる」というシンプルな概念です。

次のステップ


※本記事は2026年1月時点の情報に基づいています。Yoctoのバージョンアップにより手順が変更される場合があります。