11.2. %postセクション

RPMパッケージをインストールするとき、パッケージの展開後に行うことを書く。

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

例11.1 %postセクションを利用してinfoファイルをインストールする例

%post
if [ "$1" = 0 ] ; then
%{_syssbindir}/install-info %{_infodir}/hoge.info.gz %{_infodir}/dir
fi

として、info のメニューエントリに infoファイルを追加します。 if [ $1 = 0 ]; then と fi の行は、 アップグレード時には実行せず、インストール時だけに実行させるための記述です。 「シンボリック・リンク等を%postとかで張らない」も参照してください。

%{_syssbindir}/install-info というコマンドが必要になるので、 Requires(post): %{_syssbindir}/install-info とします。

info ファイルは、アンインストール時にも処理が必要になります。 「%preunセクション」 も参照してください。


例11.2 ライブラリをインストールする後にldconfigを実行する例

%post
%{_syssbindir}/ldconfig

とすると、ldconfigが実行される。また、代わりに

%post -p %{_syssbindir}/ldconfig

と、-pオプションを用いて書くと、 シェルを起動すること無く直接コマンドが実行される。 またこのコマンドはrpmパッケージのインストール時に必要なコマンドとして、 Requires(interp): %{_syssbindir}/install-info として登録される。

正確にいうと、タグに -pオプションをつけた場合は、 /bin/sh ではなく別のプログラムでスクリプト部分を解釈(interpret)させるということになります。 この場合には Requires(interp) として登録されます。(%postなので Requires(post) としても登録されます。)


例11.3 %postセクションで-pオプションを使用して問題が起こる例

%post -p %{_syssbindir}/ldconfig
# update ld.so.cache

%files

この場合は %post と %files の間の2行が、スクリプト部分になります。 一行目に

# update ld.so.cache

と書いてあります。 bash であれば、# で始まる行は コメントと解釈され無視されますが、 このスクリプト部分を読み、実行するのは /bin/sh ではなく %{_syssbindir}/ldconfig です。 ldconfig には # 以降をコメントとして無視するというルールは無いので、 そのまま実行しようとしてエラーになります。

エラーを起こさないようにするには

%post -p %{_syssbindir}/ldconfig


%files

とするか、

%post
%{_syssbindir}/ldconfig
# update ld.so.cache

%files

とします。

一つ目の例では、%{_syssbindir}/ldconfig がスクリプト部分を実行するために起動し(、起動した時点で ld.so.cache が更新されますが)、スクリプト部分については何も書かれていないので何もせずに終了します。

二つ目の例では、/bin/sh が起動し、スクリプト部分を解釈し %{_syssbindir}/ldconfig を実行、# 以下はコメントなので無視します。