Chapter 5. specファイルを書く

さて、rpmパッケージを作成するためには、specファイルを記述しないといけません。 specファイルを書き方を知るための、おすすめは、Maximum-RPMを読むことです。 分厚いですが、よくまとまってて、英語も読みやすいです。 てきとうに拾い読みすればいろいろわかります。 それから、古高さんと石岡さんのRPM-BUILD-HOWTOにも説明があります。 rpm -ivh fugafuga-version-revision.src.rpm とかして、 でてきたspecファイルを見るってのも良いです。

以下にもサンプルとして簡単なspecファイルをあげ、その内容について説明をします。 なんとなくわかったら、小さなパッケージを作ってみて, さらにいろいろ作りたくなったら上にあげたようなdocumentを読んでください。

---------spec ファイルの例 (#から始まる行は、コメント行です)--------
#(1)データ定義部
Summary: hoge is a harehare horehore
Name: hoge
Version: 1.1
Release: 1
Source: hoge-1.1.tar.gz
Patch: hoge.patch.gz
License: distributable
Group: Local
Packager: Jun Nishii <jun@vinelinux.org>
Buildroot: %{_tmppath}/%{name}-root
Summary(ja): hoge は harehare な horehore です.

%description
Hoge is a harehare horehore and convenient for fugafuga.
Enjoy!

%description -l ja
hoge は harehare な horehore で、fugafuga するときなどとても便利なツー
ルです。みんなでなかよく使いましょう。

%changelog
* Tue Feb 16 1999 Jun Nishii <jun@vinelinux.org>
- added Japanese messages

* Mon Feb 15 1999 Jun Nishii <jun@vinelinux.org>
- first release for version 1.1

#(2)スクリプト部
%prep       #rpmを構築する前の準備です。
rm -rf $RPM_BUILD_ROOT

%setup      #ソースをBUILDに展開します。
%patch -p1  #パッチをあてます。

%build      #makeのための手順を書きます。
make
(cd man; make man)

%install    #installのための手順を書きます。
make prefix=${RPM_BUILD_ROOT}/usr/local install
(cd man; make prefix=${RPM_BUILD_ROOT}/usr/local install.man)

%clean      #rpmを作ったあとの後始末です。
rm -rf $RPM_BUILD_ROOT

#(3)ファイルリスト部 --------------
%files
%defattr(-,root,root)
%doc README
%doc docs/ 
/usr/bin/hoge.bin
/usr/lib/hoge/
/usr/man/man1/hoge.1.gz
%dir /usr/lib/hoge/
%config /usr/lib/hoge/fuga.conf

---------specの例はここまで-----------------------------------------

specファイルは、(1)データ定義部と、(2)さまざまな作業をするためのscriptを書くスクリプト部、 そして、(3)バイナリパッケージであるrpmを構成するファイル名を列挙するファイルリスト部からなります。 では、上の例をみながら、各部分の説明をしましょう。

5.1. データ定義部

データ定義部はlsmのように、パッケージに関する情報を記入する部分です。 例の各タグの意味は以下の通りです。 スクリプト部で環境変数に代入されて用いられるものは、その環境変数名も書いてます。

Summary

パッケージの説明を簡単に一行で書きます。 タイトルのようにspecファイルの一行目に書くことが多いです。 英語で簡潔に書きましょう。Summaryは、国際化機能をもっており、 Summary(ja)のように、日本語のサマリーを書いておくと、 環境変数 LANGUAGE が ja な時には、日本語のほうが表示されます。 ただし、Summary(ja)を用意したときにも、英語のSummaryは必ず用意してください。 また、日本語がspecファイルの始めの方にあると、rpmコマンドがエラーを出すことがあるので、 Summary(ja)はデータ定義部の下のほうに書くほうがいいようです。 また、日本語メッセージは必ず EUC で入れてください。

Name

つくるrpmパッケージの名前です。 環境変数RPM_PACKAGE_NAMEに設定されます。

Version

ソースのバージョン名を入れます。 環境変数RPM_PACKAGE_VERSIONに設定されます。

Release

同じソースからつくるrpmパッケージのリリース番号です。 環境変数RPM_PACKAGE_RELEASEに設定されます。

Source

rpmパッケージをつくるソース名です。 Section 4.1で設定したSOURCESのディレクトリに置いておきましょう。 ソースの入手先を明示するために、

Source: ftp://ftp.hogehoge.org/hoge-1.1.tar.gz
と書いておくと便利です。自分でつくったソースならば、 サンプルのようにファイル名のみを書いておきます。

複数のソースファイルがあるときには,

Source0: ftp://ftp.hogehoge.org/hoge-1.1.tar.gz
Source1: ftp://ftp.hogehoge.org/hoge-devel.tar.gz
というふうに番号をふって列挙します。(Source0 と Source は同じ意味です)

Patch

上で設定したソースにあてる、パッチファイルです。書式はSourceと同じです。 このパッチファイルもディレクトリSOUCESに置いときましょう。 複数あるときにも、Sourceと同様に番号をふって列挙できます。

License

作成するrpmパッケージのライセンスを書きます。 もとのソースの COPYING などのファイルを参照し、 できるだけ簡潔に書きましょう。

Group

つくるパッケージのカテゴリーを書きます。glintを使うときには、 このGroup名にもとづいて分類されて、アイコンが表示されます。 良くわからなかったら、ちょっとglintを起動して、 アイコン名を見てみましょう。 Appendix AにもRHLで用いているグループ名の一覧を示します。 個人使い用のrpmのときは、ぼくはとりあえずLocalとかにしてしまいます。 人に配布するときには真面目に考えましょう。

Packager

rpmパッケージを作ってるあなたの名前です。Email addressを入れておくと、 思わぬとこからバグ報告とかもらえて嬉しいこともあります。

Buildroot

Section 7.1で説明した, 仮想インストールのためのディレクトリ名を書きます。 Buildrootの設定を行わなければ、RPM_BUILD_ROOTはnullです。 例では、%{_tmppath}, %{name}というマクロを利用して、 Buildrootが定義されています。%{_tmppath}は/usr/lib/rpm/macrosで定義されており、 /var/tmpを指します。%{name}は、パッケージの名前を示すマクロです。 よって例の場合はBuildroot は /var/tmp/hoge-rootというディレクトリを指すことになります。 マクロを使わずに直接このディレクトリ名を書いても構いません。

%description

このタグの下に、rpmパッケージの解説を書きます。rpm -qip <rpm-name>で出てくる説明です。 このタグも国際化機能をもってます。日本語メッセージを表示させたいときには、 %description -l ja を用います。ただし、日本語メッセージを用意したときにも、 必ず英語メッセージは書いておきましょう.

%changelog

ここには、更新のログを書いておきます。必須ではありませんが、 書いておかないと、どれがなんだかわからなくなったりするので、 管理が楽になるように出来るだけ書いておきましょう。 なお, %changelogは、specファイルの一番下(ファイルリスト部の下)に持って来ることもできます.

サンプルのspecファイルのような指定で、rpmパッケージをつくると、 hoge-1.1-1.i386.rpm という名前のrpmができます (architectureがi386の場合)。

サンプルには書かれてませんが、他にも以下のようにいろいろなタグがあります。 いろいろ設定したい時に参考にして下さい。

Requires

作成しているrpmパッケージが動作するのに必要なパッケージ名を書きます。例えば、

Requires: gs
として、動作にgsがインストールしていることが必要なことを示します。 また、<, >, =, >=, <=を使って必要なバージョン、 リリース番号を示すことも出来ます。この、 演算子の両側には必ずスペースを入れてください。 (入れないと一つの名前として認識されてしまいます)
Requires: ghostscript = 5.10
とするとghostscriptのバージョン5.10が必要なことを示し、
Requires: ghostscript >= 5.10
として5.10以上が必要なことを示します。必要なライブラリ名を書くこともできます。 Requiresしたいものが複数あるときには、
Requires: ghostscript >= 5.10, ghostscript-fonts, VFlib = 2.24
などのように、'',''で区切って並べます。

rpmパッケージをbuildするときには、そのパッケージに含まれるバイナリの実行に必要なライブラリ名も、 自動的にRequiresに加えられます(正確には必要なライブラリのsonameが加えられます)。 rpmパッケージをinstallするときに、必要なライブラリがシステム上にないと、 libhoge.so is neededとかいって、おこられますが、 libhoge.soがなんというパッケージに入ってるかわからずに困ることがよくあるので、 必要なパッケージ名をきちんとRequiresに書くように心がけましょう。

Provides

インストールしたいhoge-1.1-1.rpmがgsを必要(Requires)としてるとしましょう。 しかし、システム上にはgsはなく、代りに日本語化されたgsであるgsjがインストールされてるとします。 このとき、hoge.rpmをインストールしようとするとrpmコマンドはエラー・メッセージを出します。 このようなトラブルをさけるためには、dvipskを作るときに、

Provides: dvips
と書いておくと、dvipskはdvipsパッケージを提供することを示せます。 また、あるアプリがpdfを読むツールをRequiresするときには、 xpdfやgs(pdf対応)のProvidesに
Provides: pdf-reader
と仮想的なパッケージ名(仮想パッケージ virtual package)を書いておくと、 なんらかのpdf-readerインストールされてることを要求できます。

Conflicts

Requiresと逆の意味を持ちます。すなわち、共存できないパッケージ名を指定できます。 バージョンやリリース番号指定もRequiresと同様にできます。 例えば以下のように指定します。

Conflicts: fugefuge >= 1.0, fugafuga = 1.2-1

Obsoletes

仮に、pLaTeX2eのrpmをインストールするときには、 古いTeXのパッケージであったptexはアンインストールしたいとしましょう。 こんなときには、pLaTeX2eのspecファイルには、

Obsoletes: ptex
と書いておくと、pLaTeX2eのインストール時にptexは消去されます。

Prereq

パッケージのインストール時に、先にインストールされているべきパッケージを書きます。 例えば、gnome-print パッケージをインストールするときに、 urw-fonts パッケージがインストールされていないといけないならば、

Prereqe: urw-fonts
と書いておくと、 gnome-printのインストール時にurw-fontsが既にインストールされているかがチェックされます.

BuildPrereq

パッケージの作成の時に、インストールされているべきパッケージを書きま す. 例えば, pLaTeX2e パッケージを作成するときに, pTeX パッケージがイ ンストールされていないといけないならば,

BuildPrereqe: pTeX
と書いておくと、pLaTeX2eの作成時にpTeXがインストールされているかが チェックされます.

Distribution

作成したrpmパッケージがなんらかのディストリビューションに含まれる時、 そのディストリビューション名を書きます。

Vendor

作成したrpmパッケージに関する責任を負うVendor名です。 なんらかのプロジェクトでrpmパッケージを作ってる時には、 そのプロジェクト名を書きましょう

Url

ソースの情報を提供しているURLを書きます。 例えば以下のように書きます。

URL: http://www.fugahogo.com/hogehoge.html

Prefix

このタグを使うと、rpmパッケージをインストールする時にインストールディレクトリをコントロールできます。 例えば、

Prefix: /usr
としていて、ファイル定義部で
%files
/usr/bin/fuga
と定義してたとしましょう。このパッケージをインストールする時に、 --prefix /usr/local とオプション指定すると、 fugaは/usr/local/bin/fuga.binにインストールされます。

BuildArch

書いたspecファイルを使って生成されるrpmパッケージのアーキテクチャを指定できます。 例えば、elファイルとかシェルスクリプトとかばかりを含むrpmパッケージを作るときには、 i386やalphaなどのアーキテクチャに依存しないnoarchであることを、

BuildArch: noarch
というふうに明示します。 このような指定をしておくとnoarch.rpmという拡張子のつくrpmパッケージが作成できて、 いろいろなアーキテクチャ上で共用できます。

データ定義部には、さらにいろいろな情報を付け加えることもできます。 MaximumRPM等を見てください。