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

当ページのリンクには広告が含まれています。
【図解】Yoctoレイヤーの作成と追加方法|meta-xxxの仕組みを理解する

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

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

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

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

📌 この記事の前提条件

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

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

📚 この記事でわかること

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

この記事を書いた人:Mitsu(StudioMitsu代表)

フルスタックエンジニア(15年)。大手SIerで金融システム(与信判定、利息計算)を5年間開発した経験を持つ。Web・インフラ・動画処理など幅広い技術領域で実務経験があり、システム的な視点から実践的なノウハウを発信。

→ 詳しいプロフィールはコチラ

目次

Yoctoレイヤーとは?【図解】

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

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

🔧 レイヤーの積み重ね構造

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

⚠️ 上のレイヤーは下のレイヤーを「上書き」できます。同じレシピがある場合、上が優先されます。

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

  • 再利用性:同じレイヤーを複数プロジェクトで使い回せる
  • 保守性:アップストリームとの分離。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)

layer.confの中身

conf/layer.confはレイヤーの「身分証明書」です。

# conf/layer.conf

# レイヤーの設定を追加
BBPATH .= ":${LAYERDIR}"

# レシピを検索するパス(*は任意の階層)
BBFILES += "${LAYERDIR}/recipes-*/*/*.bb \
            ${LAYERDIR}/recipes-*/*/*.bbappend"

# レシピの重複を許可するパターン
BBFILE_COLLECTIONS += "meta-mylayer"
BBFILE_PATTERN_meta-mylayer = "^${LAYERDIR}/"

# レイヤーの優先度(高いほど優先)
BBFILE_PRIORITY_meta-mylayer = "6"

# レイヤーの互換性(対応するYoctoバージョン)
LAYERSERIES_COMPAT_meta-mylayer = "scarthgap styhead"

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

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

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

# ビルド環境に入る
$ cd ~/yocto/poky
$ source oe-init-build-env build

# 新しいレイヤーを作成
$ 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: 手動で作成する

# ディレクトリ構造を作成
$ 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の編集

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

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

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 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: レイヤーをダウンロード

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

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

Step 2: レイヤーを追加

$ 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: ターゲットマシンを設定

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

# MACHINEを変更
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」で検索できます。

🔍 レイヤー検索サイト

あわせて読みたい

ここで「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を使います。

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

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

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

ポイント:%はワイルドカードで、任意のバージョンにマッチします。

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

❌ エラー: Layer ‘xxx’ is not compatible

ERROR: Layer xxx is not compatible with the current version

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

解決:layer.confのLAYERSERIES_COMPATを更新

❌ エラー: Layer depends on ‘xxx’

ERROR: Layer xxx depends on layer xxx

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

解決:依存レイヤーを先に追加する

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

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

🚀 次のステップ


※本記事は2026年1月時点の情報に基づいています。Yoctoのバージョンアップにより手順が変更される場合があります。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

目次