はじめに
前回 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
について紹介する。