【実践】Yoctoでカスタムレシピを作成する方法|.bbファイルの書き方完全ガイド

当ページのリンクには広告が含まれています。
【実践】Yoctoでカスタムレシピを作成する方法|.bbファイルの書き方完全ガイド

自作したアプリをYoctoのLinuxイメージに組み込みたい

レシピって何?.bbファイルの書き方がわからない

GitHubのソースコードをYoctoでビルドしたい

そんな悩みを解決します。この記事では、Yoctoの「レシピ」をゼロから作成する方法を、実際のコード例とともに解説します。

レシピの書き方をマスターすれば、どんなソフトウェアでもYoctoのイメージに組み込めるようになります。組み込みLinux開発の自由度が一気に広がりますよ!

📌 この記事の前提条件

  • Yoctoの基本的な仕組み(BitBake、レイヤー)を理解している
  • Pokyでcore-image-minimalのビルドが成功している
  • 基本的なLinuxコマンドが使える

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

📚 この記事でわかること

  • Yoctoレシピ(.bbファイル)の基本構造
  • Hello Worldレシピの作成手順
  • 主要な変数(SRC_URI, do_compile, do_install)の使い方
  • GitHubからソースを取得するレシピの書き方
  • レシピをイメージに追加する方法

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

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

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

目次

Yoctoレシピとは?基本を理解する

レシピ(Recipe)とは、特定のソフトウェアをビルドしてインストールするための「設計図」です。

拡張子は.bbで、以下の情報を記述します:

  • どこからソースコードを取得するか(SRC_URI)
  • どうやってビルドするか(do_compile)
  • どこにインストールするか(do_install)
  • ライセンスは何か(LICENSE)

レシピファイルの命名規則

レシピファイル名はパッケージ名_バージョン.bbの形式で命名します。

# 例
hello-world_1.0.bb      # hello-world バージョン1.0
myapp_2.3.1.bb          # myapp バージョン2.3.1
busybox_1.36.1.bb       # busybox バージョン1.36.1

レシピの基本構造

🔧 レシピの最小構成

# hello-world_1.0.bb

# ===== メタデータ =====
SUMMARY = "Hello World サンプル"
DESCRIPTION = "Yoctoレシピの学習用サンプルアプリケーション"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=..."

# ===== ソースコードの取得 =====
SRC_URI = "file://hello.c"

# ===== ビルドディレクトリの設定 =====
S = "${WORKDIR}"

# ===== ビルド処理 =====
do_compile() {
    ${CC} ${CFLAGS} ${LDFLAGS} -o hello hello.c
}

# ===== インストール処理 =====
do_install() {
    install -d ${D}${bindir}
    install -m 0755 hello ${D}${bindir}
}

主要な変数を理解する

レシピで使う主要な変数を表にまとめました。

変数名説明
SUMMARYパッケージの短い説明“Hello World サンプル”
DESCRIPTIONパッケージの詳細説明“学習用サンプルアプリ…”
LICENSEライセンス種別“MIT”, “GPLv2”, “Apache-2.0”
LIC_FILES_CHKSUMライセンスファイルのチェックサムfile://LICENSE;md5=xxx
SRC_URIソースコードの取得元“file://”, “git://”, “http://”
Sソースコードの展開先ディレクトリ${WORKDIR}/git
PVパッケージバージョン自動設定(ファイル名から)
PNパッケージ名自動設定(ファイル名から)

ビルド・インストール用の変数

変数名説明展開例
${WORKDIR}ビルド作業ディレクトリ/tmp/work/…/hello-world/1.0-r0/
${D}インストール先のルート…/image/
${bindir}/usr/bin のパス/usr/bin
${libdir}/usr/lib のパス/usr/lib
${sysconfdir}/etc のパス/etc
${CC}クロスコンパイラarm-poky-linux-gnueabi-gcc

【実践1】Hello Worldレシピを作成する

まずは最もシンプルなレシピを作成してみましょう。

Step 1: カスタムレイヤーを作成

レシピは自作レイヤー内に配置するのがベストプラクティスです。

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

# 新しいレイヤーを作成
$ cd ..
$ bitbake-layers create-layer meta-mylayer

# レイヤーをビルドに追加
$ cd build
$ bitbake-layers add-layer ../meta-mylayer

# 確認
$ bitbake-layers show-layers
layer                 path
=========================================================
meta                  /home/user/yocto/poky/meta
meta-poky             /home/user/yocto/poky/meta-poky
meta-yocto-bsp        /home/user/yocto/poky/meta-yocto-bsp
meta-mylayer          /home/user/yocto/meta-mylayer   ← 追加された!

Step 2: レシピ用のディレクトリ構造を作成

# レシピ用ディレクトリを作成
$ mkdir -p ../meta-mylayer/recipes-example/hello-world/files

# ディレクトリ構造
meta-mylayer/
├── conf/
│   └── layer.conf
├── COPYING.MIT
├── README
└── recipes-example/
    └── hello-world/
        ├── hello-world_1.0.bb    ← レシピファイル
        └── files/
            └── hello.c           ← ソースコード

Step 3: ソースコードを作成

files/hello.cを作成します。

// files/hello.c
#include <stdio.h>

int main(void) {
    printf("Hello from Yocto!\n");
    printf("This app was built with a custom recipe.\n");
    return 0;
}

Step 4: レシピファイルを作成

hello-world_1.0.bbを作成します。

