SPECファイルの記述

いよいよ、パッケージ作成の肝となるSPECファイルの記述について説明します。

SPECファイルの内容は、以下の主要部分に分類できます。

  • パッケージ情報
  • パッケージの作成やインストール等の手順(スクリプト部)
  • インストールされるファイルの一覧
  • パッケージの変更履歴
SPECファイルの文字コード

SPECファイルの文字コードはUTF-8にしてください。

マクロの定義

SPECファイルの冒頭にパッケージのバージョンなど頻繁に使用されるものをマクロとして定義しておくと後々の修正が楽になります。

%define	macro	literal
ようにするとパッケージ作成時に%{macro}と書かれた部分をliteralに置換して処理します。

セクション III.8.3 - 標準で定義されているマクロも参照して下さい。

II.5.1. パッケージ情報の記述

rpmコマンドでパッケージに関する問い合わせを実行した場合に表示される情報やパッケージの依存情報などを記述します。

例 II.5-1パッケージ情報の記述例

以下にパッケージ情報の記述例を示します。(#を記述すると#から行末までがコメントとして扱われます。)

# 基本情報
Summary: hoge is a harehare horehore
Summary(ja): hoge は harehare な horehore です。
Name: hoge
Version: 1.1
Release: 1%{?_dist_release}
License: GPL2
Group: Applications/Internet
URL: http://www.fugahogo.com/hogehoge.html
Vendor:	Project Vine
Distribution: Vine Linux
Packager: yourid,otherid

# パッケージの作成時に必要となる情報
Source: %{name}-%{version}.tar.gz
Patch: hoge.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root

# 依存情報
Requires:	piyo
BuildRequires:	piyo-devel

# 詳しい解説
%description
Hoge is a harehare horehore and convenient for fugafuga.
Enjoy!

%description -l ja
hoge は harehare な horehore で、fugafuga するときなどとても便利なツー
ルです。みんなでなかよく使いましょう。
# 基本情報
Summary: hoge is a harehare horehore
Summary(ja): hoge は harehare な horehore です。
Name: hoge
Version: 1.1
Release: 1%{?_dist_release}
License: GPL2
Group: Applications/Internet
URL: http://www.fugahogo.com/hogehoge.html
Vendor:	Project Vine
Distribution: Vine Linux
Packager: yourid,otherid

# パッケージの作成時に必要となる情報
Source: %{name}-%{version}.tar.gz
Patch: hoge.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-root

# 依存情報
Requires:	piyo
BuildRequires:	piyo-devel

# 詳しい解説
%description
Hoge is a harehare horehore and convenient for fugafuga.
Enjoy!

%description -l ja
hoge は harehare な horehore で、fugafuga するときなどとても便利なツー
ルです。みんなでなかよく使いましょう。

基本情報から依存情報の部分は、1行につき1つの情報を記述する構成となっています。

各行は「Summary:」のようにタグとそれに続くコロンで始まり、さらにタグに対応する情報が続く形式になっています。

II.5.1.1. 基本情報

表 II.5-1の情報は、rpm -qiなどでパッケージに関して問い合わせを行った場合に表示されます。

表 II.5-1基本情報で使用されるタグ
タグ 内容
Summary パッケージの簡単な説明を英語で記述します。
Summary(ja) Summaryを日本語で翻訳します。
Name パッケージの名前です。定義以降、%{name}というマクロで参照できます。
Version パッケージのバージョンです。定義以降、%{version}というマクロで参照できます。
Release 冒頭の数字は同じバージョンで何回目のリリースになるかを意味します。%{?_dist_release}は、vl5の様に対象となるVine Linuxのバージョンに置き換えられます。定義以降、%{release}というマクロで参照できます。
License アプリケーションのライセンス
Group アプリケーションの種類。付録 B - Vine Linux で使用できるGroup一覧を参照して下さい。
Packager パッケージメンテナ。BTS.VineLinux.Orgへのログインユーザ名を使用してください。複数のメンテナがいる場合、カンマで区切ります。
Distribution VinePlusやVineSeedのパッケージは、Vine Linuxを指定します。
Vendor 作成したrpmパッケージに関する責任を負うVendor名です。VinePlusやVineSeedのパッケージは、Project Vineを指定します。
Url アプリケーションの情報を提供しているURL

II.5.1.2. パッケージ作成時に必要となるタグ

表 II.5-2パッケージ作成時に必要となるタグ
タグ 内容
Source パッケージ化するアプリケーションのソースファイル名。ソースの入手先を明示するためにURL形式で記述することも可能。
Patch セクション II.4.3 - パッチの用意で用意したパッチファイルを指定します。 書式はSourceと同じです。
BuildRoot 仮想インストールのためのディレクトリ名を書きます。直接ディレクトリ名を書くのではなく、例のようにマクロを利用してください。

複数のソースファイルやパッチがあるときはSource0、Source1、...やPatch0、Patch1、...というふうに番号をふって列挙します。(Source0は、Sourceと省略できます。)

Souce数字 で指定したファイルは %{SOURCE数字} というマクロとして セクション II.5.2 - スクリプト部の %prep や %install などの部分で利用できます。

II.5.1.3. 依存情報

パッケージの依存情報など他のパッケージとの関係を示すには、表 II.5-3のようなタグを使用します。

表 II.5-3パッケージの依存関係を扱うタグ
タグ 内容
Requires 作成しているrpmパッケージが動作するのに必要なパッケージ名
BuildRequires パッケージの作成時に必要となるパッケージ名
Conflicts 共存できないパッケージ名
Provides 作成するパッケージが他のパッケージの代替となる場合、そのパッケージ名を記述
Obsoletes パッケージをインストールする際にアンインストールしたいパッケージ名
BuildConflicts パッケージ作成時にはインストールしておけないパッケージ名

<, >, =, >=, <=といった演算子を使うとパッケージのバージョン、リリース番号を限定することもできます。

例 II.5-2ghostscriptのバージョン5.10がパッケージの動作に必要な場合
Requires: ghostscript = 5.10
例 II.5-3gtk2-develのバージョン2.16.0以上がパッケージの作成に必要な場合
BuildRequires: gtk2-devel >= 2.16.0
演算子の両側には必ずスペースやタブを入れてください。

演算子の両側にスペースやタブを入れない場合、パッケージ名からバージョンまでが一つのパッケージ名として認識されてしまいます

例えば、

BuildRequires: gtk2-devel>=2.16.0
とすると「gtk2-devel>=2.16.0」というパッケージ名だと認識してしまいます。

複数のパッケージが関係する場合は、カンマ(,)やスペースで区切って列挙したり、複数行に分けて記述できます。複数行に分ける場合は、各行にタグが必要です。

パッケージがいくつかのグループに分類できる場合には、複数行に書いた方がわかりやすくなります。

例 II.5-4一行で記述する例
Requires: ghostscript >= 5.10, ghostscript-fonts, VFlib = 2.24, tetex, tetex-extra
例 II.5-5複数行に分けて記述する例
Requires: ghostscript >= 5.10, ghostscript-fonts, VFlib = 2.24
Requires: tetex, tetex-extra

II.5.1.4. 詳しい解説

Summaryよりも詳しいパッケージの解説を

%description
の次の行から、英語で記述します。

Summaryタグの場合と違い、複数行にわたる解説を書くことができます。

なお、日本語による翻訳を追加する場合は、

%description -l ja
として、同様に記述できます。

II.5.2. スクリプト部

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

例 II.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

スクリプト部は、表 II.5-4で示すセクションに分かれます。

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

rpmbuild時の内部の仕組み

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

環境変数の詳細については、セクション III.8.1 - 環境変数を参照してください。

表 II.5-4スクリプト部のセクション
セクション名 概要 詳細説明
%prep ソースをビルドする前に実施する準備事項 セクション II.5.2.1 - %prepセクション
%build ソースのビルド手順 セクション II.5.2.2 - %buildセクション
%install ソースからのインストール手順 セクション II.5.2.3 - %installセクション
%check ビルドされたバイナリが正常に動作するか検証する手順 セクション II.5.2.4 - %checkセクション
%clean パッケージ作成後の後始末 セクション II.5.2.5 - %cleanセクション
その他 パッケージのインストール等の前後に実行する手順 第III.11章 - スクリプト部で使用できるその他のセクション

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

II.5.2.1. %prepセクション

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

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

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

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

%setup

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

  1. 第I.2章 - パッケージ作成に必要なディレクトリの準備で指定したディレクトリBUILDにcdする。
  2. 指定ディレクトリ(-nで指定できる。デフォルトのディレクトリ名は、 ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}、後述) がカレント・ディレクトリ(BUILD)に存在すれば消去する。
  3. Sourceで指定したソースのアーカイブを展開する。
  4. 指定ディレクトリ(2の指定ディレクトリ名と同じ)にcdする。

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

