「自作したアプリを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からソースを取得するレシピの書き方
- レシピをイメージに追加する方法
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/HTTPS | https://example.com/file.tar.gz |
| パッチファイル | file://fix-build.patch |
継承クラス(inherit)を活用する
Yoctoには、よく使うビルドパターンをまとめた「クラス」があります。inheritで継承すると、do_compileやdo_installを自動化できます。
| クラス | 用途 | 主な自動化 |
|---|---|---|
cmake | CMakeプロジェクト | cmake → make → make install |
autotools | Autoconfプロジェクト | configure → make → make install |
meson | Mesonプロジェクト | meson → ninja → install |
python3native | Pythonスクリプト | setup.py install |
systemd | systemdサービス | サービスの有効化 |
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_URI、do_compile、do_install - ✅ 自作レイヤーにレシピを配置するのがベストプラクティス
- ✅
inheritでCMake/Autotools/Mesonプロジェクトを自動化 - ✅
IMAGE_INSTALL:appendでイメージに組み込む
レシピの書き方を覚えれば、どんなソフトウェアでもYoctoイメージに追加できます。次はレイヤーの作成方法や実機へのデプロイに挑戦してみてください!
🚀 次のステップ
- 【2026年版】Yocto Project完全入門ガイド|組み込みLinux開発の第一歩
- 【図解】Yoctoレイヤーの作成と追加方法
- YoctoでRaspberry Pi向けLinuxをビルドする
- その他準備中


コメント