エンタープライズ:特集 2003/10/17 11:50:00 更新


特集:第3回 tarボールからRPMパッケージを作るコツ (1/3)

緊急のセキュリティパッチ適用には、ディストリビュータのRPM配布を待っていられない。そんな時にも後々のアップデートの手間を考えれば、RPMでの管理を放棄するのは悩みどころだ。特集最終回では、このようなケースの解決策を解説する。

 この特集「リファレンスRPM」の第2回目でも解説したように、Linuxでソフトウェア管理が容易なパッケージ「RPM」を作成するためには、「コンパイルを行わせるためのSPECファイル」が必要となる。しかし、このSPECファイルの作成は変数とm4マクロ定義に関する知識が不可欠であり、かなり難易度の高い作業だ。このため、積極的にSPECファイルを触るというユーザーが多くない理由のひとつだと思われる。今回は、そのような背景ではあるものの、比較的容易な方法でtarボールからRPMパッケージを作成する方法について紹介していこう。RPMの概要については、第1回目を参考にしてほしい。


RPM(Red Hat Package Manager)はRed Hatに関わるエンジニアが自社ディストリビューションのために開発したのが始まりだ。tarボールによる伝統的なコンパイル作業を軽減すべく、手軽なコマンドでインストールやアップデートなどが行える。

最近見られるSPECファイルを含むtarボールの配布

 SRPMパッケージ(src.rpmファイル)の中身は、tarボールとSPECファイルで構成され、そのSPECファイル内に「./configure」実行時の設定や「RPMにパッケージする際に必要な情報」、インストール時の「プレ/アフター処理作業」が含まれていることを第2回目で解説した。

 しかし最近では、RPMとは別にソースコード配布が前提のtarボール内でも、SPECファイルが含まれていることがある。そのようなtarボールは、rpmbuildコマンドの「-t」オプションに続き指定することで、直接RPMパッケージを作成することが可能なのだ。オプションは「-b」と同等であり、以下のようになっている。

オプション
(パラメータ)
内     容
p
ソースコードにパッチをあてる
l
パッケージに必用なファイルが揃っているかチェックする
c
コンパイルを行う
i
インストールを行う
b
バイナリパッケージだけを作成する
s
src.rpmを構築する
a
バイナリパッケージとsrc.rpmパッケージの両方を作成する

 その違いは引数であるが、SPECファイルsrc.rpmか、tarボールかの違いであり使い方は同じだ。例えば、すべてコンパイルしてバイナリパッケージとソースパッケージを作成するのであれば、以下のように指定すればよい。

# rpmbuild -ta libglade-2.0.0.tar.gz

 tarボール内にSPECファイルが含まれていることが分かっていれば、これだけでsrc.rpmと同様にパッケージ作成が始まる。ただしsrc.rpmと同様、コンパイルがスムーズに成功するかどうかは時と場合による。そのため、SPECファイルや内部ソースを調整しながら作業を進めた方が確実なのだ。

 その場合には、いちどtarボールを解凍して含まれるSPECファイルを/usr/src/redhat/SPECS/に用意しよう。そして元々のtarボールのファイルは、/usr/src/redhat/SOURCE/に置けばよい。次のような操作だ。

# tar xvfz glade-2.0.0.tar.gz
# cp glade-2.0.0/glade.spec /usr/src/redhat/SPECS
# cp glade-2.0.0.tar.gz /usr/src/redhat/SOURCES

 後のコンパイル作業は、第2回目で解説したsrc.rpmと同じである。「rpmbuild -bp /usr/src/redhat/SPECS/glade.spec」と指定して作業を始め、コンパイルが行えるようになるまでSPECファイルやソースを調整していく。

 あくまで一般論だが、tarボールに含まれるSPECファイルは特定のディストリビューションを前提としておらず、ディストリビューション固有のマクロ、環境変数が用いられることが少ない。そのため、「BuildRoot」値によるディレクトリ指定や、実際にインストールされる「%Prefix」値などは前もって確認しておくべきだろう。

最低限把握すればよいSPECファイル内変数はそれほど多くない

 例えば、SPECファイル中に以下のような記述があったとしよう。

%define name glade2
%define ver 2.0.0
%define RELEASE SNAP
%define rel %{?CUSTOM_RELEASE} %{!?CUSTOM_RELEASE:%RELEASE}
%define prefix /usr  ←※1
%define sysconfdir /etc  ←※2
%define skreq 0.1.4

 上記リスト内の「%define」とは、マクロ変数を設定するためのものであり、この例ではベースとなる「prefix」は「/usr」(※1)、システム設定ファイルを置く「sysconfdir」値には「/etc」が設定される(※2)。これより後、「%{prefix}」などのマクロ変数部分にはこれらの値が代入されることになる。

BuildRoot: /var/tmp/glade-%{ver}-root
Docdir: %{prefix}/doc

 上の「%define」記述の後にこのような設定があれば、それぞれ次のように代入される。

BuildRoot: /var/tmp/glade-%{ver}-root → BuildRoot: /var/tmp/glade-2.0.0-root
Docdir: %{prefix}/doc → Docdir: /usr/doc

      | 1 2 3 | 次のページ

[渡辺裕一,ITmedia]