5.2. スクリプト部

データ定義部の次の部分は、以下のような%が頭に付くタグからはじまる、 一連のscriptで構成されます。重要なのは、各タグから始まる次のタグの前までの部分は、 独立したbashスクリプトとして実行されるということです。 (注:以下で、%setup, %patchはスクリプトのはじまりを表すタグではなく、 スクリプト中で記述を簡略するためのマクロです。)

より正確には、各タグが現れた時に #!/bin/sh -e が起動され(RHLでは/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とオプションなしで書くと、以下が順に行われます。

  1. Section 4.1, “環境設定”で指定したディレクトリBUILDにcdする。

  2. 指定ディレクトリ(-nで指定できる。デフォルトのディレクトリ名は、 ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}、後述) がカレント・ディレクトリ(BUILD)に存在すれば消去する。

  3. Sourceで指定したtar.gzのソースを展開する。

  4. 指定ディレクトリ(2の指定ディレクトリ名と同じ)にcdする。

  5. 以下を実行する。

    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

パッケージの展開のとき、展開中の情報を表示しません。

その他、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でbainaryのstripを行う必要はありません。

%clean

rpmを作ったあとの後始末をこのタグの下に記述します。

スクリプト部にいれれるタグは、ほかにも、いろいろあります。たとえば、 以下のタグはそれぞれインストール時やアンインストール時に起動するシェルスクリプトを記述するためのものです。

%pre

rpmパッケージをinstallするとき、パッケージの展開前に行うことを書く。 -pオプションについては%postの場合(以下)参照。

%post

rpmパッケージをinstallするとき、パッケージの展開をした後に行うことを書く。 たとえば、ライブラリをインストールする時には、

%post
/sbin/ldconfig

とすると、ldconfigが実行される。また、代りに

%post -p /sbin/ldconfig

と、-pオプションを用いて書くと、 シェルスクリプトを起動すること無く直接コマンドが実行される。 またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、 登録される。

%preun

rpmパッケージをuninstallするとき、展開ファイルの削除前に行うことを書く。 -pオプションについては%postの場合と同様。

%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-4.0.5/triggers に詳しい説明があります。

さらに、タグについて知りたい人はMaximumRPMを見ましょう。