%patch

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

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

patch -p0 -s < ${RPM_SOURCE_DIR}/<Patchで指定したファイル>
が起動されます。

例 II.5-6のように書くと、

patch -p1 -s < ${RPM_SOURCE_DIR}/<Patchで指定したファイル>
と同じことをします。

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

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

II.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
のように追加でオプションを指定できます。

II.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): で指定します。

II.5.2.4. %checkセクション

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

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

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

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

II.5.2.5. %cleanセクション

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

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

II.5.3. ファイルリスト部

%filesはじまる部分で、RPMパッケージに収録するファイル名を列挙します。

例 II.5-7ファイルリスト部の例
# ファイルリスト部 --------------
%files
%defattr(-,root,root)
%doc README
%doc docs/ 
/usr/bin/hoge.bin
/usr/lib/hoge/
/usr/man/man1/hoge.1.gz
%dir /usr/lib/hoge/
%config /usr/lib/hoge/fuga.conf

このとき以下に注意してください。

  • ここに書くファイル名は重複してはいけません。
  • 列挙されたファイルは、%docで指定するものを除いて、 %installまでのスクリプトの実行によって、 記述した通りの場所(${RPM_BUILD_ROOT}を''/''とみなす) にinstallされるものでないといけません。
  • 列挙されたファイルがおかしな userID/groupID を持っていると、 rpmパッケージが正常にbuildできないことがあります。
  • ファイルを含まないバーチャルパッケージ1を作る場合でも、%files という行だけは必要になります。%files という行を省略してしまうと、rpmbuild コマンドで処理しても src.rpm しか作れません。

