5.2. スクリプト部

スクリプト部では、パッケージの作成やインストール等の手順を記述します。

例5.6 スクリプト部の記述例

# スクリプト部
%prep       #rpmを構築する前の準備です。
rm -rf $RPM_BUILD_ROOT

%setup      #ソースをBUILDに展開します。
%patch -p1  #パッチをあてます。

%build      #makeのための手順を書きます。
make
(cd man; make man)

%install    #installのための手順を書きます。
make prefix=${RPM_BUILD_ROOT}/usr/local install
(cd man; make prefix=${RPM_BUILD_ROOT}/usr/local install.man)

%clean      #rpmを作ったあとの後始末です。
rm -rf $RPM_BUILD_ROOT

スクリプト部は、表5.4「スクリプト部のセクション」で示すセクションに分かれます。

各セクションは、独立したbashスクリプトとして実行できるように記述します。

rpmbuild時の内部の仕組み

各セクション名が現れた時に #!/bin/sh -eが起動され(Vine Linuxでは/bin/shは/bin/bashにsym.linkされてる)、 各環境変数(RPM_SOURCE_DIRやRPM_PACKAGE_NAMEなど)が定義された後、 次のセクション名が出てくるまで、記述されているスクリプトが実行されます。

環境変数の詳細については、「環境変数」を参照してください。

表5.4 スクリプト部のセクション

セクション名 概要 詳細説明
%prep ソースをビルドする前に実施する準備事項 「%prepセクション」
%build ソースのビルド手順 「%buildセクション」
%install ソースからのインストール手順 「%installセクション」
%check インストールが正しく実行されたかを検査する手順 「%checkセクション」
%clean パッケージ作成後の後始末 「%cleanセクション」
その他 パッケージのインストール等の前後に実行する手順 11章スクリプト部で使用できるその他のセクション

以下、各セクションの詳細を解説します。

5.2.1. %prepセクション

ソースをビルドする前に実施する準備事項をシェルスクリプトで記述します。

以下で説明する%setup,%patchなどのマクロを用いて、ソースの展開やパッチの適用などを行います。

なお、このセクションの最初で

rm -rf ${RPM_BUILD_ROOT}

として、 ${RPM_BUILD_ROOT}(「パッケージ情報の記述」のBuildRootで指定したディレクトリ) を掃除することが多いです。ただし、このときには、 BuildRootの設定には十分気をつけて下さい(何故かわかりますね?)

%setup

tarでアーカイブされ、 gzipまたはbzip2圧縮されたソースを展開します。 %setupとオプションなしで書くと、以下が順に行われます。

  1. 2章パッケージ作成に必要なディレクトリの準備で指定したディレクトリBUILDにcdする。

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

  3. Sourceで指定したソースのアーカイブを展開する。

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

%setupの動作を制御する必要がある場合は、10章%setupマクロの詳細を参照してください。

%patch

%setupで展開したソースにパッチをあてるためのマクロとしてはたらきます。

オプションなしで%patchと書くと、

patch -p0 -s < ${RPM_SOURCE_DIR}/<Patchで指定したファイル>

が起動されます。

例5.6「スクリプト部の記述例」のように書くと、

patch -p1 -s < ${RPM_SOURCE_DIR}/<Patchで指定したファイル>

と同じことをします。

パッチファイルが複数ある場合、Patch0, Patch1,...に対して、

%patch0 -p1
%patch1 -p1

と実行することも出来ます。%patchには-b <name> (バックアップ・ファイルの拡張子指定、デフォルトは.orig)などのオプ ションがあります。

5.2.2. %buildセクション

ソースをmakeするスクリプトの開始であることを示し、また、 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、makeを行うときの手順をスクリプトとして書きます。

ここでの処理で必要となるパッケージ等は、BuildRequires(build): で指定します。

ソースにconfigureスクリプトが用意されている場合

autoconf化されたソースなどmakeの前に

$ configure --prefix=/usr

などとしてインストールするディレクトリなどを制御できるソースがあります。

configureスクリプトが用意されている場合には、%configureマクロを利用すると便利です。

%configureマクロは、/usr/lib/rpm/macrosで次のように定義されており、 Vine Linux推奨のコンパイルフラグやインストールディレクトリを設定できます。

%configure \
  CFLAGS="${CFLAGS:-%optflags}" ; export CFLAGS ; \
  CXXFLAGS="${CXXFLAGS:-%optflags}" ; export CXXFLAGS ; \
  FFLAGS="${FFLAGS:-%optflags}" ; export FFLAGS ; \
  ./configure --host=%{_host} --build=%{_build} \\\
	--target=%{_target_platform} \\\
	--program-prefix=%{?_program_prefix} \\\
 	--prefix=%{_prefix} \\\
	--exec-prefix=%{_exec_prefix} \\\
	--bindir=%{_bindir} \\\
	--sbindir=%{_sbindir} \\\
	--sysconfdir=%{_sysconfdir} \\\
	--datadir=%{_datadir} \\\
	--includedir=%{_includedir} \\\
	--libdir=%{_libdir} \\\
	--libexecdir=%{_libexecdir} \\\
	--localstatedir=%{_localstatedir} \\\
	--sharedstatedir=%{_sharedstatedir} \\\
	--mandir=%{_mandir} \\\
	--infodir=%{_infodir}

ここで定義されていないオプション、例えば--disable-scrollkeeperというようなオプションが必要な場合には

%configure --disable-scroolkeeper

のように追加でオプションを指定できます。

5.2.3. %installセクション

ファイルをinstallするスクリプトの開始であることを示し、また、 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、installを行うときの手順を示します。 データ定義部のBuildRootで設定したディレクトリ(${RPM_BUILD_ROOT}) の下に全てのファイルがインストールされるように、工夫しましょう。 Makefileが短いときには、修正してpatchをつくるかわりに、ここに、 cp, installコマンド等を用いたinstallスクリプトを書くのも一手です。

%setup のところと同じように、マクロ %{SOURCE数字} を使って Source: で指定したファイルを直接インストールすることもできます。

%{__install} -m 644 %{SOURCE2} %{buildroot}/where/there/

なお、rpm-3.0.5以降では、インストールされたバイナリは rpmパッケージにする段階で自動的にstripされますので、 %installでbinaryのstripを行う必要はありません。

ここでの処理で必要となるパッケージ等は、 BuildRequires(install): で指定します。

5.2.4. %checkセクション

install が正しく実行されたかをcheckするスクリプトの開始であることを示します。 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、make test や make check などを実行するときの手順を示します。

GNOME などが利用する desktopファイルの書式チェックなどを行うこともできます。 「GNOME,KDE,Xfce のメニューに追加するために」を参照してください。

rpm-4.2以降で実装された機能です。

ここでの処理で必要となるパッケージ等は、 BuildRequires(install): で指定します。

5.2.5. %cleanセクション

rpmを作ったあとの後始末を記述します。

ここでの処理で必要となるパッケージ等は、 BuildRequires(clean): で指定します。