次のページ 前のページ 目次へ

6. RPM パッケージの作成

RPM パッケージの作成は全く簡単です、特に作成しようとしている ソフトウェアを手に入れられるならなおさらです。

RPM を作成する基本的な課程は以下の通りです。

  • あなたのシステムに適合するように /etc/rpmrc を確実に設定します。
  • あなたのシステムで RPM を作成するためにソースコードを手に入れます。
  • 正しく作成するために必要なソースへの変更をパッチにします
  • パッケージのための spec ファイルを作成します。
  • 全ての物が正しい場所におかれている事を確認します。
  • RPM を用いてパッケージを作成します。

一般的な操作の下で、RPM はバイナリとソースパッケージを作成します。

6.1 rpmrc ファイル

現在、RPM の設定は /etc/rpmrc ファイルのみが有効です。例えば以下のよ うになります。 [訳注、デフォルトとして、/usr/lib/rpmrc というものがあり、 個人の設定ファイルとして個人のホームディレクトリに .rpmrc を置くこともできます。]

require_vendor: 1
distribution: I roll my own!
require_distribution: 1
topdir: /usr/src/me
vendor: Mickiesoft
packager:  Mickeysoft Packaging Account <packages@mickiesoft.com>

optflags: i386 -O2 -m486 -fno-strength-reduce
optflags: alpha -O2
optflags: sparc -O2

signature: pgp
pgp_name: Mickeysoft Packaging Account
pgp_path: /home/packages/.pgp

tmppath: /usr/tmp

require_vendor の行は /etc/rpmrc もしくは spec ファイルのヘッダから vendor の行を探そうとします。これを無効にするには、ナンバーを 0 に変 えて下さい。require_distribution と require_group の行も同様です。