rpmbuildコマンドは、SPECファイルに基づいてRPMパッケージを作るときに、 セクション II.5.2 - スクリプト部で設定した一連のスクリプトを実行した後、 ${RPM_BUILD_ROOT}をとみなして%files以下で指定されたファイルを回収し、 それを指定位置にinstallするようなRPMパッケージをつくります。

II.5.3.1. ドキュメント・ファイルの指定

%docというマクロを用います。例 II.5-7のように、%doc READMEとすると、 %setupで指定したホームディレクトリ下のREADMEが、 ${RPM_BUILD_ROOT}/usr/doc/hoge-1.1-2/にcpされたのち、 rpmパッケージに回収されます。つまり%docは、 ドキュメントファイルのインストールとパッケージングのためのファイル指定を同時に行うマクロとしてはたらきます。 以下のように、ディレクトリごと指定もできます。

%doc doc/

II.5.3.2. パッケージに収録するファイルの指定

その絶対パスで指定します。

  • 個別ファイルはそのまま指定。(/usr/bin/hoge.bin など)
  • あるディレクトリ以下の全てのファイルをrpmパッケージにいれたいときには、 そのディレクトリ名を書きます。(タグなし、/usr/hoge/ など)。 アンインストール時には、そのディレクトリごとなくなります。
  • ワイルドカードも使えます。(/usr/hoge/* など)

rpm-3.0.5以降では、man ファイルや info ファイルは自動的にgzipで圧縮されます。 %filesにmanやinfoのファイル名を書くときには拡張子.gzをつけるのを忘れないようにしましょう。

II.5.3.3. タグを用いたファイル指定

%dir <dir name>

指定したディレクトリだけをパッケージに含める。

``/usr/hoge/'' = ``%dir /usr/hoge/'' + ``/usr/hoge/*''
ってかんじです。

%config <file name>

configファイルであることを示す。 ファイルが書き換えられていた場合、 アンインストール時には .rpmsaveをつけた名前で保存されます。 アップグレード時には新しいファイルと置き換えられ、 元のファイルは .rpmsaveをつけた名前で保存されます。

ファイルが変更されていた場合、 アップグレード時に新しいファイルに置き換えずにもとのファイルをそのまま使う場合には、 %config(noreplace) を指定します。

%config(noreplace) <file name>
この場合新しいパッケージに入っている設定ファイルは、 .rpmnew をつけた名前で保存されます。 また、アップグレードではなく、同じバージョンをインストールし直した時には、 .rpmorig をつけた名前で保存されます。

存在しなくても問題ないファイルの場合は、 %config(missingok) を指定します。

%config(missingok) <file name>
これは、rpmコマンドの -V オプションでチェックした時に、 ファイルが無くてもエラーにならないようにするためのものです。

%attr(<mode>,<owner>,<group>[, dirmode]) <file name>

%filesに列挙するファイルのパーミッションやuser ID、group IDを設定する。 例えば、

%attr(755,root,root) /usr/lib/hoge
とする。一部の属性を省略(書き換えない)したいときには - を使って、
%attr(755,-,root) /usr/lib/hoge
とする。

%attr(755,root,root)
のように( )の中には 3つしか書かないことが多いですが、
%attr(755,root,root,755)
のように 4つ書くこともできます。 4つ目の数字(dirmode)は、 ディレクトリとサブディレクトリのパーミッションになります。

%defattr(<mode>,<owner>,<group>[, dirmode])

それ以降の行に書かれた属性のデフォルト値を設定する。 %attr が出てきた行を除いて、それ以降に書かれたものに共通になります。

%defattr も %attr も何度でも使えます。 次の例だと、/usr/bin/hoge と /usr/lib/hoge は一つ目の %defattr の 755 になり、 /usr/share/locale/ja 以降は二つ目の %defattr の 644 になります。

%defattr(755,-,-)
/usr/bin/hoge
/usr/lib/hoge
%defattr(644,-,-)
/usr/share/locale/ja
/usr/share/locale/lv

%attrと同様、4つ目の数字は、 ディレクトリとサブディレクトリのパーミッションになります。

%verify( ) <file name>

%filesに列挙するファイルについて、rpm -V でパッケージを検証する時に、検証する項目を指定する。

( ) の中には表 II.5-5にあるものが入ります。 複数指定する場合には、, もしくは スペース で区切ります。

表 II.5-5%verify の ( ) の中で指定できるもの
項目 内容
size サイズ
mode パーミッションとファイルの種類
md5 md5 値
rdev デバイスファイルのモードビットなど
link リンク先
user ファイルの所有者 user
group ファイルのグループ group
mtime ファイルの更新時刻 mtime(modification time)

not とすると検証しない項目だけを指定できます。

書き換えることが前提となる設定ファイルなので、ファイルサイズ と md5値 と 更新時刻 は検証する必要がないといった場合には、

%verify(not size,md5,mtime) /etc/hoge.conf
のように指定します。

%defverify( )

それ以降の行に書かれたファイルについて検証する項目を設定します。

%verify と %defverify は、%attr と %defattr と同じような関係です。

%config %attr %verify などは、次のようにスペースを入れることで一つのファイルに複数指定できます。

%config %verify(not size,md5,mtime) /etc/hoge.conf

この%filesの指定は少々面倒なとこかもしれません。 新しくパッケージをつくる場合などは、%install までのスクリプト部を書いたところで、%files以下は何も書かないまま、一度、そのSPECファイルから rpm をbuildしてみるとよいかもしれません。(rpm -bi hoge.spec これについては次節)。 そのあとで、${RPM_BUILD_ROOT}以下にinstallされてるファイルを、find コマンドで見てみて%filesの指定をします。

%filesで書かれていないファイルがある場合には、build 時に

パッケージに未収録のファイルを検査中: /usr/lib/rpm/check-files /var/tmp/hoge-1.1-root
					警告: パッケージに未収録のインストール済みファイルが見つかりました:
と未収録のファイルの名前などが表示されます。 この部分を利用して %files の部分を作成するのもよいでしょう。

ソースのバージョンアップなどで、作成されるファイルが増減したり、ディレクトリが変わったりする場合があります。未収録のファイルがあっても、build が途中で終了せず、パッケージを作成できてしまう場合があるので、build 時のメッセージは必ず確認してください。

II.5.4. パッケージの更新履歴

%changelog以下にパッケージの更新履歴を英語で記述します。最新の更新情報が上にくるように書きます。

例 II.5-8パッケージの更新履歴の例
# 更新履歴
%changelog
* Tue Feb 16 1999 Jun Nishii <jun@vinelinux.org> 1.1-2
- added Japanese messages

* Mon Feb 15 1999 Jun Nishii <jun@vinelinux.org> 1.1-1
- first release for version 1.1

一行目の最初に * を書き、日付と変更を加えた人の名前を書きます。 二行目以降に - を書き、更新内容を書きます。 今日の日付は date コマンドLANG=C date +'%a %b %d %Y' とすると確認できます。 12月1日のように日の部分が一桁の場合は 0 をつけ 01 のようにします。

Vine Linux でのパッケージングルールでは 一行目に日付、パッケージャーの名前、メールアドレス、パッケージのバージョン,、リリース番号を書くことになっています。

* 曜日 月 日 西暦年 パッケージャーの名前 <メールアドレス> バージョン-リリース番号
- 更新内容

更新内容の部分でもマクロは展開され %{name} は hoge になります。 マクロを展開せずにそのまま %{name} と書きたい場合は %%{name} のように % を二つ続けて書いて下さい。

日本語を使うことも可能になっていますが、Summary や description のように環境変数に応じて日本語や英語のどちらかを表示するという仕組みは無いので、 英語だけで書くほうがよいでしょう。

1

Requires で他のパッケージをまとめてインストールしたり、%post, %preun, %postun などで何らかのコマンド処理を行うようなパッケージ。task-gnome や task-tetex などのように task- という名前が使われます。