自分で作るRPMパッケージ

RPMパッケージの自作

 このように、RPMパッケージを作成すること自体はrpmコマンドで簡単にできます。問題は、specファイルをどのように作るかに帰着するといっていいでしょう。

 ただ、ソースコードからコンパイルする場合、まずコンパイルをエラーなく行えるようにしなければなりません。これに関しては本稿で扱う範囲を逸脱するので、割愛させていただきます。申し訳ありませんが、この作業はできるもの、という前提です。最近のソフトウェアは、たいてい./configureで設定できるので楽です。

 また、オリジナルに対する変更を記述した差分ファイル(パッチ)を作っておくと、後で変更点がすぐ分かります。

■パッケージ作成の下準備

 作業用のディレクトリは、前述のように~/RPM/BUILDを使いましょう。この下にパッケージ名に即したディレクトリを作り、その下で試行錯誤します。

 1つ注意する必要があるのは、rpmコマンドはパッケージを作るとき、1度インストールを行うということです。つまり、普段と同じようにコンパイルすると、システムに存在するファイルを書き換えてしまうということです。これを回避するため、一時インストール用のディレクトリを/var/tmpあたり作成するようにMakefileなり、configureなりを書き換えておく必要があります。

 最近のソフトウェアなら、makeまでは比較的簡単にできるはずです。そこでいきなりmake installせず(インストール用のコマンドがあってもそれを実行せず)、make -n installで様子を見ます。これで/var/tmpあたりにインストールするように、Makefileの該当部分を書き換えます。これはあくまでインストール時の話で、コンパイル時には実際にインストールするディレクトリを指定してやります。例えば、

$ ./configure --prefix=/usr

としてからmakeコマンドを実行し、make -n installで様子を見るわけです。

 本番のインストール先にしても、/usrにするか、/usr/localにするか、ちょっと悩むところです。一般に/usr/local以下はパッケージ管理システムの管轄外であり、ソースコードからコンパイルする場合のインストール先になっています。従って、RPMパッケージを作るのであれば、インストール先は/usrとしておくべきでしょう。

■specファイルの書き方

 では、ctags.specを例にして、specファイルの中身を見てみましょう。もちろん、これですべてが解説できるわけではありませんので、細かい部分はマニュアルやドキュメントを参照してください。また、リスト1に今回作成したspecファイルの完成版を掲載しておきます。

Summary:
パッケージの内容を簡潔に説明する部分。いわば、一口メモです。

Name:
パッケージの名前です。

Version:
パッケージのバージョンです。元になるソフトウェアのバージョンに合わせましょう。

Release
同じバージョンを元にしても、微妙に違うパッケージを作ることもあります。バグの修正や、特別なオプションの指定などですね。それを見分けるために、リリース番号を使います。

Copyright:
著作権表示です。

Group:
rpmパッケージとしての分類を記述します。LASER5 Linux 6.4の場合は/usr/doc/rpm-3.0.5/GROUPS(リスト2)に各グループが記載されています。

Source:
ソースコードの在りかです。URLを記述しておくと便利ですが、実際には~/RPM/SOURCESにコピーしておきます。

Patch0:
パッチファイルです。番号を変えて、複数指定できます。これも~/RPM/SOURCESにコピーしておきます。

Buildroot:
パッケージ作成時、一時的にインストールに利用するディレクトリです。ここに書くだけでは駄目で、Makefileやconfigureを修正する必要があります。

%description
ちょっと長めの解説です。

%prep
パッケージ作成前に行う作業を記述するセクションです。普通は何も書く必要がありません。

%setup -q
ソースファイルを展開して、できたディレクトリに移動する命令です。普通はソースファイルの名前に応じたディレクトリが作成されますが、-nオプションで明示的に指定できます。ちなみに-qは表示を抑制するオプションです。

%patch0 -p1
これは展開したソースにパッチを当てるコマンドです。最近ではほとんどパッチを当てる必要はないのですが、Makefileなどはかなり変更するのでrcsなどを使ってdiffを取れるようにしておいた方がいいでしょう。

%build
ここから後ろにはコンパイル時に実行するコマンドを並べます。ここには記述されていませんが、rm -rf $RPM_BUILD_ROOTを実行しておいた方が安全です。

%clean
パッケージ作成後の動作を記述します。作業ディレクトリをきれいに削除するのが一般的です。

%files
%doc FAQ INSTALL NEWS QUOTES README
/usr/bin/ctags
/usr/man/man1/ctags.1.gz

これはパッケージに含まれるファイルの一覧です。%docの行に記述した場合はソースコードを展開したディレクトリにあるファイルを意味します。それ以外のファイルは、続く行にパッケージインストール後の絶対パス名で記述します。make -n installなどで確認のこと。

%changelog
変更履歴です。いつ、だれが、どこを、何のために直したのかを書いておくべきです。

 ここには記述されていませんが、%descriptionよりも前にRequires:を記述しておくと、依存関係を定義できます。

Requires: foo
Requires: foo = 2.1
Requires: foo >= 2.1

はそれぞれ「fooに依存」「バージョン2.1のfooに依存」「バージョン2.1以上のfooに依存」ということになります。

 ほかにもいろいろと記述できますが、最低このくらいを書いておくべきでしょう。

■rpmコマンドの実行

 さて、無事にmakeとmake installができるようになったら、RPMパッケージを作るための最後の準備です。

 まずソースコード一式とパッチファイルを~/RPM/SOURCESにコピーします。まあ、最初からここにダウンロードした方がいいかもしれません。次に、作成したspecファイルを~/RPM/SPECSにコピーします。

 そこでおもむろに

$ rpm -bb ctags.spec

を実行するわけです。幸運を祈る!

2/3

Index
自分で作るRPMパッケージ
  RPMによる管理のメリット
  SRPMの利用
作業用ディレクトリの作成
SRPMのリビルド
RPMパッケージの自作
パッケージ作成の下準備
specファイルの書き方
rpmコマンドの実行
  Appendix
パッケージ作成のrpmオプション
各種リスト

Linux Square全記事インデックス


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間