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

5. パッケージ作成の準備 II (spec ファイルの記述法)

次はいよいよ、.rpm 及び .src.rpm を作成する為の 「仕様書」である spec ファイルを作成します。

5.1 spec ファイルの例

ただズラズラと spec ファイル中に記述すべき項目の説明を羅列 しても分かりにくいだけですので、例をあげて説明しましょう。

ここでは、著者の一人が作成した plain2-2.54 用の spec ファイル、``plain2-2.54-3.spec'' を例に取って説明します。

注:通常、.rpm 等のファイル名は、
<パッケージ名>-<バージョン番号>-<リリース番号>.<アーキテクチャ>.rpm
とします。例えば、i386 向けに作成した plain2 のバージョン 2.543 番目の rpm リリースに対しては、

plain2-2.54-3.i386.rpm
となるようにします。

以下に上記のspecファイルを示します。 右端の数字は解説用のインデックスで、実際のspecファイル には書かれていません。

---------- plain2-2.54-3.spec ----------
Summary: Plain2 plain text -> LaTeX/troff converter              1.
Name: plain2                                                     2.
Version: 2.54                                                    3.
Release: 3                                                       4.
Group: Applications/Publishing/TeX                               5.
Source: Flux.tokai.jaeri.go.jp:/plain2-2.54.tar.gz               6.
Copyright:                                                       7.
Packager: Kazuyoshi Furutaka <furutaka@Flux.tokai.jaeri.go.jp>        8.
URL: http://Flux.tokai.jaeri.go.jp                               9.
BuildRoot: /home/furutaka/work/rpm/plain2                       10.
Patch: Flux.tokai.jaeri.go.jp:/plain2-2.54.patch                11.

%package docs                                                   12.
Summary: Documents package of plain2                            13.
Group: Applications/Publishing/TeX                              14.

%description                                                    15.
Plain2 plain text -> LaTeX/troff converter (desc.)              16.

%description docs                                               17.
This package contains lots of documentation and Makefile        18.
for plain2 plain text -> LaTeX/troff converter.

%prep                                                           19.
%setup                                                          20.
%patch -p1                                                      21.
#%patch -p1                                                     22.

rm -rf   $RPM_BUILD_ROOT                                        --
mkdir -p $RPM_BUILD_ROOT/usr/local/bin                          23.
mkdir -p $RPM_BUILD_ROOT/usr/local/lib/plain2                   --

%build                                                          --
cd src                                                          24.
make                                                            --

%install                                                        --
cd src                                                          25.
make installprefix="$RPM_BUILD_ROOT" install                    --

%clean                                                          --
rm -rf $RPM_BUILD_ROOT                                          26.
                                                                --

%post                                                           --
chown -R root.root /usr/local/lib/plain2                        27.
chown    root.root /usr/local/bin/plain2
chown -R root.root /usr/doc/plain2-2.54-2                       --

%files                                                          --
%dir /usr/local/lib/plain2                                      ↑
/usr/local/bin/plain2
/usr/local/lib/plain2/OHP.p2
/usr/local/lib/plain2/OHP_t.p2                                  28.
/usr/local/lib/plain2/header.p2
/usr/local/lib/plain2/header_t.p2
/usr/local/lib/plain2/jbook.p2                                  ↓
/usr/local/lib/plain2/supsnum.p2                                --

