はじめに
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
している。
ワークスペースへのソースコード配置
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を使用したほうが自由がきいてよいのではないだろうか。