Table of Contents
さて、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を構成するファイル名を列挙するファイルリスト部からなります。 では、上の例をみながら、各部分の説明をしましょう。
データ定義部はlsmのように、パッケージに関する情報を記入する部分です。 例の各タグの意味は以下の通りです。 スクリプト部で環境変数に代入されて用いられるものは、その環境変数名も書いてます。
パッケージの説明を簡単に一行で書きます。 タイトルのようにspecファイルの一行目に書くことが多いです。 英語で簡潔に書きましょう。Summaryは、国際化機能をもっており、 Summary(ja)のように、日本語のサマリーを書いておくと、 環境変数 LANGUAGE が ja な時には、日本語のほうが表示されます。 ただし、Summary(ja)を用意したときにも、英語のSummaryは必ず用意してください。 また、日本語がspecファイルの始めの方にあると、rpmコマンドがエラーを出すことがあるので、 Summary(ja)はデータ定義部の下のほうに書くほうがいいようです。 また、日本語メッセージは必ず EUC で入れてください。
つくるrpmパッケージの名前です。 環境変数RPM_PACKAGE_NAMEに設定されます。
ソースのバージョン名を入れます。 環境変数RPM_PACKAGE_VERSIONに設定されます。
同じソースからつくるrpmパッケージのリリース番号です。 環境変数RPM_PACKAGE_RELEASEに設定されます。
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 は同じ意味です)
上で設定したソースにあてる、パッチファイルです。書式はSourceと同じです。 このパッチファイルもディレクトリSOUCESに置いときましょう。 複数あるときにも、Sourceと同様に番号をふって列挙できます。
作成するrpmパッケージのライセンスを書きます。 もとのソースの COPYING などのファイルを参照し、 できるだけ簡潔に書きましょう。
つくるパッケージのカテゴリーを書きます。glintを使うときには、 このGroup名にもとづいて分類されて、アイコンが表示されます。 良くわからなかったら、ちょっとglintを起動して、 アイコン名を見てみましょう。 Appendix A, rpm-4.0.5で用いられてるGroup一覧にもRHLで用いているグループ名の一覧を示します。 個人使い用のrpmのときは、ぼくはとりあえずLocalとかにしてしまいます。 人に配布するときには真面目に考えましょう。
rpmパッケージを作ってるあなたの名前です。Email addressを入れておくと、 思わぬとこからバグ報告とかもらえて嬉しいこともあります。
Section 7.1, “環境変数”で説明した, 仮想インストールのためのディレクトリ名を書きます。 Buildrootの設定を行わなければ、RPM_BUILD_ROOTはnullです。 例では、%{_tmppath}, %{name}というマクロを利用して、 Buildrootが定義されています。%{_tmppath}は/usr/lib/rpm/macrosで定義されており、 /var/tmpを指します。%{name}は、パッケージの名前を示すマクロです。 よって例の場合はBuildroot は /var/tmp/hoge-rootというディレクトリを指すことになります。 マクロを使わずに直接このディレクトリ名を書いても構いません。
このタグの下に、rpmパッケージの解説を書きます。rpm -qip <rpm-name>で出てくる説明です。 このタグも国際化機能をもってます。日本語メッセージを表示させたいときには、 %description -l ja を用います。ただし、日本語メッセージを用意したときにも、 必ず英語メッセージは書いておきましょう.
ここには、更新のログを書いておきます。必須ではありませんが、 書いておかないと、どれがなんだかわからなくなったりするので、 管理が楽になるように出来るだけ書いておきましょう。 なお, %changelogは、specファイルの一番下(ファイルリスト部の下)に持って来ることもできます.
サンプルのspecファイルのような指定で、rpmパッケージをつくると、 hoge-1.1-1.i386.rpm という名前のrpmができます (architectureがi386の場合)。
サンプルには書かれてませんが、他にも以下のようにいろいろなタグがあります。 いろいろ設定したい時に参考にして下さい。
作成している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に書くように心がけましょう。
インストールしたい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インストールされてることを要求できます。
Requiresと逆の意味を持ちます。すなわち、共存できないパッケージ名を指定できます。 バージョンやリリース番号指定もRequiresと同様にできます。 例えば以下のように指定します。
Conflicts: fugefuge >= 1.0, fugafuga = 1.2-1
仮に、pLaTeX2eのrpmをインストールするときには、 古いTeXのパッケージであったptexはアンインストールしたいとしましょう。 こんなときには、pLaTeX2eのspecファイルには、
Obsoletes: ptex
と書いておくと、pLaTeX2eのインストール時にptexは消去されます。
パッケージのインストール時に、先にインストールされているべきパッケージを書きます。 例えば、gnome-print パッケージをインストールするときに、 urw-fonts パッケージがインストールされていないといけないならば、
Prereqe: urw-fonts
と書いておくと、 gnome-printのインストール時にurw-fontsが既にインストールされているかがチェックされます.
パッケージの作成の時に、インストールされているべきパッケージを書きま す. 例えば, pLaTeX2e パッケージを作成するときに, pTeX パッケージがイ ンストールされていないといけないならば,
BuildPrereqe: pTeX
と書いておくと、pLaTeX2eの作成時にpTeXがインストールされているかが チェックされます.
作成したrpmパッケージがなんらかのディストリビューションに含まれる時、 そのディストリビューション名を書きます。
作成したrpmパッケージに関する責任を負うVendor名です。 なんらかのプロジェクトでrpmパッケージを作ってる時には、 そのプロジェクト名を書きましょう
ソースの情報を提供しているURLを書きます。 例えば以下のように書きます。
URL: http://www.fugahogo.com/hogehoge.html
このタグを使うと、rpmパッケージをインストールする時にインストールディレクトリをコントロールできます。 例えば、
Prefix: /usr
としていて、ファイル定義部で
%files /usr/bin/fuga
と定義してたとしましょう。このパッケージをインストールする時に、 --prefix /usr/local とオプション指定すると、 fugaは/usr/local/bin/fuga.binにインストールされます。
書いたspecファイルを使って生成されるrpmパッケージのアーキテクチャを指定できます。 例えば、elファイルとかシェルスクリプトとかばかりを含むrpmパッケージを作るときには、 i386やalphaなどのアーキテクチャに依存しないnoarchであることを、
BuildArch: noarch
というふうに明示します。 このような指定をしておくとnoarch.rpmという拡張子のつくrpmパッケージが作成できて、 いろいろなアーキテクチャ上で共用できます。
データ定義部には、さらにいろいろな情報を付け加えることもできます。 MaximumRPM等を見てください。