先日、個人的に作成して管理している Fedora 向けの RPM パッケージを公開するリポジトリを作りました。
リポジトリを公開するにあたっていくつか悩んだところがあったので、この記事ではその内のひとつの、自前でビルドした RPM パッケージにビルド依存する別の RPM パッケージを Mock を使ってビルドする方法について書いてみます。
Mock
Mock は chroot 環境で RPM をビルドするためのツールです。 Fedora のビルドシステムである Koji はパッケージのビルドに Mock を使っています。 そのため、Fedora が公式に提供しているパッケージは全て Mock を使ってビルドされていることになります。 Mock を使う理由としては、
- クリーンな chroot 環境のもとでパッケージをビルドすることで、依存関係 (BuildRequires) の不備を洗い出すことができる
- 設定ファイルで chroot 環境の中身を簡単に切り替えることができる
ことなどが挙げられると思います。 2に関して、例えばあらかじめ用意されている設定 (fedora-20-x86_64.cfg) を使って
mock -r fedora-20-x86_64 --rebuild <srpm>
とすると、Fedora 20 (x86_64) の chroot 環境が作られて、その中でパッケージをビルドしてくれます。同様に、
mock -r epel-7-x86_64 --rebuild <srpm>
とすれば EPEL 7 (x86_64) の chroot 環境でパッケージをビルドしてくれます。
パッケージビルドの依存関係を解決する
パッケージ A のビルドがパッケージ B に依存する場合、A をビルドする前に B を chroot 環境にインストールする必要があります。 Mock の場合だと、chroot 環境で有効になっているリポジトリに依存パッケージが登録されていれば自動でインストールしてくれるので、B がそのようなリポジトリに登録されていればそのまま A をビルドできます。 chroot 環境で有効にするリポジトリは Mock の設定ファイルで指定します。
Mock は Fedora や EPEL 向けの設定ファイルをあらかじめ用意してくれているのでこれをそのまま使うことができます。 ただし、これらの設定ファイルを使用した場合に有効になるリポジトリは Fedora や CentOS などの公式リポジトリに限られるため、例えば B が自分でビルドしたパッケージであったりすると自動ではインストールできません。 このようなケースで A を Mock を使ってビルドする方法は B がどこかのリポジトリに登録されているかどうかによって異なります。
1. パッケージ B がリポジトリに登録されている場合
この場合は、B が登録されているリポジトリを有効にする記述を Mock の設定ファイルに追加する必要があります。例えば B が myrepo というリポジトリに登録されている場合
cp /etc/mock/fedora-20-x86_64.cfg /etc/mock/myrepo-fedora-20-x86_64.cfg
として、myrepo-fedora-20-x86_64.cfg の config_opts['yum.conf']
に
[myrepo]
name=myrepo
baseurl=http://myrepo.example.com/path/to/rpms
のような通常の repo ファイルに書く設定を追記します。あとは A をビルドする際にこの設定ファイルを指定すれば myrepo から B がインストールされます。
mock -r myrepo-fedora-20-x86_64 --rebuild <path-to-srpm-of-A>
2. パッケージ B がリポジトリに登録されていない場合
この場合は、Mock のコマンドを通して chroot 環境に B を先にインストールしてから A をビルドする必要があります。
mock -r fedora-20-x86_64 --init
mock -r fedora-20-x86_64 --install <path-to-rpm-of-B>
mock -r fedora-20-x86_64 --rebuild --no-clean <path-to-srpm-of-A>
A をビルドする際に --no-clean
オプションを指定しないと、B をインストールした chroot 環境がビルド前に一度削除されてしまうので必ず指定する必要があります。
参考
- Using Mock to test package builds - FedoraProject