データ定義部の次の部分は、以下のような%が頭に付くタグからはじまる、 一連のscriptで構成されます。重要なのは、各タグから始まる次のタグの前までの部分は、 独立したbashスクリプトとして実行されるということです。 (注:以下で、%setup, %patchはスクリプトのはじまりを表すタグではなく、 スクリプト中で記述を簡略するためのマクロです。)
より正確には、各タグが現れた時に #!/bin/sh -e が起動され(Vine Linuxでは/bin/shは/bin/bashにsym.linkされてる)、 各環境変数(RPM_SOURCE_DIRやRPM_PACKAGE_NAMEなど)が定義された後、 次のタグが出てくるまで、記述されているスクリプトが実行されます。
- %prep
ソースのmakeやインストール作業前の準備の開始を示すタグです。 以下で説明する%setup,%patchなどのマクロを用いたり、 シェルスクリプトを記述して、ソースの展開などを行います。 ここで、
%prep rm -rf ${RPM_BUILD_ROOT}として、${RPM_BUILD_ROOT}(先のBuildrootで指定したディレクトリ) を掃除することが多いです。ただし、このときには、 Buildrootの設定には十分気をつけて下さい(何故かわかりますね?)
- %setup
%prepからはじまるスクリプト中で、ソースを展開するためのマクロです。 %setupとオプションなしで書くと、以下が順に行われます。
Section 4.1, “環境設定”で指定したディレクトリBUILDにcdする。
指定ディレクトリ(-nで指定できる。デフォルトのディレクトリ名は、 ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}、後述) がカレント・ディレクトリ(BUILD)に存在すれば消去する。
Sourceで指定したtar.gzのソースを展開する。
指定ディレクトリ(2の指定ディレクトリ名と同じ)にcdする。
以下を実行する。
chown -R root . chgrp -R root . chmod -R a+rX,g-w,o-w .
(注:一般userがrpmをbuildするときには、chown root, chgrp rootは実行権限がないので行われない。 一般userでbuildするときには、 %filesの%attrでファイルの属性設定を行う。後述)
hoge-1.1.tar.gzを展開したときに、hoge-1.1/というディレクトリができるなら、 オプションをつけなくても以上の作業が行われますが、例えば、 hoge/というディレクトリができるなら、このディレクトリの下にcdできるように、
%setup -n hoge
または、
%setup -n ${RPM_PACKAGE_NAME}と指定します。
複数のソースがあるときには以下に述べるオプション-aや-bを使います。 例えばSource、Source1、Source2の3つがあるときには、
%setup -a 1 -a 2 -n hoge
などとします。(以下のオプションの指定参照。)
この%setupにはさまざまなオプションがありますが、 代表的なものを以下に示します。
- -n <ディレクトリ名>
%setupを実行した後(もしくは前)にcdするディレクトリ名(name)を指定する。 このオプションを省略したときの、デフォルトのディレクトリ名は、 ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}。
- -c
指定ディレクトリ(上の-nオプションで指定したディレクトリ) を作成し(create)、そこにcdした後にソースの展開をします。
- -a <#>
Source0を展開した後、 指定ディレクトリ(上と同じ)にcdした(after)、 #番目のソース(Source#)の展開をします。 %setup -a 2 -a 3 と複数-aオプションが指定された時には、 Source0 が展開された後、指定ディレクトリに cd し、 Source2、Source3を展開します。 (Source0の展開は最初の一階だけです。)
- -b <#>
Source0を展開した後、 指定ディレクトリ(上と同じ)にcdする前に(before)、 #番目に指定されてるソース(Source#)の展開をします。
- -D
先に述べたように、%setupは、まず、指定ディレクトリ(上と同じ)が、 ディレクトリBUILDの下にあるかどうかをチェックして、もし存在していたら、 それを削除してから、ソースの展開などの作業を行います。 %setupを複数回呼びたい場合、 2回目に%setupを呼んだ時に最初の%setupで展開したディレクトリを削除されては困ります。 この-Dオプションは、このような削除を行わないようにします。(あまり使いません)
- -T
ソースの展開を行いません。先に述べたように、 オプション指定を -a 2 や -b 2 とすると、 Source0とSource2で指定したものが展開されます。 Source2だけを展開したいときには、このオプションを使って、
%setup -T -a 2
とします。また、
%setup -T -c hoge
とすると、パッケージの展開は行わず、ディレクトリhogeを作って、 そこにcdします。
- -q
ソースの展開のとき、展開中の情報を表示しません。 たとえば tar での展開の時に、-q 無しだと tar xvvf、-q 有りだと tar xf のように変わります。
その他、MaximumRPMを見るといろいろのっています。 tar.gzでないソースファイルは、-Tオプションを利用して、 作業ディレクトリに移動した後、
lha x ${RPM_SOURCE_DIR}/hoge.lzhとかして展開することもできます。
また、%setupに続いて、bash scriptを書いて、 いろいろな作業を行うことも出来ます。
- %patch
%prepからはじまるスクリプト中で、patchをあてるためのマクロとしてはたらきます。 例のように書くと、
patch -p1 -s < ${RPM_SOURCE_DIR}/<Patchで指定したファイル>と同じことをするので、%patchを使うかわりに%setupのあとで上のように書いてもいいです。 オプションなしで%patchと書くと、
patch -p0 -s < ${RPM_SOURCE_DIR}/<Patchで指定したファイル>が起動されます。%patchは%setupからはじまるスクリプトに含まれる、 単なるマクロとしてはたらきます。 Sourceと同様に、Patch0, Patch1,...と複数の設定に対して、
%patch0 -p1 %patch1 -p1
と実行することも出来ます。%patchには-b <name> (バックアップ・ファイルの拡張子指定、デフォルトは.orig)などのオプ ションがあります。
- %build
ソースをmakeするスクリプトの開始であることを示し、また、 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、makeを行うときの手順をスクリプトとして書きます。
- %install
ファイルをinstallするスクリプトの開始であることを示し、また、 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、installを行うときの手順を示します。 ここで、Section 4.2, “makeの準備”で述べたように、 データ定義部のBuildrootで設定したディレクトリ(${RPM_BUILD_ROOT}) の下に全てのファイルがインストールされるように、工夫しましょう。 Makefileが短いときには、修正してpatchをつくるかわりに、ここに、 cp, installコマンド等を用いたinstallスクリプトを書くのも一手です。
なお、rpm-3.0.5以降では、インストールされたバイナリは rpmパッケージにする段階で自動的にstripされますので、 %installでbinaryのstripを行う必要はありません。
- %check
install が正しく実行されたかをcheckするスクリプトの開始であることを示します。 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、make test や make check などを実行するときの手順を示します。
GNOME の desktopファイルの書式チェックなどを行うこともできます。 Appendix B, パッケージ固有の作法等についてのGNOME のメニューに追加するためにを参照してください。
rpm-4.2以降で実装された機能です。
- %clean
rpmを作ったあとの後始末をこのタグの下に記述します。
スクリプト部に入れることができるタグは、ほかにも、いろいろあります。たとえば、 以下のタグはそれぞれインストール時やアンインストール時に起動するシェルスクリプトを記述するためのものです。
- %pre
rpmパッケージをinstallするとき、パッケージの展開前に行うことを書く。 -pオプションについては%postの場合(以下)参照。
- %post
rpmパッケージをinstallするとき、パッケージの展開後に行うことを書く。
たとえば、infoファイルをインストールする時には、
%post /sbin/install-info %{_infodir}/hoge.info.gz %{_infodir}/dirとして、info のメニューエントリに infoファイルを追加します。 info ファイルは、アンインストール時にも処理が必要になります。 %preun も参照してください。
たとえば、ライブラリをインストールする時には、
%post /sbin/ldconfig
とすると、ldconfigが実行される。また、代わりに
%post -p /sbin/ldconfig
と、-pオプションを用いて書くと、 シェルを起動すること無く直接コマンドが実行される。 またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、 登録される。
正確にいうと、タグに
-pオプションをつけた場合は、 /bin/sh ではなく別のプログラムでスクリプト部分を解釈させるということになります。以下は問題が起こる例です。
%post -p /sbin/ldconfig # update ld.so.cache %files
この場合は %post と %files の間の2行が、スクリプト部分になります。 一行目に
# update ld.so.cache
と書いてあります。 bash であれば、# で始まる行は コメントと解釈され無視されますが、 このスクリプト部分を読み、実行するのは /bin/sh ではなく /sbin/ldconfig です。 ldconfig には # 以降をコメントとして無視するというルールは無いので、 そのまま実行しようとしてエラーになります。
エラーを起こさないようにするには
%post -p /sbin/ldconfig %files
とするか、
%post /sbin/ldconfig # update ld.so.cache %files
とします。
一つ目の例では、/sbin/ldconfig がスクリプト部分を実行するために起動し(、起動した時点で ld.so.cache が更新されますが)、スクリプト部分については何も書かれていないので何もせずに終了します。
二つ目の例では、/bin/sh が起動し、スクリプト部分を解釈し /sbin/ldconfig を実行、# 以下はコメントなので無視します。
- %preun
rpmパッケージをuninstallするとき、展開ファイルの削除前に行うことを書く。 -pオプションについては%postの場合と同様。
たとえば info ファイルをアンインストールする時には、
%preun if [ $1 = 0 ]; then /sbin/install-info --delete %{_infodir}/hoge.info.gz %{_infodir}/dir fiとして、info のメニューエントリから削除します。 if [ $1 = 0 ]; then と fi の行は、 アップグレード時には実行せず、アンインストール時だけに実行させるための記述です。 Chapter 9, rpmパッケージをつくるときの注意を参照してください。
- %postun
rpmパッケージをuninstallするとき、各ファイルを削除した後に行うことを書く。 -pオプションについては%postの場合と同様。
これらのタグを使うのは、ちょっと注意が必要です。 詳しくは、Chapter 9, rpmパッケージをつくるときの注意を参照してください。
以上のタグは、作成したrpmパッケージをinstallやuninstallするときの、 実行されるスクリプトの設定になるので、 specファイルからrpmパッケージを作るときには、実行されることはありません。
さらに、他のパッケージがインストールされた時に起動するスクリプトも記述できます。
- %triggerin
あるパッケージがインストールされていた、 もしくは、された時に起動するスクリプトを書く。たとえば、
%triggerin -- hoge echo "hoge is installed"
と書いておくと、パッケージhogeをインストールしたときに、 上記メッセージが表示されます。以下のように、バージョン指定もできます。
%triggerin -- hoge > 3.0 echo "hoge is installed"
同様にして、あるパッケージの削除前に実行される%triggerun、 あるパッケージの削除後に実行される%triggerpostunがあります。このタグについては、
/usr/share/doc/rpm-<version>/triggersに詳しい説明があります。
さらに、タグについて知りたい人はMaximumRPMを見ましょう。
