5.3. ファイルリスト部

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

例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パッケージを作るときに、 「スクリプト部」で設定した一連のスクリプトを実行した後、 ${RPM_BUILD_ROOT}をとみなして%files以下で指定されたファイルを回収し、 それを指定位置にinstallするようなRPMパッケージをつくります。

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

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

%doc doc/

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

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

  • 個別ファイルはそのまま指定。(/usr/bin/hoge.bin など)

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

  • ワイルドカードも使えます。(/usr/hoge/* など)

警告

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

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

とする。このタグを用いることによって、 root権限を持ってない人もrpmのパッケージ化を行える。

%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 でパッケージを検証する時に、検証する項目を指定する。

( ) の中には表5.5「%verify の ( ) の中で指定できるもの」にあるものが入ります。 複数指定する場合には、, もしくは スペース で区切ります。

表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 時のメッセージは必ず確認してください。



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