specファイル

specファイルは、アプリケーションのソースファイル群からrpmパッケージを作成するための指示を記述したファイルである。アーカイブファイル(パッケージ名-バージョン.アーキテクチャ.tar.gzのようなファイル)を展開すれば、中にパッケージ名.specファイルが既に用意されている場合はrpmbuild -bb パッケージ名.specを実行すればrpmバイナリパッケージが作成される。なければ、specファイルを作る必要がある。

概要

specファイルには以下の各項目を記す。

Summary: 概要(例:PHP: Hypertext Preprocessor)
Name: パッケージ名(例:php)
Version: バージョン番号(例:7.2.5)
Release: リリース番号(例:1%{?dist})
Group: パッケージのカテゴリ(例:Development/Languages)
Source: ソースのダウンロード元URL(例:http://jp2.php.net/distributions/php-%{version}.tar.bz2)
URL: パッケージのトップページURL(例:http://www.php.net/)
BuildRoot: RPMのビルド作業を行う際に使うディレクトリ(例:%{_tmppath}/%{name}-%{version}-root)

%description
パッケージの説明

%prep
%setup
%build
%install
%clean
%files
パッケージに含めるファイルの一覧
%changelog
変更履歴

既定の変数

rpmbuild --showrcコマンドで確認できる。

変数名 Linux(RHEL5、CentOS5)での一般的な値
_prefix /usr
_exec_prefix /usr
_sysconfdir /etc
_lib lib(64bit環境ではlib64
_datadir %{_prefix}/share = /usr/share
_bindir %{_exec_prefix}/bin = /usr/bin
_mandir %{_prefix}/share/man = /usr/share/man
_sbindir %{_exec_prefix}/sbin = /usr/sbin
_libdir %{_exec_prefix}/%{_lib} = /usr/lib(64bit環境では/usr/lib64
_includedir %{_prefix}/include = /usr/include

定数定義(define)

specファイル中で使う値を最初に定義しておくのに用いる。 バージョン番号や、環境に依存するパスなどの定義などに使われる。

例:apache 2.2.18 同梱の httpd.spec
%define contentdir /var/www
%define suexec_caller apache
%define mmn 20051115
%define mpms worker event

定義した定数を参照するには%{定数名}の形で記述する。この部分は定義されている実際に値に置き換えて処理が行われる。

例:molscript
%define version 2.1.2
%define name    molscript
%define release 1

Name: %{name} ←「molscript」に置き換えて処理される
Version: %{version} ←「2.1.2」に置き換えて処理される
Release: %{release} ←「1」に置き換えて処理される
Summary: A program for displaying molecular 3D structures

Group:  Applications/Multimedia
License: GPLv2+
URL:    http://www.avatar.se/molscript/ 
Source0: http://www.avatar.se/molscript/molscript-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

メイン部分

Nameタグ

Nameタグにはパッケージの正式名を記述します。Nameタグに指定する値には空白を含むことはできませんが、ハイフンは含んでも構いません(versionタグやreleaseタグにはハイフンを含むことができないのとは異なります)。またハイフン以外の算術演算子(<>=)は将来のrpmバージョン用に予約されているため含めるべきではありません。

既定のサブパッケージの名前は「メインパッケージ名-サブパッケージ名」となります。もしこのサブパッケージ名を別の値に設定したいのであれば、%package タグに -n 引数を付け、サブパッケージ名全体を指定して下さい。

例:apache 2.2.18 添付の httpd.spec
# メインパッケージ名(httpd)
Name: httpd
# サブパッケージ名(httpd-manual)
%package manual
# サブパッケージ名(mod_ssl)
%package -n mod_ssl
    

Groupタグ

/usr/share/doc/rpm-XXX/GROUPS(XXXはバージョンを示す数値)に指定可能な値のリストが記載されている。この中から一つ選ぶ。

パッケージの説明

メインセクションのSummaryタグにはパッケージの概要を50文字程度以内で記述します。以前は「Description」タグが使用されていましたが、将来サポート対象から外される予定になっているので、Summaryタグに変更して下さい。より詳細な説明は「%description」セクションに記述します。サブパッケージについても同様で、「%package」セクションの Summaryタグに短い説明を、「%description サブパッケージ名」に詳細な説明を記述します。

例:apache 2.2.18 添付の httpd.spec
Summary: Apache HTTP Server

%description
Apache is a powerful, full-featured, efficient, and freely-available
Web server. Apache is also the most popular Web server on the
Internet.

%package manual
Summary: Documentation for the Apache HTTP server.

%description manual
The httpd-manual package contains the complete manual and
reference guide for the Apache HTTP server. The information can
also be found at http://httpd.apache.org/docs/.
  

「%description」セクションには自由に文章を記述できますが、2点注意すべき点があります 1つは書式整形に関することで、行頭文字が空白になっている行は「整形済み」と判断され記述されたままの書式で用いられます。もう一つは段落に関することで、行頭が空白ではない隣接した行は同一の段落として、glintあるいはその他のRPMツールによって整形処理されます。

準備(prep)

バイナリの展開、パッチの適用を行う。

ここでは%setupがよく用いられる。%setupは以下のことを行う[7]

1. ビルドディレクトリを変更する
通常/usr/src/redhat/BUILD
2. ソースファイルを展開する

このマクロは少なくとも一つのソースファイルが、ビルドディレクトリ配下に必要なサブディレクトリを作ることを想定しています。サブディレクトリの名前はtelnet-1.0.1のようにパッケージ名とバージョンで構成されます。

-a 数値
ディレクトリ変更に、数値指定された番号を持つソースだけを解凍します。例えば-a 0と指定すれば、source0:に指定されたソースだけをビルドディレクトリに解凍します。
-b 数値
ディレクトリ変更に、数値指定された番号を持つソースだけを解凍します。例えば-b 0と指定すれば、source0:に指定されたソースだけを解凍してから、ビルドディレクトリに移動します。
-c
解凍する前にディレクトリを作成します。解凍の過程でディレクトリを作成しないようなソースを使う場合に使用します。
-d ディレクトリ名
ビルドディレクトリ配下に作成するサブディレクトリのディレクトリ名を指定します。
-q
出力を最小限にして実行します。
-T
自動的にアーカイブを解凍しないようにします。

パッチの指定(patch)

RPMソース修正スクリプト(patch)の書き方の方法に従って作成したパッチファイルを指定する[9]

【例】Patch0で指定したパッチファイルを適用する
Patch0: %{name}-%{version}.patch
...
%patch0 -p0

-pは、パッチファイル中に記述されたパスのうち上位パスを何段階除去するかを指定する。パッチ適用対象ファイルのあるディレクトリでパッチを作成したのであれば除去は必要ないので0段階(-p0)を指定する。

コンパイルなど(build)

./configure や make などを行う。

インストール(install)

make install などを行う。

パッケージ展開後の処理(post)

パッケージ展開後に行うことを書く。

ビルド後の後片付けをする(clean)

ファイル一覧(files)

インストールされる際、コピーされるファイル(仮想インストール環境に作成されたファイル)を全て指定する。記述すべきファイルリストを得るには、./configuremakeを行うと作成されるMakefileの挙動を追う1。あるいは、一旦filesの記述を行わずにrpmbuild -biなどを実行し、エラーメッセージ「インストール済み(ただし未伸張)ファイルが見つかりました」に表示されるファイル群をfilesに記述していく[5]。files内に記載する項目についていくつか記す[6]

%defattr(ファイルモード,所有ユーザ,所有グループ,ディレクトリのモード)
既定のモード、所有者を設定する。files内で何度でも使える。設定は次に%defattrが登場するまでの各行で有効。%attrがある行のみ%attrの設定が優先される。モードは755のように数値で指定。モード所有者を変更しない場合は"-"を記す。
%attr(ファイルモード,所有ユーザ,所有グループ,ディレクトリのモード) ファイル名
指定したモード、所有者で指定したファイルをパッケージに含める。files内で何度でも使える。モードは755のように数値で指定。モード所有者を変更しない場合は"-"を記す。
%dir ディレクトリ名
指定したディレクトリだけをパッケージに含める。%dir をつけないとサブディレクトリ以下もパッケージに含まれる。
%config ファイル名

設定ファイルであることを示す。ファイルが書き換えられていた場合の動作は以下の通り[10]

表記 既存ファイル パッケージからのファイル 備考
ファイル名 (削除) ファイル名 ファイルが既に存在するかどうか関係なく常にパッケージ側のファイルが書き込まれる。
%config ファイル名 ファイル名.rpmsave ファイル名 編集されたファイルは「.rpmsave」が末尾に付加された名前に変更され、RPMパッケージからのファイルが書き込まれる。
%config(noreplace) ファイル名 ファイル名 ファイル名.rpmnew RPMパッケージからのファイルは「.rpmnew」が末尾に付加された名前に変更され、編集されたファイルが書き込まれる。

トラブルシューティング

error while loading shared libraries: xxxx.so: cannot open shared object file: No such file or directory

原因
共有ライブラリが見つからない。
発生ステップ
%install(make install相当)
対処
LD_LIBRARY_PATH_BAK=${LD_LIBRARY_PATH} # 現在の値を退避
(インストール処理)
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH_BAK} # 元の値を書き戻す
unset LD_LIBRARY_PATH_BAK # バックアップ変数削除

アルファベット順インデックス

b

d

f

p

s

u