次の行は distribution 行です。ここか spec ファイルのヘッダ中に定義で きます。vender 行も同様ですが、何でもよいです。(例、Joe's Software and Rock Music Emporium)

RPM はまた現在複数のアーキテクチャ上でパッケージを作成する事をサポー トしています。rpmrc ファイルは作成時にアーキテクチャ固有のフラグが求 められるようなパッケージを作成するのに必要な"optflag" 変数を持つ事が できます。

上記のマクロに付け加えて、さらにいくつかあります。

rpm --showrc

とすれば、どのようなタグが設定され、有効な全てのフラグは何かわかりま す。

6.2 spec ファイル

sepc ファイルについて述べて行きます。spec ファイルはパッケージを作成 するために必要です。spec ファイルは作成の仕方の指示を含むソフトウェ アの説明とインストールされる全てのバイナリファイルのリストです。

標準的な規則に従って spec ファイルの名前を付けたほうがよいでしょう。 それは、パッケージ名-ダッシュ-バージョン番号-ダッシュ-リリース番号- ドット-spec とすべきです。

ここに簡単な spec ファイルがあります。(vim-3.0-1.spec) [訳注、vim-3.0-1.spec とありますが、これはeject-1.4-3.spec でしょう。]

Summary: ejects ejectable media and controls auto ejection
Name: eject
Version: 1.4
Release: 3
Copyright: GPL
Group: Utilities/System
Source: sunsite.unc.edu:/pub/Linux/utils/disk-management/eject-1.4.tar.gz
Patch: eject-1.4-make.patch
Patch1: eject-1.4-jaz.patch
%description
This program allows the user to eject media that is autoejecting like
CD-ROMs, Jaz and Zip drives, and floppy drives on SPARC machines.

%prep
%setup
%patch -p1
%patch1 -p1

%build
make RPM_OPT_FLAGS="$RPM_OPT_FLAGS"

%install
install -s -m 755 -o 0 -g 0 eject /usr/bin/eject
install -m 644 -o 0 -g 0 eject.1 /usr/man/man1

%files
%doc README COPYING ChangeLog

/usr/bin/eject
/usr/man/man1/eject.1

6.3 ヘッダ

ヘッダは書き込む必要のあるいくつかの標準的なフィールドがあります。またいくつ か注意があります。フィールドは以下のように書き込まなければなりません。

  • Summary: これは一行のパッケージの説明です。
  • Name: これは使おうとしている rpm ファイル名からの文字列でなけれ ばなりません。
  • Version: これは使おうとしている rpm ファイル名からのバージョン番号 でなければなりません。
  • Release: これは同じバージョンのパッケージのためのリリース番号です。 (例えば、パッケージを作成しそれがわずかに壊れているのを発見し再度 作成する必要があるならば、次のパッケージのリリース番号は2となります。)
  • Icon: これは他の高レベルなインストールツール(Red Hat の "glint"の様 な)を用いる為のアイコン名です。それはgif ファイルで SOURCES ディレ クトリに置かなければなりません。
  • Source: この行は元のソースファイルのホームロケーションを指します。 再びソースファイルを手に入れたいとか新しいバージョンをチェックした い時に使われます。注意:この行のファイル名とあなたのシステム上に持 つファイル名は一致していなければなりません。(例えば、ソースファイ ルをダウンロードしその名前は変えてはいけません。) 一つ以上のソース ファイルを明記したい時は以下のように書きます。
    Source0: blah-0.tar.gz
    Source1: blah-1.tar.gz
    Source2: fooblah.tar.gz
    
    これらのファイルは SOURCES ディレクトリに置きます。(ディレクトリ構 造は後の節 "ソース ディレクトリ ツリー" で扱います。)
  • ・Patch: これは再びパッチをダウンロードする必要がある時にそれを見つ ける事のできる場所です。注意:あなたが自分で作成したパッチを作る 時ファイル名は使う名前と一致しなければなりません。例えば以下の ようです。
    Patch0: blah-0.patch
    Patch1: blah-1.patch
    Patch2: fooblah.patch
    
    これらのファイルは SOURCES ディレクトリに置きます。
  • Copyright: この行はパッケージがどのような著作権であるか表示します。 GPL、BSD、MIT、public domain、distributable、commercial の様なもの を使うべきです。
  • BuildRoot: この行は新しいパッケージを作成、インストールするための "ルート" のディレクトリを明記します。あなたのマシーンにインストー ルする前にパッケージをテストするのを助けるために使う事ができます。 [訳注、ここに記述するだけでは、作成およびテストはできません。 詳しくは、RPM-BUILD-HOWTO を読むと良いでしょう。]
  • Group: この行は高レベルなインストールプログラム(Red Hat の "glint" のような)に階層構造の中でこのプログラムがどこに属するのかを 明示するためにつかわれます。現在の グループ ツリーは以下のようになっ ています。[訳注、日本向けに Extensions/Japanese というものあります。]
    Applications
        Communications
        Editors
            Emacs
        Engineering
        Spreadsheets
        Databases
        Graphics
        Networking
        Mail
        Math
        News
        Publishing
            TeX
    Base
        Kernel
    Utilities
        Archiving
        Console
        File
        System
        Terminal
        Text
    Daemons
    Documentation
    X11
        XFree86
            Servers
        Applications
            Graphics
            Networking
        Games
            Strategy
            Video
        Amusements
        Utilities
        Libraries
        Window Managers
    Libraries
    Networking
        Admin
        Daemons
        News
        Utilities
    Development
        Debuggers
        Libraries
            Libc
        Languages
            Fortran
            Tcl
        Building
        Version Control
        Tools
    Shells
    Games
    
  • %description これは本当はヘッダの項目ではありません、しかしヘッダ の中に記述されるべきです。パッケージと(もしくは)サブパッケージに一 つの説明(description)のタグが必要です。これはパッケージの包括的な 説明を与えるために使われるべき複数行のフィールドです。

6.4 Prep

これは、spec ファイル中の2番目のセクションです。作成用に準備するソースを得る ために使われます。ここで、パッチの当てられたソースを得るために必要な 事をし make するために必要な準備をします。

注意:各セクションはシェルスクリプトを実際に実行するための場所です。簡単に sh スクリプトを作成し、ソースを解凍しパッチを当てるために %prep タグ の後にそれを置く事ができます。しかしながら、 この中には上記の事を支援するためのマクロがあります。

それらの最初マクロのは、%setup マクロです。そのもっとも簡単な形は(コ マンドラインのオプションなし)、単にソースを解凍し できたソースディレ クトリの中に cd するだけです。以下のオプションがあります。

  • -n name は列挙された name に作成ディレクトリの名前をセットしま す。デフォルトは $NAME-VERSION です。他の可能性として $NAME、 ${NAME}${VERION}、メインの tar ファイルが用いているものです。 (これらの "$" 変数は spec ファイル中の本当の変数でない事に注意して 下さい。これらは参考のためにここで使われたものです。実際には変数ではな くパッケージ中の本当の名前とバージョンを使う必要があります。)
  • -c は tar ファイルを解凍する前に名付けられたディレクトリを作りそこ に cd します。
  • -b # はディレクトリに cd する前に Source# を 解凍(untar)します。 (これは -c オプションと一緒に用いるのは意味がありません、しないで 下さい。) これは複数のソースファイルがある時のみ役に立ちます。
  • -a # は ディレクトリに cd した後に Source# を解凍(untar)します。
  • -T このオプションはソース解凍(untar)のデフォルト動作を無効にします。 解凍(untar)されたメインのソースファイルを得るために -b 0 もしくは -a 0 を必要とします。2つめのソースがある時にこれを必要とします。
  • -D は解凍する前にディレクトリを消去しません。これは setup マクロが 複数ある時のみ有用です。最初の setup マクロの後の setup マクロでの み使うべきです。(決して最初の setup マクロで使わないで下さい。)
次に有益なマクロは %patch マクロです。このマクロはソースにパッチを当 てる課程の自動化を助けます。いくつかのオプションがありそれは以下の通 りです。
  • # はパッチファイルとして Patch# を利用します。
  • -p # patch(1) コマンドのための取り除くディレクトリの数を明記します。
  • -P デフォルトの動作では Patch (もしくは Patch0)を当てます。このフラ グはデフォルトの動作を禁止するので解凍(untar)されたソースファイルを 得るために 0 を必要とします。このオプションは最初のマクロと異なる大 きい番号を求められる2番目(もしくはそれ以降)の %patch マクロで有用で す。
  • 本来の %patch # -p コマンドの代わりに %patch# も使えます。
以上で必要なマクロは全部です。これらを正しく記述した後に、sh スクリ プトを用いて他のあらゆる必要なセットアップをする事もできます。%build マクロ(これは次節で説明します。)が sh を経由して実行されるまで何でも 含められます。ここで行いたい事の形は上記の例を見て下さい。

6.5 Build

このセクションにはマクロはありません。ソースを解凍(untar)し、パッチを当て、 ディレクトリに cd したならここでは単にソフトウェアを作成するために必 要なコマンドを記述して下さい。これは単に sh に渡す他のコマンドの集ま りなので、どんな合法的な sh のコマンド(コメントを含む)でもここで実行 できます。[訳注:これはシェルの組み込みコマンドの事だけをいっている のではありません。]これらのセクションの各々で作業ディレクトリはソー スディレクトリの一番上にリセットされますのでそれを覚えておいて下さい。 もし必要ならばサブディレクトリに cd して下さい。

6.6 Install

ここにもマクロはありません。基本的にここにインストールに必要なコマン ドなら何でも置けます。作成したパッケージ中で make install が有効なら、 ここに置きます。そうでないのなら、make install の為の makefile への パッチを当て、make install をするか、sh コマンドによって手動でインス トールする事もできます。現在の作業ディレクトリがソースディレクト リのトップレベルである事を考慮して下さい。

6.7 pre ,post インストール / アンインストール スクリプト (任意)

バイナリパッケージのインストール / アンインストール を行う前と後に実 行するスクリプトをここに置く事ができます。シェアードライブラリを含む パッケージを インストールもしくはアンインストールした後に ldconfig を実行するような事をするためにこのタグがあります。以下に各々のスクリ プトのためのマクロがあります。

  • %pre はインストールする前のスクリプトためのマクロです。
  • %post はインストールした後のスクリプトのためのマクロです。
  • %preun はアンインストールする前のスクリプトのためのマクロです。
  • %postun は アンインストールした後のスクリプトのためのマクロです。

6.8 Files

このセクションはバイナリパッケージのためのファイルの一覧を表示しなければなり ません。RPM は make install の結果どのバイナリがインストールされたの か知る方法がないためです。これをする方法はありません! パッケージのイ ンストール前と後に find を実行すればよいのではないかと疑問に思う人も いるかもしれません。マルチユーザーシステムにおいて、パッケージと関係 のないファイルがパッケージを作成している課程の間に作られているかもし れないのでこれは受け入れられません。

同様に特別な事をするために有効なマクロがいくつかあります。以下に説明 します。

  • %doc はバイナリをインストールする際にインストールしたいソースパッ ケージ中のドキュメントに印を付けるのに使われます。ドキュメントは /usr/doc/$NAME-$VERSION-$RELEASE にインストールされ ます。このマクロを使ってコマンドライン上で複数のドキュメントの一覧を列挙 するか、各ドキュメントごとにマクロを使って別々に列挙することができます。
  • %config はパッケージ中の設定ファイルに印を付けるのに使われます。こ れは sendmail.cf、passwd などのようなものを含みます。もし後に設定 ファイルを含むパッケージをアンインストールするならば、変更されてい ないファイルは削除され、変更されたファイルはもとファイル名に .rpmsave という拡張子を付加されたものに名前が変更されます。 このマクロでも同時に複数のファイルの一覧を列挙できます。
  • %dir パッケージによって所有され含まれるファイル一覧中の単一のディ レクトリに印を付けます。デフォルトでは、%dir マクロを使わずにディ レクトリ名を表示したなら、そのディレクトリ中の全てがファイル一覧に 含まれそして後にそのパッケージの一部としてインストールされます。
  • %files -f <filename> はソースの作成ディレクトリ中の任意のファイル を リストに加える事ができます。これはパッケージ自身のファイルリス トを作成する事ができるパッケージがある場合に便利です。 その時ここにそのファイルリストを含めます、そして特にファイルを一覧 表示してはなりません。

ファイル一覧中の最大の注意点はディレクトリの一覧です。もし間違って /usr/bin を一覧に記してしまったら、バイナリパッケージはあなたのシス テムの /usr/bin 中の全てのファイルを含んでしまいます。

6.9 作成

ソースディレクトリ ツリー

まず最初に必要な事は、きちんと設定された作成ディレクトリツリーです。 これは /etc/rpmrc ファイルを用いて設定可能です。多くの人々は /usr/src を使うでしょう。

作成ソースディレクトリツリーを作るために以下のディレクトリを作る必要 があるかもしれません。

  • BUILD は RPM により全ての作成が行われるディレクトリです。特に他の 場所で作成のテストを行う必要はありませんが、ここは RPM が作成する 用いるところです。
  • SOURCES はオリジナルのソース(tar)ファイルとパッチを置くディレクト リです。ここは、RPM がデフォルトで探すディレクトリです。
  • SPECS は全ての spec ファイルを置くディレクトリです。
  • RPMS は RPM が作成したバイナリ RPM パッケージを置くディレクトリです
  • SRPMS は 全てのソース RPM パッケージを置くディレクトリです。

作成テスト

おそらく最初にしたいことは、RPM を用いずに作成するためのソースツリー を得ることでしょう。これをするために、ソースを解凍し、ディレクトリ名 を $NAME.orig に変更して下さい。そしてもう一度ソースを解凍して下さい。 そしてこのソースを作成に使用して下さい。ソースディレクトリに入り作成 するための指示にしたがって下さい。もし何か編集をしなければならないな ら、パッチが必要となります。一度それを作るためにソースディレクトリを きれいにします。./configure スクリプトにより生成されたファイルを確認 し削除します。[訳注:要するに、いわゆる make 一発状態にすれば良いと いう事です。] そして、ソースディレクトリの親ディレクトリに cd します。 以下のようにします。

diff -uNr dirname.orig dirname > ../SOURCES/dirname-linux.patch

これは、spec ファイルで使用可能なパッチを作成します。上記の"linux"は 単に識別子であることに注意して下さい。なぜパッチを作成しなければなら ないかを説明するために "config" や "bugs" の様なより説明的なものを使っ てもよいでしょう。間違ってバイナリを含めないように確認するために作成 したパッチを使用する前に調べるのはよい考えです。

ファイルリストの生成

作成するためのソースを手にいれ、それをどうやって作成するかわかったな らば、作成しインストールします。インストールの結果の出力から spec ファ イルで用いるためのファイルリストを作成します。私たちは、たいてい全て のステップで並行して spec ファイルを作成しています。最初のファイルリ ストを作成して簡単な部分を書き込み、そして順を追って埋めていきます。

RPM を用いたパッケージの作成

spec ファイルを書き終えたなら、パッケージを作成する準備ができました。 もっとも有効な方法は、以下のようなコマンドを使うことです。

rpm -ba foobar-1.0.spec
-b スイッチには以下のような有用なオプションがあります。

  • p は spec ファイルの prep セクションだけを実行します。
  • l は %files のリストをチェックします。
  • c は prep セクションを実行し コンパイルを行います。これはソースが 完全に構築できるものかどうか不確実な時に役立ちます。ソースを構築しそ れから RPM を使いはじめるまでは、ソースのみで作業し続けたいでしょ うから、役に立たないと思われます。しかし一旦 RPM を使うのに慣れて しまえば、それを使う例が見つかるでしょう。 [訳注、%Build セクションの有効性を確認するぐらいでしょう。]
  • i は prep セクションを実行し、コンパイル インストールを行います。
  • b は prep セクションを実行し、コンパイル インストールを行い、バイ ナリパッケージのみを作成します。
  • a は全てを作成します。(ソースとバイナリのパッケージの両方)

-b スィッチには以下のようないくつかの変更子があります。

  • --short-circuit は指定された処理を飛ばします。(c と i でのみ使用 できます。)
  • --clean はパッケージの作成が終った後に作成したディレクトリツリー を消去します。
  • --keep-temps は /tmp 以下に作られた全ての一時ファイルとスクリプト を保存します。実は -v オプションを用いることにより /tmp に作られた ファイルを見ることができます。
  • --test は実際にはどの処理も実行はしませんが、keep-temp は行います。

6.10 テスト

いったん、ソース及びバイナリの rpm パッケージを作成したら、それをテ ストする必要があります。最も簡単で良い方法は、パッケージを作成したマ シンと全く異なったマシン上でテストする事です。なぜなら、あなたのマシ ン上で何度も make install をしているので、きちんとインストールされる はずだからです。

テストのために rpm -u パッケージ名 とすることもできます、[訳注: おそらくこれは typo で rpm -e でしょう。rpm -u は現在では動作しません。 ]しかしパッケージ作成の時に make install を実行しているので間違う 事もあります。 もしファイルリストに洩れがあると、アンインストールされません。その時 にはバイナリパッケージを再インストールしてシステムを再び完全なものに します、しかし rpm パッケージはまだ完全ではありません。あなたは、 rpm -ba specファイル名 をしただけだという事をしっかり心に止めておい てください。多くの人々は パッケージをインストールするのに rpm -i パッケージ名 を行うだけです。バイナリがインストールされる時に 必要な事を build セクションや install セクションで何もしていないこと を確認してください。

6.11 新しく作成した RPM パッケージをどうすれば良いか。

いったん、あなたが RPM パッケージを作成したなら(すでに何か RPM 化し たと仮定します)、あなたの作成したパッケージで他の人に貢献する事がで きます(作成した RPM パッケージが自由に配布可能なものとします)。そう するために、ftp.redhat.com にアップロードしてください。 ftp://ftp.redhat.com

6.12 What Now?

新しい RPM パッケージですることとテストに関しては上記のセクションを 見てください。私達は 取得可能な 全ての RPM パッケージを募集していま す。そして、それらが素晴らしい RPM パッケージであることを望んでいま す。作成したパッケージをよく時間をかけてテストしてください。そして、 万人の利益のためにそれをアップロードするために時間をかけてください。 同様に、自由に配布できるソフトウェアのみをアップロードするようにして ください。商用ソフトウェア及びシェアウェアはそれらの著作権がはっきり と自由に配布する事が許される事を言及してない限りアップロードすべきで はありません。これには、Netscape ソフトウェア、ssh、pgp 等が含まれま す。


次のページ 前のページ 目次へ

[