みつきんのメモ

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

Yocto Project bitbake-layersの新機能を試す その1

はじめに

前回 Scarthgapのリリースに伴うbitbake-layersの新機能を紹介した。この機能がかなり強力なので具体的な例を示してみる。

今回紹介する機能

Scarthgapで追加された下記のサブコマンドについて紹介する。

  • create-layers-setup

create-layers-setup

前回紹介したとおり、このコマンドを実行すると現在のレイヤ構成を再現するためのスクリプトjsonが出力される。

環境設定

デフォルト環境だとつまらないので下記のようにする。

$ git clone git://git.yoctoproject.org/poky.git -b scarthgap
$ source poky/oe-init-build-env build
$ cat << 'EOF' >> ./conf/local.conf
MACHINE ?= "qemuarm64"

QB_OPT_APPEND:append = " -echr 0x14"

INIT_MANAGER ?= "systemd"
DL_DIR ?= "${TOPDIR}/../downloads"

IMAGE_INSTALL:append = " emacs"
EOF
$ bitbake-layers layerindex-fetch meta-oe
  • meta-oeをビルド対象に追加
  • local.confを修正し、emacsパッケージを追加

レイヤの構成を確認する。

$ bitbake-layers show-layers
layer                 path                                                                    priority
========================================================================================================
core                  /home/mickey/yocto/scarthgap/poky/meta                                  5
yocto                 /home/mickey/yocto/scarthgap/poky/meta-poky                             5
yoctobsp              /home/mickey/yocto/scarthgap/poky/meta-yocto-bsp                        5
openembedded-layer    /home/mickey/yocto/scarthgap/poky/meta-openembedded/meta-oe             5

meta-oeが追加されている。

コマンド実行

この状態でcreate-layers-setupサブコマンドを実行する。

$ bitbake-layers create-layers-setup dest-dir01

するとdest-dir01というディレクトリが作成されている。

dest-dir01/
├── setup-layers
└── setup-layers.json

setup-layersはレイヤを設定するためのスクリプトとなっており、これ実行するとsetup-layers.jsonに記述された内容に従いレイヤのディレクトリ構成を作成する。

setup-layers.json

setup-layers.jsonの内容は以下のようになっている。

