みつきんのメモ

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

Yocto Project アーカイバ調査

はじめに

オープンソースでは要求に応じて、ソースコードを開示する必要がある。 Yocto ProjectではBitBakeで作成されたOSイメージに含まれるすべてのOSSライセンスのパッケージについて ソースコードアーカイブする機能としてアーカイバを提供している。

存在は知っていたがきちんと調べたことがなかったので調査する。今回は5.0(scarthgap)を使用。

使用方法

local.confに下記を追加する。

INHERIT += "archiver"
ARCHIVER_MODE[src] = "original"

DEPLOY_DIR_SRC(build/tmp/deploy/sources)にファイルが展開される。

ARCHIVER_MODE

アーカイバ機能の基本動作はARCIVER_MODE変数のsrc変数フラグにより変わる。

ARCHIVER_MODE[src]

ARCHIVER_MODE[src]には以下の値が設定可能となっている。

機能 備考
original オリジナルのソースコード
patched パッチ適用済みのソースコード デフォルト
configured configure実行済みのコースコード
mirror ミラーデータ

original

do_unpackした状態のソースコードとパッチファイルが保存される。

systemdの例は以下のようになる。

00-create-volatile.conf
0002-binfmt-Don-t-install-dependency-links-at-install-tim.patch
0003-timedated-Respond-on-org.freedesktop.timedate1.SetNT.patch
0008-implment-systemd-sysv-install-for-OE.patch
99-default.preset
init
series
systemd-1_255.21-r0.tar.xz
systemd-pager.sh
touchscreen.rules

patched

do_patch実行後のソースコードの状態がtar.xz形式で保存される。 systemdの例では「systemd-1_255.21-r0-patched.tar.xz」となる。

configured

do_configure実行後のソースコードの状態がtar.xz形式で保存される。 systemdの例では「systemd-1_255.21-r0-configured.tar.xz」となる。

mirror

ミラーディレクトリ作成用のアーカイブが作成される。 BB_GENERATE_MIRROR_TARBALLS = "1"が必要となるので注意が必要。

ARCHIVER_MODE[diff]

ARCHIVER_MODE[diff]に"1"を設定すると、do_unpack直後のソースとdo_patch後のソースのすべての差分が1つのパッチファイルとして保存される。 systemdの場合は「systemd-1_255.21-r0-diff.gz」となる。

ARCHIVER_MODE[diff-exclude]

この時に下記のように設定すると、パッチファイルを作成する際に除外するファイルを設定することができる。

ARCHIVER_MODE[diff-exclude] ?= ".pc autom4te.cache patches"

ARCHIVER_MODE[dumpdata]

ARCHIVER_MODE[dumpdata]に"1"を設定すると、bitbake -eで出力されるような環境変数のダンプデータのアーカイブが保存される。 systemdの場合は「systemd-1_255.21-r0-showdata.dump」となる。

#
# $ABIEXTENSION
#   [no history recorded]
#
#   "${@bb.utils.contains('TUNE_FEATURES', 'aarch64', '${ABIEXTENSION_64}', '${ABIEXTENSION_32}', d)}"
ABIEXTENSION=""
#
# $ABIEXTENSION:class-crosssdk
#   [no history recorded]
#
#   ""
ABIEXTENSION:class-crosssdk=""
#
# $ABIEXTENSION:class-nativesdk
#   [no history recorded]
#
#   ""

ARCHIVER_MODE[recipe]

ARCHIVER_MODE[recipe]を"1"に設定すると、レシピ(.bb,.bbappend)や参照される.incがtar.xz形式で保存される。 systemdの場合は「systemd-1_255.21-r0-recipe.tar.xz」となる。

ARCHIVER_MODE[srpm]

ARCHIVER_MODE[srpm]を"1"に設定すると、ソースパッケージ(.src.rpm)が保存される。 systemdの場合は「systemd-255.21-r0.src.rpm」となる。

PACKAGE_CLASSESが"package_rpm"以外の場合はエラーとなる。

ARCHIVER_MODE[mirror]

ARCHIVER_MODE[mirror]を設定することで、ミラーデータ保存時のディレクトリ構造を指定できる。

設定できる値は下記の通り。

  • split(default)
  • combined

ARCHIVER_MODE[mirror] = "split"

他のアーカイバモードと同じディレクトリ構造で保存される。

単一のミラーディレクトリを作成するには、手動での修正が必要になる場合があるが、 ソースの重複の確認など、より柔軟に対応することができる。

ARCHIVER_MODE[mirror] = "combined"

すべてのソースが単一のディレクトリに保存される。 このためミラーディレクトリとしてそのまま使用することができる。 ただし、重複するソースがあった場合には無視される。

ミラーディレクトリを作るためのlocal.confの設定例を以下に示す。

INHERIT += "archiver"
ARCHIVER_MODE[src] = "mirror"
ARCHIVER_MODE[mirror] = "combined"
BB_GENERATE_MIRROR_TARBALLS = "1"

${DEPLOY_DIR_SRC}/mirrorがミラーディレクトリとして使用可能となる。

ARCHIVER_MODE[compression]

アーカイブの圧縮形式を指定することができる。 以下の値が指定可能となっている。

  • xz(デフォルト)
  • gz
  • bz2

まとめ

今回はアーカイバの機能を調査した。

以下のような形式でソースコードアーカイブが作成可能であることがわかった。

付加機能としてミラーディレクトリ作成のためのアーカイブも作成可能。

また、オプションで以下のものもソースコードアーカイブと同時に作成できる。

かなり多機能であることがわかった。