# hello-world_1.0.bb

SUMMARY = "Hello World - Yoctoレシピ学習用サンプル"
DESCRIPTION = "Yoctoでカスタムレシピを作成する方法を学ぶためのサンプルアプリケーション"
AUTHOR = "Your Name <your@email.com>"
HOMEPAGE = "https://example.com"

# ライセンス設定(MITライセンスを使用)
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"

# ソースコードの取得元(filesディレクトリから)
SRC_URI = "file://hello.c"

# ソースが展開されるディレクトリ
S = "${WORKDIR}"

# コンパイル処理
do_compile() {
    ${CC} ${CFLAGS} ${LDFLAGS} -o hello hello.c
}

# インストール処理
do_install() {
    # /usr/bin ディレクトリを作成
    install -d ${D}${bindir}
    # 実行ファイルをインストール(パーミッション 0755)
    install -m 0755 hello ${D}${bindir}
}

Step 5: レシピをビルドする

# 個別にレシピをビルド
$ bitbake hello-world

# ビルド成功のメッセージ
NOTE: Tasks Summary: Attempted 123 tasks of which 120 didn't need to be rerun
...

Step 6: イメージに組み込む

conf/local.confに以下を追加します。

# conf/local.conf に追加
IMAGE_INSTALL:append = " hello-world"

イメージを再ビルドしてQEMUで確認:

# イメージを再ビルド
$ bitbake core-image-minimal

# QEMUで起動
$ runqemu qemux86-64 nographic

# ログイン後、helloコマンドを実行
root@qemux86-64:~# hello
Hello from Yocto!
This app was built with a custom recipe.

🎉 おめでとうございます!自作レシピが正常に動作しました。

【実践2】GitHubからソースを取得するレシピ

次は、GitHubなどの外部リポジトリからソースを取得するレシピを作成します。

例:jsonライブラリ(nlohmann/json)を追加

# nlohmann-json_3.11.3.bb

SUMMARY = "JSON for Modern C++"
DESCRIPTION = "Header-only JSON library for C++"
HOMEPAGE = "https://github.com/nlohmann/json"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE.MIT;md5=f5f7c71504da070bcf4f090205ce1080"

# GitHubからソースを取得
SRC_URI = "git://github.com/nlohmann/json.git;protocol=https;branch=master"

# 特定のコミットを指定(再現性のため必須)
SRCREV = "9cca280a4d0ccf0c08f47a99aa71d1b0e52f8d03"

# ソースの展開先
S = "${WORKDIR}/git"

# CMakeを使用
inherit cmake

# ヘッダーオンリーなのでテストはスキップ
EXTRA_OECMAKE = "-DJSON_BuildTests=OFF"

SRC_URIの書き方パターン

取得元SRC_URI の書き方
ローカルファイルfile://hello.c
Git (HTTPS)git://github.com/user/repo.git;protocol=https;branch=main
Git (SSH)git://git@github.com/user/repo.git;protocol=ssh;branch=main
HTTP/HTTPShttps://example.com/file.tar.gz
パッチファイルfile://fix-build.patch

継承クラス(inherit)を活用する

Yoctoには、よく使うビルドパターンをまとめた「クラス」があります。inheritで継承すると、do_compileやdo_installを自動化できます。

クラス用途主な自動化
cmakeCMakeプロジェクトcmake → make → make install
autotoolsAutoconfプロジェクトconfigure → make → make install
mesonMesonプロジェクトmeson → ninja → install
python3nativePythonスクリプトsetup.py install
systemdsystemdサービスサービスの有効化

CMakeプロジェクトの例

# myapp-cmake_1.0.bb
SUMMARY = "My CMake App"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=..."

SRC_URI = "git://github.com/user/myapp.git;protocol=https;branch=main"
SRCREV = "abc123..."
S = "${WORKDIR}/git"

# CMakeクラスを継承するだけでビルドが自動化される
inherit cmake

# CMakeオプションを指定(任意)
EXTRA_OECMAKE = "-DBUILD_TESTS=OFF"

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

❌ エラー1: LIC_FILES_CHKSUM mismatch

ERROR: License checksum mismatch...

原因:ライセンスファイルのMD5ハッシュが一致しない

解決:正しいMD5を計算して更新

$ md5sum LICENSE

❌ エラー2: do_fetch failed

ERROR: Fetcher failure: Unable to find file...

原因:SRC_URIのパスが間違っている、またはネットワーク問題

解決:パスを確認、またはSRCREVを正しいコミットハッシュに設定

❌ エラー3: No package found

ERROR: Nothing PROVIDES 'hello-world'

原因:レイヤーがbblayers.confに追加されていない

解決:bitbake-layers add-layerでレイヤーを追加

まとめ:レシピ作成のポイント

この記事では、Yoctoレシピの作成方法を解説しました。

  • ✅ レシピは.bbファイルで、ビルド方法を記述する
  • ✅ 主要変数:SRC_URIdo_compiledo_install
  • ✅ 自作レイヤーにレシピを配置するのがベストプラクティス
  • ✅ inheritでCMake/Autotools/Mesonプロジェクトを自動化
  • ✅ IMAGE_INSTALL:appendでイメージに組み込む

レシピの書き方を覚えれば、どんなソフトウェアでもYoctoイメージに追加できます。次はレイヤーの作成方法実機へのデプロイに挑戦してみてください!

🚀 次のステップ


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

コメント

コメントする

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

目次