%files docs                                                     29.
%doc doc/*
---------- end of plain2-2.54-2.spec ----------

では、各エントリーについて、順番に説明して行きます。

1.--18. はヘッダで、RPM を用いてパッケージの問い合わせ等に対する 返答や、ソースアーカイブなどの名前を記述しておくのに用いられます。

  1. このパッケージ(spec ファイル)の簡単な説明です。
  2. パッケージの名前です。
  3. パッケージが元にしているソースファイルのバージョン番号です。
    (ただし、バージョン番号の中にはハイフン ``-'' を用いる事は出来ません。 しようがないので、代わりにアンダースコア ``_'' を使って下さい。)
  4. この (.rpm 及び .src.rpm)パッケージの リリース番号です。
    (ソースのバージョンとは関係ありません。)
  5. Red Hat LiNUX でのパッケージの分類です。
    (日本語環境用配付パッケージ集を作成する時は、 独自の分類を考えた方が良いでしょう。RHL では、 Extensions/Japanese という階層が有ります。 (しかし、そこには ktermしか有りませんが(^^;;)
  6. 本来は、オリジナルのソースファイルの一次配布 ftp サイトを記述します。
    しかし、このように記述し、かつ、 自分の topdir: の下の SOURCES ディレクトリにソースファイルが置いてあれば問題無い様です。)
  7. 著作権を記述しておきます。
  8. ここには「RPM パッケージの維持」を行なっている人の名前と 電子メールアドレスを書いておきます。
    (ただし、これを書いておいても rpm -qiしただけでは 情報が表示されません。)
  9. ここには、パッケージ中のソフトウェアについての情報又は文書 への URL を書いておきます。
    将来的に RPM がこのタグを使う可能性もあるそうです。
    (このタグも、8. と同様 rpm -qi では情報が表示 されません。)
  10. バイナリ・パッケージを作成する為に「仮想的に」インストール を行なう際の、最上位ディレクトリを指定します。
  11. パッチの置き場所を記述します。
    (``Source:''(ソースの置き場所)と同様に、 この様な書式で指定し、かつ <topdir>/SOURCES にパッチファイルが置かれていれば、問題無く動作するようです。) 12.--14. は、ソースに含まれるファイルの一部を別のパッケージとする 場合のエントリです。(すべてのファイルを単一パッケージとする 場合は必要ありません。)
    この様にした場合は、(この例の場合) 文書ファイルを含まない plain2-2.54-2.i386.rpm の他に plain2-docs-2.54-2.i386.rpm という文書ファイルのみを含んだパッケージが作成されます。
  12. docs という別パッケージを作成する事を宣言します。
  13. 別パッケージの内容の簡単な説明を記述します。
  14. 別パッケージに対する分類を記述します。(この例では同じ分類)
  15. メインのパッケージ(この例では plain2-2.54-2.i386.rpm)の説明文のタグです。
  16. メインのパッケージの機能等を(アルファベット 50 字程度で) 記述します。
  17. サブパッケージ(この例では plain2-docs-2.54-2.i386.rpm)の説明文のタグです。
  18. サブパッケージの機能などを記述します。
  19. ソースを BUILD ディレクトリに展開し、パッチを当てる、 等の作業内容を記述しておくためのタグです。
  20. 実際にソースを展開し、パッチを当てる為の「マクロ」です。 動作内容は、オプション無しでは「ソースを展開し、出来た ディレクトリに cd する」ことです。 オプションには -n <name>, -c, -b #, -a #, -T, -D 等があり、夫々、
    -n <name>

    ソースを展開した後に cd するディレクトリ名を <name> とします。 ディフォルトでは $NAME-$VERSION です。 他には、 例えば $NAME, ${NAME}${VERSION} 等と する事も出来ます。
    (RPM-HOWTO にはこう書いてありますが $NAME$RPM_PACKAGE_NAME と書かないとダメな様です。)

    -c

    ソースファイルを展開する「前に」、指定したディレクトリを作成し、 そこにcd します。 上の -n <name> オプションと組み合わせて

    %setup -n <name> -c
    とする事により、<name> というディレクトリを作成し、 そこに cd する様にします。

    -b #

    展開先ディレクトリにcdする「前に」 # 番目のソース(Source#:)を展開します。

    -a #

    展開先ディレクトリに cd した「後で」 # 番目のソース(Source#:) を展開します。

    -T

    ディフォルトでは、%setupが現れる「毎に」 ``Source:''に示されたソースが展開されてしまいます。 そこで、複数のファイルが有る時は、二番目以降の%setup ではこのオプションを指定して、再び``Source:''が 展開されない様にします。 これに先だつ%setup-b 0 又は -a 0 と指定して、メインのソース「のみ」を展開しておかなくてはなりません。

    -D

    ディフォルトでは、%setup「毎に」BUILD ディレクトリに展開したものを消去してしまいます。 そこで、このオプションを指定して、二番目以降のソースを展開する 際に(既にBUILD に作成されている)ソースディレクトリを消去 しない様にします。

    という機能を持っています。 以上のオプション使用法の具体例を %setup マクロのオプションの使用例 節にて解説していますので、そちらを参照して下さい。
  21. パッチを当てるための「マクロ」です。 いくつかのオプションを取る事が出来ます。
    #

    ヘッダ中に Patch#: で示されている # 番目の パッチを当てます。

    -p #

    patch(1) コマンドに渡すべき、飛び越し可能 ディレクトリの階層数を # で指定します。

    -P

    ディフォルトの動作 (Patch もしくは Patch0を当てる) を抑止し、メインのソースがエラー無く展開できた事(返り値 0)を 確かめます。
    %patch # -P とする代わりに %patch# と指定する事も出来ます。

    この他にも、文書に記述されてはいないが使う事の出来る 機能/オプションが幾つかあるようです。 Undocumented(?) %patch functions節 を参照して下さい。
  22. コメントです。 コメントアウトするには行の最初の文字を '#' にします。
  23. 「仮想的にインストールする」ディレクトリを消去し、 新たに作り直しておきます。 ここで、RPM_BUILD_ROOT は、ヘッダ中で ``BuildRoot:'' により 指定したディレクトリに展開されます。 このように、%prep%buildといった 各タグの中では shell コマンドを書いておいて 実行させる事が出来ます。
  24. %build は実際の make を行なう 過程を示すタグです。
  25. %install は、インストール過程で行なう 作業を記述するタグです。 即ち、「BuildRoot: で指定されたディレクトリ 以下に仮想的にインストール」を行なっています。
  26. パッケージ作成終了後に行なう動作を記述するタグです。 無くても構いません。 ここでは、仮想インストールディレクトリの消去を行なっています。
  27. バイナリ・パッケージのインストール終了後に設定スクリプト等を 走らせる過程のためのタグです。
    (ここでは、一般ユーザがパッケージを作成しているために、ファイル の所有者が作成者になってしまっているので、所有者を root に変更しています。)
  28. %files は、このパッケージが所有するファイルを リストしておくためのタグです。 あるファイルがどのパッケージの所有物であるか問い 合わせる際や、パッケージを削除する際などに用いられます。 この際、各ファイルに %dir, %doc %config 等の印をつけておく事も出来ます。
    %dir

    これを付けられたディレクトリ「のみ」がこのパッケージ所有の ものであることを示します。 これを付けずにディレクトリを指定すると、そのディレクトリ 「中のすべてのファイル」がそのパッケージに属すると見做され、 インストールされます。

    %doc

    文書ファイルである事を示します。 ディフォルトでは /usr/doc/$NAME-$VERSION-$RELEASE にインストールされます。

    %config

    設定ファイルである事を示します。 アップグレード時には、古いリリースパッケージ中でこの印を付けられた ファイルに変更が加えられていない場合はそのまま消去し、変更 されていた場合はファイル名に .rpmsave を付けて保存します。

  29. サブパッケージ(この場合は docs) の所有するファイル を示すための、別の %files タグです。 サブパッケージを作らない場合は %doc doc/* の行を 27. に含めておけば良いだけです。
どうですか?分かりましたか?

5.2 例に登場していないタグ

上で用いられている以外にも、以下のようなタグがあります。

%pre

インストール前に行なう動作を記述するタグ

%preun

アンインストール前に行なう動作を記述するタグ

%postun

アンインストール後に行なう動作を記述するタグ

例えば、%post には、 「一般ユーザとして作成したためファイルの所有者がそのユーザに なってしまっている」ので chown したい場合や、 chmod したい場合などに用いる事が出来ます。

5.3 %setup マクロのオプションの使用例

ソースのディレクトリ名を指定する (%setup -n <name>)

%setup セクションの -n オプションを使うと、ソースを展開した 後で cd し、また %build で作業をするディレクトリの名前を指定することができます。

kon のソース(kon-0.99.4g.tar.gz) を例に取りましょう。このソースファイルを展開すると、

drwx--x--x manabe/dsl        0 Apr 17 16:06 1996 kon/
drwx--x--x manabe/dsl        0 Apr 17 00:53 1996 kon/font/
-rw------- manabe/dsl     4552 May  8 12:39 1994 kon/font/minix.c
-rw------- manabe/dsl      491 Apr  6 12:57 1996 kon/font/Makefile
(以下略)
と、kon というディレクトリの下にソースファイルが 展開されます。

一方、RPM は ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION} というディレクトリ以下にソースが展開されているものとして、 %setup マクロを実行した後はそのディレクトリに cd しようとします。

この場合は、単に %setup とやるのではなく、 %setup -n kon と指定すれば、上記ソースを展開した後 kon という ディレクトリに cd します。 また、%buildの際もこのディレクトリで作業を します。 特に、この場合は $RPM_PACKAGE_NAME = kon ですので、

%setup -n $RPM_PACKAGE_NAME
とする事も出来ます。

因みに、RPM の中で定義されていて、spec ファイルの中で 使う事が出来る変数としては以下の様なものがあるようです。 (中身は筆者の一人の環境での例です。)

RPM_ARCH=i386
RPM_BUILD_DIR=/home/ishioka/local/work/package/redhat/BUILD
RPM_BUILD_ROOT=/home/ishioka/local/work/package/rpm-tmp
RPM_DOC_DIR=/usr/doc
RPM_OPT_FLAGS=-O2 -m486 -fno-strength-reduce
RPM_OS=Linux
RPM_PACKAGE_NAME=kon
RPM_PACKAGE_RELEASE=0
RPM_PACKAGE_VERSION=0.99.4g
RPM_ROOT_DIR=/home/ishioka/local/work/package/rpm-tmp
RPM_SOURCE_DIR=/home/ishioka/local/work/package/redhat/SOURCES

ディレクトリを作成してからソースを展開する (%setup -c)

%setup -c を使うと、まずソースを 展開するディレクトリを作成し、そこに cd したあとで ソースを展開してくれます。 例えば、xc32.tar.gz の場合、 ソースを展開すると次のようにカレントディレクトリにファイルを作る ので...

tar tzvf ../SOURCES/xc32.tar.gz
-rw-rw-r-- 0/1            3343 Jun 14 07:53 1991 .autocis
-rw-rw-r-- 0/1            1152 Jun  6 10:56 1991 .uni
-rw-rw-r-- 0/1             824 Jun  6 10:56 1991 .callhq
-rw-rw-rw- 0/1            4127 Aug 25 10:17 1991 Makefile

この様な場合は、

%setup -c -n xc-3.2
と指定して、まず xc-3.2 というディレクトリを作って cdさせ、そこに展開させます。 あとは普通の場合とおなじです。

複数ソース、パッチを当てる

以下のように複数のソースを順に展開することができます.

Source:  xc32.tar.gz .......... メインのソース
Source1: xc32pat.tar.gz ....... サブソース1
Source2: xc32news.tar.gz ...... サブソース2

%prep
%setup -c ..................... (1)
%setup -D -a 1 -T ............. (2)
%setup -D -a 2 -T ............. (3)

(1) では メインのソース(Source: で指定したもの) を 展開しています。 xc の場合、カレントディレクトリにファイルを作るので、 -c オプションで先にディレクトリを作成し、 cd した後で展開させています。

(2), (3)ではサブソースを展開していますが、これも(1) と同様の 理由から -c を付加しています。 また, それぞれ Source[12]: を指定 するために -a # オプションも使っています。 ここでは、-D オプションを使って、 (1)で展開したディレクトリを消去してしまわない様にしています。 こうしておかないと、せっかく展開したメインのソースが消されて しまうのです! また、単に -a 2 とだけ指定すると、 Source2 「と Source」 が展開 されてしまうので、-T オプションも指定しています。

5.4 Undocumented (?) %patch functions

%path マクロは、パッチファイルが圧縮されていても 動作するようです。
(自動的に ``gzip -dc <PatchFile> | patch ...'' を行なってくれる。)

また、%patchマクロのオプションとしては、 undocumented ではありますが、下記の様な patch(1) オプションも指定する事が出来るようです。

-b xxx

バックアップとして保存するファイルの拡張子を .orig から .xxx に変更する。

-R

リバースパッチを施す。

-E

パッチを当てた結果空になったファイルを削除する。


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