次はいよいよ、.rpm
及び .src.rpm
を作成する為の
「仕様書」である spec
ファイルを作成します。
ただズラズラと spec
ファイル中に記述すべき項目の説明を羅列
しても分かりにくいだけですので、例をあげて説明しましょう。
ここでは、著者の一人が作成した plain2-2.54
用の
spec
ファイル、``plain2-2.54-3.spec
''
を例に取って説明します。
注:通常、.rpm
等のファイル名は、
<パッケージ名>-<バージョン番号>-<リリース番号>.<アーキテクチャ>.rpm
とします。例えば、i386
向けに作成した
plain2
のバージョン 2.54
の 3
番目の 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 を用いてパッケージの問い合わせ等に対する 返答や、ソースアーカイブなどの名前を記述しておくのに用いられます。
spec
ファイル)の簡単な説明です。
-
''
を用いる事は出来ません。
しようがないので、代わりにアンダースコア ``_
''
を使って下さい。)
.rpm
及び .src.rpm
)パッケージの
リリース番号です。Extensions/Japanese
という階層が有ります。
(しかし、そこには kterm
しか有りませんが(^^;;
)
ftp
サイトを記述します。topdir:
の下の SOURCES
ディレクトリにソースファイルが置いてあれば問題無い様です。)
rpm -qi
しただけでは
情報が表示されません。)
URL
を書いておきます。 rpm -qi
では情報が表示
されません。)
Source:
''(ソースの置き場所)と同様に、
この様な書式で指定し、かつ <topdir>/SOURCES
にパッチファイルが置かれていれば、問題無く動作するようです。)
12.--14. は、ソースに含まれるファイルの一部を別のパッケージとする
場合のエントリです。(すべてのファイルを単一パッケージとする
場合は必要ありません。)plain2-2.54-2.i386.rpm
の他に
plain2-docs-2.54-2.i386.rpm
という文書ファイルのみを含んだパッケージが作成されます。
docs
という別パッケージを作成する事を宣言します。plain2-2.54-2.i386.rpm
)の説明文のタグです。
plain2-docs-2.54-2.i386.rpm
)の説明文のタグです。
BUILD
ディレクトリに展開し、パッチを当てる、
等の作業内容を記述しておくためのタグです。
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
に作成されている)ソースディレクトリを消去
しない様にします。
#
ヘッダ中に Patch#:
で示されている #
番目の
パッチを当てます。
-p #
patch(1)
コマンドに渡すべき、飛び越し可能
ディレクトリの階層数を #
で指定します。
-P
ディフォルトの動作
(Patch
もしくは Patch0
を当てる)
を抑止し、メインのソースがエラー無く展開できた事(返り値 0)を
確かめます。
%patch # -P
とする代わりに %patch#
と指定する事も出来ます。
#
'
にします。
RPM_BUILD_ROOT
は、ヘッダ中で
``BuildRoot:
'' により
指定したディレクトリに展開されます。
このように、%prep
や
%build
といった
各タグの中では shell
コマンドを書いておいて
実行させる事が出来ます。
%build
は実際の make
を行なう
過程を示すタグです。
%install
は、インストール過程で行なう
作業を記述するタグです。
即ち、「BuildRoot:
で指定されたディレクトリ
以下に仮想的にインストール」を行なっています。
root
に変更しています。)
%files
は、このパッケージが所有するファイルを
リストしておくためのタグです。
あるファイルがどのパッケージの所有物であるか問い
合わせる際や、パッケージを削除する際などに用いられます。
この際、各ファイルに
%dir, %doc %config
等の印をつけておく事も出来ます。
%dir
これを付けられたディレクトリ「のみ」がこのパッケージ所有の ものであることを示します。 これを付けずにディレクトリを指定すると、そのディレクトリ 「中のすべてのファイル」がそのパッケージに属すると見做され、 インストールされます。
%doc
文書ファイルである事を示します。
ディフォルトでは
/usr/doc/$NAME-$VERSION-$RELEASE
にインストールされます。
%config
設定ファイルである事を示します。 アップグレード時には、古いリリースパッケージ中でこの印を付けられた ファイルに変更が加えられていない場合はそのまま消去し、変更 されていた場合はファイル名に .rpmsave を付けて保存します。
docs
) の所有するファイル
を示すための、別の %files
タグです。
サブパッケージを作らない場合は
%doc doc/*
の行を 27. に含めておけば良いだけです。
上で用いられている以外にも、以下のようなタグがあります。
%pre
インストール前に行なう動作を記述するタグ
%preun
アンインストール前に行なう動作を記述するタグ
%postun
アンインストール後に行なう動作を記述するタグ
%post
には、
「一般ユーザとして作成したためファイルの所有者がそのユーザに
なってしまっている」ので chown
したい場合や、
chmod
したい場合などに用いる事が出来ます。
%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
を使うと、まずソースを
展開するディレクトリを作成し、そこに 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
オプションも指定しています。
%path
マクロは、パッチファイルが圧縮されていても
動作するようです。
(自動的に ``gzip -dc <PatchFile> | patch ...
''
を行なってくれる。)
また、%patch
マクロのオプションとしては、
undocumented ではありますが、下記の様な patch(1)
オプションも指定する事が出来るようです。
-b xxx
バックアップとして保存するファイルの拡張子を .orig
から .xxx
に変更する。
-R
リバースパッチを施す。
-E
パッチを当てた結果空になったファイルを削除する。