読者です 読者をやめる 読者になる 読者になる

tkuchikiの日記

Linux やプログラミングについて書きます。

PhantomJS 1.10 の RPM を生成できない場合の対処法

Linux PhantomJS RPM

git checkout 1.9 をしないで、master の PhantomJS 1.10(development) を rpmbuild する際の手順です。
1.9 では、問題ありませんでした。

Build | PhantomJS

の手順で、RPM の作成まで行おうとしたところ、

$ ./mkrpm.sh phantomjs
=> Copying sources...
=> Creating source tarball under /tmp/tmp.A71VPm58dp/SOURCES...
=> Building RPM...
cp: missing destination file operand after `/tmp/'
Try `cp --help' for more information.

cp できなくて、rpmbuild がこけました。

デバッグのため、mkrpm.sh を以下のように修正して実行してみると、

- rpm=$(rpmbuild --define "_topdir ${topdir}" --buildroot ${buildroot} --clean -bb  ${name}.spec 2>/dev/null | \
+ rpmbuild --define "_topdir ${topdir}" --buildroot ${buildroot} --clean -bb ${name}.spec
*******************************************************************************
*
* WARNING: 'check-rpaths' detected a broken RPATH and will cause 'rpmbuild'
*          to fail. To ignore these errors, you can set the '$QA_RPATHS'
*          environment variable which is a bitmask allowing the values
*          below. The current value of QA_RPATHS is 0x0000.
*
*    0x0001 ... standard RPATHs (e.g. /usr/lib); such RPATHs are a minor
*               issue but are introducing redundant searchpaths without
*               providing a benefit. They can also cause errors in multilib
*               environments.
*    0x0002 ... invalid RPATHs; these are RPATHs which are neither absolute
*               nor relative filenames and can therefore be a SECURITY risk
*    0x0004 ... insecure RPATHs; these are relative RPATHs which are a
*               SECURITY risk
*    0x0008 ... the special '$ORIGIN' RPATHs are appearing after other
*               RPATHs; this is just a minor issue but usually unwanted
*    0x0010 ... the RPATH is empty; there is no reason for such RPATHs
*               and they cause unneeded work while loading libraries
*    0x0020 ... an RPATH references '..' of an absolute path; this will break
*               the functionality when the path before '..' is a symlink
*
*
* Examples:
* - to ignore standard and empty RPATHs, execute 'rpmbuild' like
*   $ QA_RPATHS=$[ 0x0001|0x0010 ] rpmbuild my-package.src.rpm
* - to check existing files, set $RPM_BUILD_ROOT and execute check-rpaths like
*   $ RPM_BUILD_ROOT=<top-dir> /usr/lib/rpm/check-rpaths
*
*******************************************************************************
ERROR   0002: file '/usr/bin/phantomjs' contains an invalid rpath '/usr/local/src/phantomjs-1.9/src/qt/lib' in [/usr/local/src/phantomjs-1.9/src/qt/lib]
error: Bad exit status from /var/tmp/rpm-tmp.IQMf9c (%install)

RPM build errors:
    Bad exit status from /var/tmp/rpm-tmp.IQMf9c (%install)

のようなエラーがでました。
このエラーが出ていた場合は、RPM のビルド環境を整えるときの Tips | Carpe Diem に書いてある手順で対応できます。
以前、引っかかった時にお世話になりました。ありがとうございます。

以下では、3つの解決方法を示します。

QA_RPATHS を設定する

エラーメッセージに書いてあるとおり、

QA_RPATHS=$[ 0x0002 ]

をつけて実行すれば、
check-rpaths のエラーを回避できます。
したがって、以下のように mkrpm.sh を修正して実行すれば rpmbuild に成功します。

- rpm=$(rpmbuild --define "_topdir ${topdir}" --buildroot ${buildroot} --clean -bb ${name}.spec 2>/dev/null | \
+ rpm=$(QA_RPATHS=$[ 0x0002 ] rpmbuild --define "_topdir ${topdir}" --buildroot ${buildroot} --clean -bb ${name}.spec 2>/dev/null | \

.rpmmacros の %__arch_install_post を無効にする

$HOME/.rpmmacros の、

%__arch_install_post   /usr/lib/rpm/check-rpaths   /usr/lib/rpm/check-buildroot

を削除するか、コメントアウトすれば check-rpaths が走らないので、
同様に回避できます。

spec ファイルで %__arch_install_post を無効にする

phantomjs.spec に以下を追記する方法もあります。

%undefine __arch_install_post

この方法だと、.rpmmacros に %__arch_install_post が書いてあったとしても、
rpmbuild 実行時にそれを無効にするので、
第三者にrpmbuild してもらう際に、QA_RPATHS を設定したり、%__arch_install_post をコメントアウトする必要がないので楽になります。

mkrpm.sh を再度実行

いずれかの修正を加えた上で、もう一度実行すると rpmbuild に成功します。

$ ./mkrpm.sh phantomjs
=> Copying sources...
=> Creating source tarball under /tmp/tmp.csVFRJRG6l/SOURCES...
=> Building RPM...
/tmp/phantomjs-1.9-1.x86_64.rpm

生成される rpm は 1.9-1 になっていますが、インストールすると 1.10 になっています。

まとめ

check-rpaths でエラーが出た際には、上記の方法で解決できます。
ただ、check-rpaths を無効にすることの是非についてはなんともいえないところがあります...