SPECファイルの記述
いよいよ、パッケージ作成の肝となるSPECファイルの記述について説明します。
SPECファイルの内容は、以下の主要部分に分類できます。
- パッケージ情報
- パッケージの作成やインストール等の手順(スクリプト部)
- インストールされるファイルの一覧
- パッケージの変更履歴
SPECファイルの文字コードはUTF-8にしてください。
SPECファイルの冒頭にパッケージのバージョンなど頻繁に使用されるものをマクロとして定義しておくと後々の修正が楽になります。
%define macro literal
セクション III.8.3 - 標準で定義されているマクロも参照して下さい。
- II.5.1. パッケージ情報の記述
- II.5.2. スクリプト部
- II.5.3. ファイルリスト部
- II.5.4. パッケージの更新履歴
II.5.1. パッケージ情報の記述
rpmコマンドでパッケージに関する問い合わせを実行した場合に表示される情報やパッケージの依存情報などを記述します。
以下にパッケージ情報の記述例を示します。(#を記述すると#から行末までがコメントとして扱われます。)
# 基本情報 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.2. パッケージ作成時に必要となるタグ
- II.5.1.3. 依存情報
- II.5.1.4. 詳しい解説
II.5.1.1. 基本情報
表 II.5-1の情報は、rpm -qiなどでパッケージに関して問い合わせを行った場合に表示されます。
タグ | 内容 |
---|---|
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. パッケージ作成時に必要となるタグ
タグ | 内容 |
---|---|
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のようなタグを使用します。
タグ | 内容 |
---|---|
Requires | 作成しているrpmパッケージが動作するのに必要なパッケージ名 |
BuildRequires | パッケージの作成時に必要となるパッケージ名 |
Conflicts | 共存できないパッケージ名 |
Provides | 作成するパッケージが他のパッケージの代替となる場合、そのパッケージ名を記述 |
Obsoletes | パッケージをインストールする際にアンインストールしたいパッケージ名 |
BuildConflicts | パッケージ作成時にはインストールしておけないパッケージ名 |
<, >, =, >=, <=といった演算子を使うとパッケージのバージョン、リリース番号を限定することもできます。
Requires: ghostscript = 5.10
BuildRequires: gtk2-devel >= 2.16.0
演算子の両側にスペースやタブを入れない場合、パッケージ名からバージョンまでが一つのパッケージ名として認識されてしまいます
例えば、
BuildRequires: gtk2-devel>=2.16.0
複数のパッケージが関係する場合は、カンマ(,)やスペースで区切って列挙したり、複数行に分けて記述できます。複数行に分ける場合は、各行にタグが必要です。
パッケージがいくつかのグループに分類できる場合には、複数行に書いた方がわかりやすくなります。
Requires: ghostscript >= 5.10, ghostscript-fonts, VFlib = 2.24, tetex, tetex-extra
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. スクリプト部
スクリプト部では、パッケージの作成やインストール等の手順を記述します。
# スクリプト部 %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スクリプトとして実行できるように記述します。
各セクション名が現れた時に #!/bin/sh -eが起動され(Vine Linuxでは/bin/shは/bin/bashにsym.linkされてる)、 各環境変数(RPM_SOURCE_DIRやRPM_PACKAGE_NAMEなど)が定義された後、 次のセクション名が出てくるまで、記述されているスクリプトが実行されます。
環境変数の詳細については、セクション III.8.1 - 環境変数を参照してください。
セクション名 | 概要 | 詳細説明 |
---|---|---|
%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セクション
- II.5.2.2. %buildセクション
- II.5.2.3. %installセクション
- II.5.2.4. %checkセクション
- II.5.2.5. %cleanセクション
II.5.2.1. %prepセクション
ソースをビルドする前に実施する準備事項をシェルスクリプトで記述します。
以下で説明する%setup,%patchなどのマクロを用いて、ソースの展開やパッチの適用などを行います。
なお、このセクションの最初で
rm -rf ${RPM_BUILD_ROOT}
- %setup
-
tarでアーカイブされ、 gzipまたはbzip2圧縮されたソースを展開します。 %setupとオプションなしで書くと、以下が順に行われます。
- 第I.2章 - パッケージ作成に必要なディレクトリの準備で指定したディレクトリBUILDにcdする。
- 指定ディレクトリ(-nで指定できる。デフォルトのディレクトリ名は、 ${RPM_PACKAGE_NAME}-${RPM_PACKAGE_VERSION}、後述) がカレント・ディレクトリ(BUILD)に存在すれば消去する。
- Sourceで指定したソースのアーカイブを展開する。
- 指定ディレクトリ(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,...に対して、
と実行することも出来ます。%patchには-b <name> (バックアップ・ファイルの拡張子指定、デフォルトは.orig)などのオプ ションがあります。%patch0 -p1 %patch1 -p1
II.5.2.2. %buildセクション
ソースをmakeするスクリプトの開始であることを示し、また、 %setupで指定したディレクトリにcdするマクロとしてはたらきます。 以下には、makeを行うときの手順をスクリプトとして書きます。
ここでの処理で必要となるパッケージ等は、BuildRequires(build): で指定します。
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.3. ファイルリスト部
%filesはじまる部分で、RPMパッケージに収録するファイル名を列挙します。
# ファイルリスト部 -------------- %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. ドキュメント・ファイルの指定
- II.5.3.2. パッケージに収録するファイルの指定
- II.5.3.3. タグを用いたファイル指定
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) を指定します。
この場合新しいパッケージに入っている設定ファイルは、 .rpmnew をつけた名前で保存されます。 また、アップグレードではなく、同じバージョンをインストールし直した時には、 .rpmorig をつけた名前で保存されます。%config(noreplace) <file name>
存在しなくても問題ないファイルの場合は、 %config(missingok) を指定します。
これは、rpmコマンドの -V オプションでチェックした時に、 ファイルが無くてもエラーにならないようにするためのものです。%config(missingok) <file name>
- %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
のように( )の中には 3つしか書かないことが多いですが、%attr(755,root,root)
のように 4つ書くこともできます。 4つ目の数字(dirmode)は、 ディレクトリとサブディレクトリのパーミッションになります。%attr(755,root,root,755)
- %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 警告: パッケージに未収録のインストール済みファイルが見つかりました:
ソースのバージョンアップなどで、作成されるファイルが増減したり、ディレクトリが変わったりする場合があります。未収録のファイルがあっても、build が途中で終了せず、パッケージを作成できてしまう場合があるので、build 時のメッセージは必ず確認してください。
II.5.4. パッケージの更新履歴
%changelog以下にパッケージの更新履歴を英語で記述します。最新の更新情報が上にくるように書きます。
# 更新履歴 %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 のように環境変数に応じて日本語や英語のどちらかを表示するという仕組みは無いので、 英語だけで書くほうがよいでしょう。
Requires で他のパッケージをまとめてインストールしたり、%post, %preun, %postun などで何らかのコマンド処理を行うようなパッケージ。task-gnome や task-tetex などのように task- という名前が使われます。