RPM のビルド環境を整えるとき、先日紹介した rpmdevtools を使うと、とても簡単に RPM のビルド環境を作ることができます。
具体的には、rpmdevtools に含まれている rpmdev-setuptree というコマンドを実行するだけです。
$ /usr/bin/rpmdev-setuptree
そうすると、$HOME/rpmbuild ディレクトリが作成され、次のような $HOME/.rpmmacros ファイルが作成されます。
次のファイルは、CentOS 5.3 x86_64 のときに作成される .rpmmacros です。
%_topdir %(echo $HOME)/rpmbuild
%_smp_mflags -j3
%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
この設定で RPM をビルドすると、RPM を作成する直前に rpmdevtools に含まれている check-rpaths と check-buildroot というコマンドが実行されるようになっています。
自分で RPM をビルドしてみると、パッケージによって次のようなエラーが発生することがあります。
ERROR 0004: file ‘/usr/libexec/tcawmgr.cgi’ contains an insecure rpath ‘.’ in [/lib:/usr/lib:/usr/lib64:/home/neoad/lib:/usr/local/lib:/usr/lib64:.]
error: Bad exit status from /var/tmp/rpm-tmp.4888 (%install)
このエラーは、check_rpath という実行ファイルやシェルスクリプトなどに含まれているパスをチェックするプログラムですが、このプログラムの実行でエラーになってしまいます。
例えば、次のようなエラーが表示されます。
「WARNING: ‘check-rpaths’ detected a broken RPATH and will cause ‘rpmbuild’」
このエラーを回避する方法を調べたところ、Packaging Guidelines : Fedora というページに書かれていました。このページによれば、/etc/ld.so.conf.d に自分専用の設定ファイルを作成して、その中にパスを記述するように説明がありました。さっそくやってみたのですが、エラーを回避することができませんでした。
check-rpath のエラーをよく見てみると、次のように実行すればよいという説明がありました。
$ QA_RPATHS=$[ 0x0001|0x0010 ] rpmbuild -ba $HOME/rpmbuild/SPECS/foo.spec
QA_RPATHS という変数に指定されたビットマスク値を指定すると回避できるようです。QA_RPATHS のビットマスク値は、次のような意味になります。
0×0001: 標準の RPATH(例えば /usr/lib) を含めます
0×0002: 無効な RPATH を許可します、これはセキュリティ的なリスクを含みます
0×0004: セキュアでない RPATH を許可します、これはセキュリティ的なリスクを含みます
0×0008: 特別な $ORIGIN で指定された RPATH を末尾に追加します
0×0010: RPATH を空にします
0×0020: ‘..’ のような相対パスを許可します
どうも、check-rpath というのは RPM をビルドする前にプログラムで指定されているパスをチェックして不正なパスがないかどうかチェックするプログラムのようです。
さきほどのエラーを回避するには、次のようなコマンドを実行します。
$ QA_RPATHS=$[ 0x0001|0x0002|0x0004 ] rpmbuild -ba $HOME/rpmbuild/SPECS/foo.spec
これで check-rpath でエラーを回避することはできたのですが、この方法ではそもそも check-rpath を使うように設定している意味もないので、$HOME/.rpmmacros を次のように書き換えて check-rpath を実行しないようにしました。ついでにデバッグ情報付きの RPM も作成しないように設定してあります。
— .rpmmacros-orig 2009-10-14 21:18:24.000000000 +0900
+++ .rpmmacros 2009-10-14 21:37:04.000000000 +0900
@@ -1,3 +1,4 @@
%_topdir %(echo $HOME)/rpmbuild
%_smp_mflags -j3
-%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
+%__arch_install_post /usr/lib/rpm/check-buildroot
+%debug_package %{nil}
実はこの設定変更を前に行ったことを忘れていて、新しいサーバに RPM のビルド環境を作ったのですが、かなりはまったので備忘録として残しておきます。
# 2009.11.9 追記
- 具体的なエラーメッセージを追加しました






