はじめに
Yocto ProjectでビルドするZephyrに独自のアプリケーションを追加してみる。
環境構築
この環境をベースに作業する。
環境変数設定
bitbake関連のツールを使用するために環境変数の読み込みは行う。
$ source poky/oe-init-build-env build
レイヤの作成
ビルド対象への追加も行う。
$ bitbake-layers create-layer meta-zephyr-app $ rm -rf ./meta-zephyr-app/recipes-example/example $ mv meta-zephyr-app ../poky $ bitbake-layers add-layer ../poky/meta-zephyr-app
自動生成されるexampleのレシピはディレクトリごと削除する。
ソースコードの作成
下記のようなディレクトリツリーを作成する。
my-app ├── CMakeLists.txt ├── prj.conf └── src └── main.c
CMakeLists.txt
Zephyrのhello_worldを参考に作成。ライセンスもApache-2.0とした。
# SPDX-License-Identifier: Apache-2.0 cmake_minimum_required(VERSION 3.13.1) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(my-app) target_sources(app PRIVATE src/main.c)
prj.conf
下記の一行だけ。
# nothing here
echoとかで適当に作成してよい。
$ echo '# nothing here' > prj.conf
src/main.c
プログラム本体。
これもhello_world.cを参考に作成(というか丸パクリ)した。
/* * SPDX-License-Identifier: Apache-2.0 */ #include <zephyr.h> #include <sys/printk.h> void main(void) { printk("Hello My Application World! %s\n", CONFIG_BOARD); }
レシピの作成
既存のOSSなどWeb上にあるリポジトリやソースコードのアーカイブからレシピを作成する場合はrecipetool
が便利だが、
ローカルのソースツリーからレシピを作る機能はないため、手動で作成する必要がある。
my-app_0.1.bb
レシピはmeta-zephyr-app/recipes-example/my-app
に配置されるようにする。
buildディレクトリで作業する場合下記のようにディレクトリを作成する。
$ mkdir -p ../poky/meta-zephyr-app/recipes/example/my-app
そして、その配下にmy-app_0.1.bb
を下記の内容で作成する。
include recipes-kernel/zephyr-kernel/zephyr-sample.inc SRC_URI += "file://my-app" ZEPHYR_SRC_DIR = "${S}/../my-app"
自分のレイヤ以外のレイヤに存在するincファイルをincludeする場合、レイヤ直下からの相対パスを記述する必要がある。
下記のようにファイル名だけ記述した場合、includeされずにその行は無視されるので注意が必要となる。
include zephyr-sample.inc
ソースコードの配置
先ほど作成したmy-app
以下のソースツリーをmeta-zephyr-app/recipes-example/my-app/files
に配置する。
my-appディレクトリがbuildディレクトリに作成していた場合下記のようにして移動する。
$ mkdir -p ../poky/meta-zephyr-app/recipes/example/my-app/files $ mv ./my-app ../poky/meta-zephyr-app/recipes/example/my-app/files
最終的にmeta-zephyr-appは下記のようなツリーになる。
meta-zephyr-app/ ├── COPYING.MIT ├── README ├── conf │ └── layer.conf └── recipes-example └── my-app ├── files │ └── my-app │ ├── CMakeLists.txt │ ├── prj.conf │ └── src │ └── main.c └── my-app_0.1.bb
ビルド
bitbakeを実行する。
$ bitbake my-app
recipes-kernel/zephyr-kernel/zephyr-sample.inc
が正しくインクルードできていれば、pokyではなくzephyrがビルドされる。
qemuで実行
$ runqemu qemux86 qemuparams="-serial mon:stdio" (... snip ...) *** Booting Zephyr OS build zephyr-v2.5.0 *** Hello My Application World! qemu_cortex_m0
まとめ
意外と少ない手順でZephyrのアプリケーションを追加することができた。
YoctoでLinux以外のOSだったり、Cortext-M向けのバイナリをビルドするということにピンと来ていなかったが、意外と便利に使えるのかもしれない。