みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

YoctoProject devtoolを使ってみる(add編)

はじめに

YoctoProjecではdevtoolというツールを提供している。 このツールはbitbake環境か拡張SDKの環境で使用することができる。

devtoolには様々なサブコマンドが用意されており、次のようなことができるようになっている。

  • レシピの新規作成
  • レシピの編集
  • レシピのアップグレード

今回はレシピの新規作成に注目してみる。

先日唐突にものすごく久しぶりにAutotoolsを使ってみたのは、 これのためのサンプルを作るため。

作業用レイヤの作成

bitbake-layersコマンドで作業用レイヤを作成する。

$ bitbake-layers create-layer ../poky/meta-work
$ bitbake-layers add-layer ../poky/meta-work
$ bitbake-layers show-layers

devtool

今回はbitbake環境で作業する。

$ source poky/oe-init-build-env

ワークスペースの作成

devtoolの初回実行時には下記のことが実行される。

  • workspaceの作成
  • workspaceのbblayers.confへの追加

これによりbitbake実行時にもworkspaceの作業内容が反映される様になる。

ワークスペースへのレシピの作成

hello-autotoolsのサンプルでレシピを作成する。

githubのデフォルトブランチはmainだが、devtoolはブランチを指定しないとmasterとみなすので注意が必要。

$ devtool add https://github.com/mickey-happygolucky/hello-autotools.git -B main

このコマンドによって下記のことが実行される。

レシピの雛形

workspace/recipes/hello_git.bbが下記の内容で作成される。

# Recipe created by recipetool
# This is the basis of a recipe and may need further editing in order to be fully functional.
# (Feel free to remove these comments when editing.)

# WARNING: the following LICENSE and LIC_FILES_CHKSUM values are best guesses - it is
# your responsibility to verify that the values are complete and correct.
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=7d3d185c8b095f61b1f86140b6a49a93"

SRC_URI = "git://github.com/mickey-happygolucky/hello-autotools.git;protocol=https;branch=master"

# Modify these as desired
PV = "0.0.1+git${SRCPV}"
SRCREV = "36ef62fd0cd05f72f589a296e39044d71371a46b"

S = "${WORKDIR}/git"

# NOTE: if this software is not capable of being built in a separate build directory
# from the source, you should replace autotools with autotools-brokensep in the
# inherit line
inherit autotools

# Specify any options you want to pass to the configure script using EXTRA_OECONF:
EXTRA_OECONF = ""

1行目のコメントからこのレシピの雛形はrecipetoolで作成されたことがわかる。 これは、devtoolの中からreciptool createが呼び出されるようになっているため。

recipetoolはソースツリーを解析し使用されているビルドシステムを判別するようになっている。 hello-autotoolsはautotoolsを使用しているため、inherit autotoolsしている。

SRC_URIにはgithubのURLが設定されている。

ワークスペースへのソースコード配置

workspace/sources/helloソースコードが配置される。 こちらはrecipetool createの--extractオプションによって行われている。

ソースコードがgitリポジトリじゃない場合はdevtoolによって自動的にgit initが実行され、 gitリポジトリになるようになっている。

External Sourceの設定

devtoolやbitbakeがワークスペースに配置されたソースを参照する様にExternal Sourceの仕組みが使用されている。 workspace/appends/hello_git.bbappendが下記のように作成されている。

inherit externalsrc
EXTERNALSRC = "/home/mickey/yocto/rpi-kirkstone/build/workspace/sources/hello"

# initial_rev: 36ef62fd0cd05f72f589a296e39044d71371a46b

inherit externalsrcしてワークスペース上のソースのパスをを設定している。

initial_revはワークスペースにgitリポジトリが配置された最新のコミットを指しており、 ワークスペース内で修正された差分を作成する基点として扱われる。

レシピのレイヤへの登録

ワークスペースに作成したレシピをレイヤに配置し正式にレシピとして登録する。

$ devtool finish -r hello ../poky/meta-work

-rをつけることでsourceディレクトリに配置されたソースコードが削除される。 逆に言えばこのオプションをつけないとソースコードが残ったままとなる。

レシピを登録したmeta-workの内容を確認してみる。

../poky/meta-work
├── COPYING.MIT
├── README
├── conf
│   └── layer.conf
├── recipes-example
│   └── example
│       └── example_0.1.bb
└── recipes-hello
    └── hello
        └── hello_git.bb

recipes-hello/hello/hello_git.bbにレシピが配置されている。ディレクトリ名はdevtoolによって自動的に決められてしまう。

recipetoolによるレシピの作成

devtool addの処理の大半がrecipetool createだったので、recipetoolを使用してレシピを作成してみる。

$ mkdir -p ../poky/meta-work/recipes-app/hello
$ recipetool create https://github.com/mickey-happygolucky/hello-autotools.git -B main -o ../poky/meta-work/recipes-app/hello/hello_0.0.1.bb

devtoolで作成したレシピを削除する。

$ rm -rf ../poky/meta-work/recipes-hello

meta-workの内容を確認する。

../poky/meta-work
├── COPYING.MIT
├── README
├── conf
│   └── layer.conf
├── recipes-app
│   └── hello
│       └── hello_0.0.1.bb
└── recipes-example
    └── example
        └── example_0.1.bb

まとめ

devtoolは強力なツールだ。しかしレシピの新規作成に関してはレイヤに登録する際のディレクトリ名を自由に設定できなかったり、 一旦ワークスペースソースコードを展開したりしてもあまりメリットを感じない。

ワークスペース内で行うことができるdevtoolの機能については新規作成時にも使用可能だがそれをする意味もない気がする。 個人的にはdevtoolの真価はレシピの編集とレシピのアップグレードにあると思っている。

新規作成に関してはrecipetoolを使用したほうが自由がきいてよいのではないだろうか。