環境・前提
- OSはCentOS 6.8。
- ソースからrpmbuildしたhttpd-devel 2.4.23をyum installしようとしたが「/usr/local/bin/perlが必要」と言われinstallに失敗。
- ローカル環境には /usr/local/bin/perl は存在する(/usr/bin/perl のシンボリックリンク)。ローカル環境にないと言われているのではなく、yumのinstall済みパッケージに /usr/local/bin/perl を提供すると言っているやつがいないということのよう。
- yum deplist httpd-devel で依存するものを調べると、CentOS レポジトリの httpd-devel 2.2系は同じperlパッケージを要求するがパスは /usr/bin/perl になっている。
- ググると rpm --nodeps で依存性を無視してinstallするという手順が見つかったが、それだと何か気持ち悪い。
- rpmbuild のどこかの過程で perl のパスを規定しているはず。specファイルでうまく環境変数を規定するか、または何らかのパッチをつくって当てれば何とかなるはず。
結論
- $SOURCE/build/install-bindist.sh.in を見ると環境変数 PATH の各ディレクトリをスキャンし perl5 か perl がないかを探していた。
- 最初に見つかったものをパスとして定義するので、PATH の中で /usr/local/bin が /usr/bin より先にあると /usr/local/bin/perl がセットされてしまうよう1。
- spec ファイルの configure するステップの直前で PATH 変数中の /usr/local/bin を一番後ろに持って行く処理を入れて rpmbuild し署名すると、問題なく yum install できるようになった。
httpd.spec
(前略)
# 現在のPATHをバックアップ
PATHBAK=$PATH
# /usr/local/bin: を見つけたら除去し、末尾に :/usr/local/bin をくっつける
PATH=`echo $PATH | sed -e 's/^\(.*\)\(\/usr\/local\/bin:\)\(.*\)/\1\3:\2/'`
%configure \
(中略)
%post
# Register the httpd service
/sbin/chkconfig --add httpd
/sbin/chkconfig --add htcacheclean
# 一応PATHを戻しておく
PATH=$PATHBAK
(後略)
$ pwd
/home/user/rpmbuild/SPECS
$ rpmbuild -ba httpd.spec
$ rpm --resign httpd-{,-devel,-manual,-tools}-2.4.23-n.x86_64.rpm
※ n は httpd.spec で規定した release 番号、x86_64 部分はアーキテクチャに依存
$ cd /var/www/html/rpmrepo/RPMS/x86_64
$ createrepo .
$ yum clean all
$ yum install httpd-devel
※ httpd が既に install されている場合、httpd-devel は同じバージョンの httpd
を要求するので先に update しておく必要あり