self-build パッケージについて
仕組みの概要
- 事前にターゲットの rpm パッケージを作成するのに必要な、spec と patch やその他のファイルを用意しておきます。
- 上記のファイル類を self-build-%{target} な rpm パッケージに含めておきます。
- %post で以下の処理を一括して行います。
- まず rpm ビルド用のテンポラリディレクトリと作成
- 次に patch やその他のファイルを /テンポラリ/rpm/SOURCES にコピー
- 続いて wget を使ってソースをダウンロード
- 後は、rpmbuild -bb でターゲットのパッケージを所定のディレクトリにビルド
- rpm2cpio | cpio を使ってビルドしたパッケージからファイルを事前に展開 (オプショナル)
- apt/synaptic を使ってインストールされた場合は、Scripts::PM::Post:: というスロットを使って、rpm の DB に変更がコミットされた(= self-build-%{target} 自体のインストールが完了した)直後にヘルパースクリプトを呼び出します。
このスクリプトが所定のディレクトリ(/var/chache/self-build)に置かれたターゲットの rpm ファイルをインストールします。
作り方
- 最初にターゲットのプログラム(以下 lame を例に説明) の rpm パッケージが作成できる spec ファイルを用意します。
もし patch やその他のファイルが必要な場合は、これも一緒に準備しておきます。
- 上記の spec ファイルを使って rpm のバイナリパッケージが作成できることを確認したら、次に self-buiild-lame 用の spec を作成します。
- ターゲットのプログラム用の spec や patch、その他のファイルを Source? で定義しておきます。
- PreReq: にターゲットのプログラムの BuildRequires: と同じものを書いておきます。
こうすることで、%post でコンパイルする時に必要となるパッケージが一緒にインストールされます。
- self-buiild 用の spec とターゲットのプログラム用の spec で、%{version}-%{release} が異なると事前のパッケージ配置に失敗するので、%prep でチェックしておきます。
%prep
[ "%{version}-%{release}" != $(rpm -q --queryformat "%%{version}-%%{release}\n" --specfile %{SOURCE0} | tail -1) ] && exit 1
- %install で Source? で定義した各種ファイルを全て ${RPM_BUILD_ROOT}/%{_datadir}/self-build-lame にインストールします。
またこれらのファイルを %files でも指定しておきます。
- %post で rpm パッケージをビルドするヘルパースクリプトを、以下のように実行します。
%post
/usr/lib/rpm/self-build-rpm.sh self-build-lame lame.spec !http://...(ソースダウンロード URL)
- 1つ目の引数は、self-build パッケージの名前を指定します。
この名前を使って spec や patch 類が置いてあるディレクトリ(ここでは /usr/share/self-build-lame)を特定します。
- 2つ目の引数は、rpm のビルドに使用する spec ファイル名を指定します。
- 3つ目の引数は、ソースファイルをダウンロードするための URL を指定します。
ヘルパースクリプトはこの URL から wget を使ってソースをダウンロードしようとします。
3つめ以降の引数は全てソースの URL と解釈するので、複数のファイルをダウンロードする必要がある場合は、続けて指定できます。
また同一のファイルを複数のミラーサイトからダウロードできる場合は、それらの URL も複数指定できます。
この場合、いずれかの URL からファイルがダウンロードできたら2つ目以降の URL からのダウンロードはスキップします。
- 他の self-build パッケージから依存される場合は、%post で更に以下のようヘルパースクリプトを実行して、作成した rpm パッケージが実際にインストールされるより前に、必要なファイルをファイルシステム上に展開します。(オプショナル)
%post
/usr/lib/rpm/pre-allocate-rpm.sh %{pkgname}-%{version}-%{release} \
%{pkgname}-devel-%{version}-%{release}
- 引数には、ターゲットの rpm パッケージ名を指定します。
対象のファイルが特定できるように Version と Release まで指定する必要があります。
- ヘルパースクリプトは指定された rpm から 設定ファイル(rpm -qc で表示されるもの)とドキュメント(rpm -qd で表示されるもの)を除いたファイルを rpm2cpio | cpio コマンドで抽出し、ファイルシステム上に展開します。
尚、この展開したファイルは後の rpm パッケージのインストールにより上書きされます。
- これにより依存関係をもつ複数の self-build パッケージが同一トランザクションでインストールできるようになります。
- spec ができたら、$ rpm -ba self-build-lame.spec で rpm パッケージを作成し、その後 root になって # rpm -Uvh self-build-lame-3.97-0vl3.i386.rpm のようにしてインストールし、ターゲットの rpm ファイルが /var/cache/self-build 以下にできあがることを確認します。
実際にはパッケージ名やターゲットのプログラムの名前、ソースのダウンロード URL 等は %define でマクロとして最初に宣言しておいた方が管理しやすくなります。
self-build-lame.spec がサンプルとして使えると思いますので、初めて作成する方は apt-get source self-build-lame を実行して ~/rpm/SPECS に展開された spec ファイルを参考してみてください。
self-build 同士が依存する場合の注意点
ある self-build なパッケージが、他の self-build なパッケージが提供する rpm に依存する場合、以下の点に注意する必要があります。
- 他の self-build パッケージから依存されそうな場合は、pre-allocate-rpm.sh を %post で実行
たとえば self-build-lame からは lame, lame-mp3x, lame-devel の3つの rpm が出来上がります。これらは(たとえば) mplayer を mp3 対応でビルドする為には、予めインストールされている必要があります。
このような場合、self-build-lame.spec の %post で pre-allocate-rpm.sh を実行しておくと、事前に必要なバイナリやヘッダファイル等がファイルシステム上に展開されるので、apt-get install self-build-mplayer を実行した結果、依存により self-build-mplayer と self-build-lame が一緒に一回でインストールされても、mplayer を mp3 対応でビルドできるようになります。
- self-build 同士の依存情報は、self-build-*.spec 内の PreReq にのみ記述
上記のケースで、mplayer のビルドに lame, lame-devel が必要となる場合、各 spec には以下のように記述します。
これは self-build の仕組み上、先にすべての rpm パッケージを作成して、その後にできた rpm パッケージをまとめてインストールするので、後からインストールされる rpm パッケージをその前の段階で要求すると、依存が満たせずにエラーとなるのを防ぐためです。
- self-build-mplayer.spec
PreReq: self-build-lame, *-devel
- mplayer.spec
BuildRequires: *-devel 等 (※ self-build-lame、lame-devel は書かない)
self-build パッケージの %{arch}
self-build パッケージは、基本的には noarch で作成します。
ただし、BuildArch?: noarch を使うと、%ifarch が使えないので、
arch に依存するパッケージでは BuildArch? タグを使えません。
現時点で、arch に依存するのは、以下のパッケージです。
- self-build-ffmpeg
- self-build-x264
- self-build-vlc-1.0.1-1vl5.x86_64
- self-build-xvidcore-1.2.1-3vl5.x86_64
- self-build-mplayer-codecs-20071007-5vl5.x86_64
- self-build-lame-3.97-5vl5.x86_64