みつきんのメモ

組み込みエンジニアです。Interface誌で「My オリジナルLinuxの作り方」連載中

Yocto bitbake-layers layerindex-fetch

はじめに

bitbake-layersコマンドの便利なサブコマンドを見つけた(認識した)。

レイヤ間の依存関係

bitbakeで取り扱うレイヤではlayer.confに下記のようにLAYERDEPENDSを記述することで、依存関係を定義することができる。

LAYERDEPENDS_gnome-layer = "core openembedded-layer networking-layer"

しかし、bitbake-layers add-layerをする場合、依存関係の順番を間違えると面倒なことになる。

$ bitbake-layers add-layer ../poky/meta-openembedded/meta-gnome

一見問題なく追加できるが、次回以降bitbake-layersのコマンドを実行すると下記のようにエラーが発生する。

$ bitbake-layers show-layers
NOTE: Starting bitbake server...
Traceback (most recent call last):
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/bin/bitbake-layers", line 95, in <module>
    ret = main()
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/bin/bitbake-layers", line 63, in main
    tinfoil.prepare(True)
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/lib/bb/tinfoil.py", line 414, in prepare
    self.run_command('parseConfiguration')
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/lib/bb/tinfoil.py", line 470, in run_command
    raise TinfoilCommandFailed(result[1])
bb.tinfoil.TinfoilCommandFailed: Traceback (most recent call last):
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/lib/bb/command.py", line 74, in runCommand
    result = command_method(self, commandline)
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/lib/bb/command.py", line 275, in parseConfiguration
    command.cooker.parseConfiguration()
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/lib/bb/cooker.py", line 433, in parseConfiguration
    self.handleCollections(self.data.getVar("BBFILE_COLLECTIONS"))
  File "/home/mickey/work/yocto/x86-dunfell/layers/poky/bitbake/lib/bb/cooker.py", line 1225, in handleCollections
    raise CollectionError("Errors during parsing layer configuration")
bb.cooker.CollectionError: Errors during parsing layer configuration

これはmeta-gnomeが依存しているレイヤがないため発生するのだが、この状態になるとテキストエディタなどでbblayers.confを修正する必要がある。

meta-gnomeに記載されている依存関係は下記。

  1. core
  2. openembedded-layer
  3. networking-layer

しかしここで厄介なのが、networking-layerがmeta-pythonに依存しているためそちらも記述しなければならない。 このようなネストした依存関係がある場合には、1つずつ追加していくのが面倒となってくる。

bitbake-layers layerindex-fetch

レイヤ間の依存関係をプログラム的にチェックできるのであれば、追加する前にエラーにするか、自動的に追加するなどしてほしいと思っていた。 しかし、layerindex-fetchサブコマンドを使用すると自動的に依存関係を解決して、必要であればレイヤのダウンロードまでおこなってくれる。

$ bitbake-layers layerindex-fetch meta-gnome
NOTE: Starting bitbake server...
Loading https://layers.openembedded.org/layerindex/api/;branch=dunfell...
Layer                                              Git repository (branch)                                 Subdirectory
=============================================================================================================================
local:HEAD:openembedded-core                       git://git.yoctoproject.org/poky.git (dunfell)           meta
  required by: meta-gnome meta-networking meta-python meta-oe
layers.openembedded.org:dunfell:meta-oe            git://git.openembedded.org/meta-openembedded (dunfell)  meta-oe
  required by: meta-python meta-networking meta-gnome
layers.openembedded.org:dunfell:meta-python        git://git.openembedded.org/meta-openembedded (dunfell)  meta-python
  required by: meta-networking
layers.openembedded.org:dunfell:meta-networking    git://git.openembedded.org/meta-openembedded (dunfell)  meta-networking
  required by: meta-gnome
layers.openembedded.org:dunfell:meta-gnome         git://git.openembedded.org/meta-openembedded (dunfell)  meta-gnome
Cloning into '/home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded'...
remote: Counting objects: 148262, done.
remote: Compressing objects: 100% (49118/49118), done.
remote: Total 148262 (delta 92673), reused 147741 (delta 92348)
Receiving objects: 100% (148262/148262), 39.27 MiB | 3.67 MiB/s, done.
Resolving deltas: 100% (92673/92673), done.
Adding layer "meta-oe" (/home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-oe) to conf/bblayers.conf
Adding layer "meta-python" (/home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-python) to conf/bblayers.conf
Adding layer "meta-networking" (/home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-networking) to conf/bblayers.conf
Adding layer "meta-gnome" (/home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-gnome) to conf/bblayers.conf

レイヤの設定状況を確認する。

$ bitbake-layers show-layers
NOTE: Starting bitbake server...
layer                 path                                      priority
==========================================================================
meta                  /home/mickey/work/yocto/x86-dunfell/layers/poky/meta  5
meta-poky             /home/mickey/work/yocto/x86-dunfell/layers/poky/meta-poky  5
meta-yocto-bsp        /home/mickey/work/yocto/x86-dunfell/layers/poky/meta-yocto-bsp  5
meta-oe               /home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-oe  6
meta-python           /home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-python  7
meta-networking       /home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-networking  5
meta-gnome            /home/mickey/work/yocto/x86-dunfell/layers/poky/meta-openembedded/meta-gnome  7

meta-gnomeが依存する全てのレイヤが追加されている。

自動的にダウンロードできるレイヤについて

レイヤのダウロードにはhttps://layers.openembedded.org/layerindex/api/というWeb APIを使用している。

そのため、OpenEmbedded Layer Indexに登録されているもののみが対象となっていると推測される。

既存の設定について

layerindex-fetchでは既に追加してあるレイヤに関しては削除されないため、ローカルで開発中のレイヤなどがBBLAYERSに既にある場合でも問題なく使用することができる。

ブランチ

下記のようにすることで、ダウンロードする際に使用するブランチを指定することができる。

$ bitbake-layers layerindex-fetch meta-gnome -b dunfell

ブランチを指定しない場合は、現在チェックアウトしているpokyのブランチがデフォルトとなる。

例えば、pokyがgatesgarthである時にブランチを指定せずにlayerindex-fetchを実行するとgatesgarthブランチが選択される。

また、レイヤ側がmasterブランチしか持っていない場合などに、pokyがdunfellだった場合ではデフォルト指定ではエラーになる。

$ bitbake-layers layerindex-fetch meta-efi-secure-boot
NOTE: Starting bitbake server...
Loading https://layers.openembedded.org/layerindex/api/;branch=dunfell...
ERROR: Layer "meta-efi-secure-boot" not found in layer index

そのような場合にはブランチを明示する必要がある。

$ bitbake-layers layerindex-fetch meta-efi-secure-boot -b master

まとめ

bitbake-layers layerindex-fetchは便利。