エンタープライズ:特集 | 2003/09/26 18:00:00 更新 |
特集:第2回 RPM活用のステップアップ−SRPMリビルドとコンパイルマスター (2/6)
手始めは最も簡単なリビルド操作をしてみよう
src.rpmから新しいバイナリパッケージを作るという作業は、1つのコマンドで処理可能だ。
# rpmbuild --rebuild srcパッケージ名 |
これだけでよい。実際の例を見ると、次のような表示になる。
# rpmbuild --rebuild autofs-3.1.7-36.src.rpm 〜中略〜 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHave Prefix) <= 4.0-1 Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/autofs-tmp 書き込み中: /usr/src/redhat/RPMS/i386/autofs-3.1.7-36.i386.rpm 書き込み中: /usr/src/redhat/RPMS/i386/autofs-debuginfo-3.1.7-36.i386.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.37796 〜以下略〜 |
この操作だけで利用するのは、次のような条件下である。
- 確実にコンパイルできることが分かっている。
- 基幹ライブラリをアップデートしたのでバイナリを最適化したい。
- パッケージ作成オプションを変更したので、適合するバイナリにしたい。
このような目的であれば上記の方法で十分だ。この一連の操作を「パッケージのリビルド」と呼ぶ。
パッケージの新規コンパイル
一方、パッケージの内容をカスタマイズしたり、コンパイルが成功するかどうか分からない場合には、SPECファイルやソースファイルの修正が必要となる。その際には、src.rpm内のファイルを編集する必要があるため、いちどインストールを行う。方法は通常のRPMパッケージのインストール手順と同じだ。
このsrc.rpm形式のパッケージをインストールすると、Red Hat Linuxの場合には、/usr/src/redhat/ディレクトリ下(開発用ディレクトリ)に各種のファイルが置かれる(他ディストリビューションでは、/var/src/ディレクトリ下などが利用されることも多い)。このディレクトリは、以下のような構造だ。
/usr/src/redhat/
/BUILD 作業用一時ディレクトリ
/RPMS 作成したパッケージのアーキテクチャ別保管場所
/athlon、/i386、/i486、/i586、/i686
/SOURES ソースtarファイル展開ツリー
/SPECS RPM作成用SPECファイル
/SRPMS 作成したSRPMSパッケージの保管場所
src.rpmをインストールしたら、/SPECS以下にパッケージのSPECファイルが配置されているはずだ。
# rpm -ivh balsa-2.0.6-1.src.rpm 1:balsa ########################################### [100%] # ls /usr/src/redhat/SPECS/ balsa.spec |
One Point: |
src.rpmは、インストールしても/usr/src/reedhat/ディレクトリ下にファイルが置かれるだけのため、システムそのものに影響はない。 |
次にコンパイルと呼ぶ作業を行う。上記のリビルドやこのコンパイルという手順は、従来rpmコマンドに続けて「--rebuild」や「-b」というオプションを使ってきた(バージョン3まで)。しかし、最近のバージョン4では、rpmコマンドからパッケージ作成機能は除外されており「Unknown Option」とエラーになってしまう。この場合、パッケージ作成専用の「rpmbuild」というコマンドを使用すればよい。
rpmbuildでパッケージを作成するには、「-b」オプションと、どのようなパッケージ作成を行うかを決めるオプションを組み合わせる。その後、パッケージのSPECファイル名を指定する。
|
これは上記のものから順に実行されていく。もし「-bc」とすればコンパイルまででインストールやパッケージの作成は行われない。「-ba」とすればパッチ当てから2つのパッケージの作成まですべてを実行する。
自ディストリビューションが公式に提供するsrc.rpm形式のファイルであれば、直接「-ba」を実行してもそのままコンパイルでき、何ごともなくパッケージが作成できるだろう。作成されたパッケージは/usr/src/redhat/RPM/i386/下にバイナリパッケージ、/usr/src/redhat/SRPM/下に新しいsrc.rpmが再構築される。以下は、例としてgv(グラフィックビューア)を最後までリビルドしたものだ。
# rpmbuild -ba /usr/src/redhat/SPEC/gv.spec 〜中略〜 Obsoletes: ghostview Processing files: gv-debuginfo-3.5.8-22 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Checking for unpackaged file(s): /usr/lib/rpm/check-files /var/tmp/gv-root 書き込み中: /usr/src/redhat/SRPMS/gv-3.5.8-22.src.rpm 書き込み中: /usr/src/redhat/RPMS/i386/gv-3.5.8-22.i386.rpm 書き込み中: /usr/src/redhat/RPMS/i386/gv-debuginfo-3.5.8-22.i386.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.15529 〜以下略〜 |
しかし、上記のようにストレートにコンパイル、パッケージ作成ができることはあまりない。途中でコンパイルエラーが表示されたり、パッケージ作成に失敗することもある。他のディストリビューション向けのsrc.rpmをリビルドはもちろん、大規模なパッケージのリビルドは一筋縄でいかないことが多いのだ。
そのような場合、SPECファイルや環境の調整が必要になってくる。同時に、SPECファイルの調整で既存のRPMパッケージにはないコンパイルオプションを利用、カスタマイズすることもできるようになる。
[渡辺裕一,ITmedia]