オレオレrpmパッケージの作り方(基本編)

こんにちわ。arashoです。毎度インフラ周りのネタばかりですが、最近rpmのパッケージを作る機会が多いので、一度まとめとしてrpm関連の事を記載してみたいと思います。というわけで、今回は作業環境の構築と基本的なビルドの方法から。

rpmにはおおざっぱに言うと2種類あります。rpmとsrpmと呼ばれるもので、前者は実行形式のバイナリ、後者はrpmを作るためのソース(Source)が収められています。srpm -> rpmの流れですね。

rpmビルド作業環境の準備

まず、rpmを作るにはsrpmをほげほげできる環境を用意します。rpm-buildパッケージ(と依存するパッケージ)をインストールしましょう。
次に、設定の変更です。Redhat系ではデフォルトでだと/usr/src/redhat以下にsrpmはインストールされてしまうので、自分が自由にインストールできるよう設定を変更します。
srpmを扱うディレクトリは_topdirで定義します。
デフォルトの設定を見てみましょう。いくつかディレクトリ構成にかかわる設定を抜き出してみました。

$ rpmbuild --showrc
(中略)
-14: _builddir  %{_topdir}/BUILD
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir   %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir    %{_usrsrc}/redhat
-14: _usr       /usr
-14: _usrsrc    %{_usr}/src
(中略)

このような設定になっているので、%{_topdir}を変更すれば好きな場所にインストールすることができそうです(%{_topdir}以下の大文字のディレクトリの用途は、色々web上に記載があるのでここでは省略します)。
上記を含むrpm関係の設定を変更するにはマクロファイルを設定します。

$ rpmbuild --showrc
(中略)
macrofiles            : /usr/lib/rpm/macros:/usr/lib/rpm/x86_64-linux/macros:/usr/lib/rpm/redhat/macros:/etc/rpm/macros.
*:/etc/rpm/macros:/etc/rpm/x86_64-linux/macros:~/.rpmmacros
(中略)

となっているので~/.rpmmacrosを設定するのがシステムに与える影響が最低限で妥当でしょう。
ここでは取り急ぎ、_topdirを~/rpmディレクトリに変更します。

$ mkdir -p ~/rpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
$ echo "%_topdir   /home/arasho/rpm" > ~/.rpmmacros

では、設定が変更されたことを確認しましょう。

$ rpmbuild --showrc | grep topdir
-14: _builddir  %{_topdir}/BUILD
-14: _rpmdir    %{_topdir}/RPMS
-14: _sourcedir %{_topdir}/SOURCES
-14: _specdir   %{_topdir}/SPECS
-14: _srcrpmdir %{_topdir}/SRPMS
-14: _topdir    /home/arasho/rpm

設定の変更が反映されました。

srpmのビルド

環境が構築できたら、まずはsrpmからrpmをビルドしてみましょう。単純にダウンロードしたsrpmからrpmを作るには、srpmに対して以下のコマンドを打つだけです。

$ rpmbuild --rebuild package-name-version.src.rpm

ビルドに必要なrpmが入っていて、正常終了すれば、~/rpm/RPMS以下のサブディレクトリのどこかにrpmができていることでしょう。RPMS以下にはi386やx86_64、noarchなどのディレクトリがあります。これらは各種アーキテクチャ用のrpmが入るディレクトリだったり、アーキテクチャ依存がないパッケージはnoarch以下にrpmができます。
次に、srpmを一度インストールしてからrpmをビルドしてみましょう。ビルドはやはりrpmbuildコマンドを使いますが、オプションが変わります。-bbはrpmファイルをビルドするオプションで、specファイルはビルドするための所謂手順書です。specファイルには作られたrpmのパッケージ情報やソースやパッチのファイル、コンパイルオプションやパッケージングの仕方などが記載されており、パッケージの作成において細かい制御が可能となっています。

$ rpm -ivh package-name-version.src.rpm
$ rpmbuild -bb ~/rpm/SPECS/package-name.spec

やはり同じようにrpmパッケージがビルドできました。他にも-baや-bs、-bpオプションなどありますが、他のオプションは必要に応じた時にヘルプで確認しておけばいいかなと思います。
とりあえず、世の中にあるsrpmをビルドしてインストールしたい場合は以上の事で事足りてしまいます。

srpmのカスタムビルド

特定の機能だけを有効/無効にしてビルドしたい場合、specファイルによっては、自分でspecファイルを修正しなくても利用用途に合わせてビルドすることができます。
たとえば、CentOS4のphp4系のsrpmのspecファイルには

%define with_oci8 %{?_with_oci8:1}%{!?_with_oci8:0}
%define with_mssql %{?_with_mssql:1}%{!?_with_mssql:0}

という記載があります。これによってビルド時にオプションを与えることでoci8やmssqlの機能を有効/無効にすることができます。
rpmbuildのヘルプを見ると

$ rpmbuild --help
(中略)
  --with=

とありますが、これを使います。oci8を有効にするには、

$ rpmbuild --with=oci8 -bb ~/rpm/SPECS/php.spec

とすることで、specファイルに手を入れずビルドすることができます(もちろん依存するライブラリ等は入っている事が前提ですが)。

以上のようにrpmのビルドはデフォルトのままのビルドやspecファイルを修正しない程度のカスタムビルドは非常に簡単です。意外に長くなってしまったので、今回はこの辺までにして、次回はspecファイルの書き方のコツやデバッグ方法などを載せたいと思います。

コメント / トラックバック 1 件

#1 オレオレrpmパッケージの作り方(ビルド編) 2008/01/10 20:07

[...] こんにちわ。arashoです。今回は前回のエントリに引き続きrpmパッケージのビルドのコツや効率よくパッケージングを行う小ネタなどを書いてみたいと思います。 [...]

コメントする