{
    "sources": {
        "meta-openembedded": {
            "git-remote": {
                "branch": "scarthgap",
                "describe": "",
                "remotes": {
                    "origin": {
                        "uri": "git://git.openembedded.org/meta-openembedded"
                    }
                },
                "rev": "a72010b414ee3d73888ac9cb4e310e8f05e13aea"
            },
            "path": "poky/meta-openembedded"
        },
        "poky": {
            "git-remote": {
                "branch": "scarthgap",
                "describe": "scarthgap-5.0-33-gf450ddee3e",
                "remotes": {
                    "origin": {
                        "uri": "git://git.yoctoproject.org/poky.git"
                    }
                },
                "rev": "f450ddee3e1299dc80e1641c38bbd1699764ac87"
            },
            "path": "poky"
        }
    },
    "version": "1.0"

レイヤを含むリポジトリのブランチ、リビジョン、ディレクトリ構成の相対パスが記述されていることが確認できる。

setup-layers実行

setup-layersスクリプトを実行してみる。

$ cd dest-dir01
$ ./setup-layers

実行後のディレクトリの内容は以下のようになっている。

$ tree . -d -L 2
.
└── poky
    ├── bitbake
    ├── contrib
    ├── documentation
    ├── meta
    ├── meta-openembedded
    ├── meta-poky
    ├── meta-selftest
    ├── meta-skeleton
    ├── meta-yocto-bsp
    └── scripts

setup-layers.jsonに記述された通り、pokyが取得され、poky配下でmeta-openembeddedが配置されている。

$ cd poky
$ git log -n 1 --pretty=oneline
f450ddee3e1299dc80e1641c38bbd1699764ac87 (HEAD, origin/scarthgap) build-appliance-image: Update to scarthgap head revision
$ cd meta-openembedded
$ git log -n 1 --pretty=oneline
a72010b414ee3d73888ac9cb4e310e8f05e13aea (HEAD, origin/scarthgap) Revert "nautilus: update 45.1 -> 46.1"

リビジョンもきちんと一致している。

その他

create-layer-setupが対象とするレイヤはリモートのgitリポジトリである必要がある。

試しにローカルのレイヤを作成し実行してみる。

$ cd ../../
$ bitbake-layers create-layer meta-tools-test -a
$ bitbake-layers show-layers
layer                 path                                                                    priority
========================================================================================================
core                  /home/mickey/yocto/scarthgap/poky/meta                                  5
yocto                 /home/mickey/yocto/scarthgap/poky/meta-poky                             5
yoctobsp              /home/mickey/yocto/scarthgap/poky/meta-yocto-bsp                        5
openembedded-layer    /home/mickey/yocto/scarthgap/poky/meta-openembedded/meta-oe             5
meta-tools-test       /home/mickey/yocto/scarthgap/build/meta-tools-test                      6
$ bitbake-layers create-layers-setup dest-dir02
NOTE: Starting bitbake server...
ERROR: Layer meta-tools-test in /home/mickey/yocto/scarthgap/build/meta-tools-test has uncommitted modifications or is not in a git repository.
ERROR: Could not determine layer sources
Traceback (most recent call last):
  File "/home/mickey/yocto/scarthgap/poky/bitbake/bin/bitbake-layers", line 95, in <module>
    ret = main()
  File "/home/mickey/yocto/scarthgap/poky/bitbake/bin/bitbake-layers", line 88, in main
    return args.func(args)
  File "/home/mickey/yocto/scarthgap/poky/meta/lib/bblayers/makesetup.py", line 83, in do_make_setup
    p.do_write(self, args)
  File "/home/mickey/yocto/scarthgap/poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py", line 92, in do_write
    raise Exception(err)
Exception: Could not determine layer sources

meta-tools-test has uncommitted modifications or is not in a git repository.ということで、 gitリポジトリでかつ、すべての修正がコミット済みであることが求められる。

作成したmeta-tools-testをgitリポジトリにして試してみる。

$ cd meta-tools-test
$ git init
$ git add .
$ git commit -m 'first commit'
$ cd ../
$ bitbake-layers create-layers-setup dest-dir02
NOTE: Starting bitbake server...
Traceback (most recent call last):
  File "/home/mickey/seagate/yocto/scarthgap-qemu/poky/bitbake/bin/bitbake-layers", line 95, in <module>
    ret = main()
  File "/home/mickey/seagate/yocto/scarthgap-qemu/poky/bitbake/bin/bitbake-layers", line 88, in main
    return args.func(args)
  File "/home/mickey/seagate/yocto/scarthgap-qemu/poky/meta/lib/bblayers/makesetup.py", line 83, in do_make_setup
    p.do_write(self, args)
  File "/home/mickey/seagate/yocto/scarthgap-qemu/poky/meta/lib/bblayers/setupwriters/oe-setup-layers.py", line 87, in do_write
    repos = parent.make_repo_config(args.destdir)
  File "/home/mickey/seagate/yocto/scarthgap-qemu/poky/meta/lib/bblayers/makesetup.py", line 65, in make_repo_config
    if not repos[repo_path]['git-remote']['remotes'] and not repos[repo_path]['contains_this_file']:
KeyError: 'contains_this_file'

エラーの内容は変わるがエラーになることは変わらず。 リポジトリのリモート情報にアクセスしようとしているように見える。

リモートリポジトリ化

無理やりリモートリポジトリにしてみる。 別の端末で下記を実行する。

$ sudo mkdir -p /opt/repos/meta-tools-test.git
$ sudo chmod 777 /opt/repos/meta-tools-test.git
$ cd /opt/repos/meta-tools-test.git
$ git init --bare --shared

元の端末で下記を実行し、リモートリポジトリにpushする。

$ cd meta-tools-test
$ git remote add example ssh://localhost:/opt/repos/meta-tools-test.git
$ git push example master
$ cd ..

この状態で再度create-layer-setupを試す。

$ bitbake-layers create-layers-setup dest-dir02
NOTE: Starting bitbake server...
NOTE: Created /home/mickey/seagate/yocto/scarthgap-qemu/build/dest-dir02/setup-layers.json
NOTE: Created /home/mickey/seagate/yocto/scarthgap-qemu/build/dest-dir02/setup-layers

成功した。

dest-dir02/setup-layers.jsonを確認する。

... (snip) ...
        "meta-tools-test": {
            "git-remote": {
                "branch": "master",
                "describe": "",
                "remotes": {
                    "example": {
                        "uri": "ssh://localhost:/opt/repos/meta-tools-test.git"
                    }
                },
                "rev": "24b27a2c31599c0141f5184b298742c8e090f2a5"
            },
            "path": "build/meta-tools-test"
        },
... (snip) ...

今回はlocalhostを使用したが、sshでアクセス可能なPCであれば同じことができる。

setup-layers実行

$ cd dest-dir02
$ ./setup-layers --destdir output

結果を確認する。

$ tree output/ -d -L 2
output/
├── build
│   └── meta-tools-test
└── poky
    ├── bitbake
    ├── contrib
    ├── documentation
    ├── meta
    ├── meta-openembedded
    ├── meta-poky
    ├── meta-selftest
    ├── meta-skeleton
    ├── meta-yocto-bsp
    └── scripts

まとめ

bitbake-layersのcreate-layers-setupサブコマンドについて紹介した。 現在のレイヤ構成を再現するためのjsonスクリプトを吐き出してくれる便利なスクリプトだが、 対象となるレイヤがすべてリモートリポジトリである必要があるということが確認できた。

次回はsave-build-confについて紹介する。