Perlの@INCを指定してビルドする
Perlで「use 何とか;」として外部のモジュールを読み込む場合、Perlの特殊変数である配列@INCにあるパスから探してくれます。ここに任意をディレクトリを追加するには、
- スクリプトで use lib qw(/hoge /foo); とか書く
- httpd.confに SetEnv PERL5LIB /hoge:/foo 、mod_perlの場合は PerlSwitches -I/hoge -I/foo
- 実行時に環境変数PERL5LIBに /hoge:/foo とか設定しておく
といった方法があります。でも、mod_perlと通常のcgiで指定方法が違ったり、cronだと環境変数が適用されなかったり、何かとトラブルの原因になりかねません。
自前のモジュールだったらuse libでいいかなとも思うけど、「CPANモジュールのインストール先を指定する」で書いたみたいにCPANモジュールをユーザディレクトリに入れてたりすると、そこの指定をどうするかが問題。
今の環境で使ってるPerlは、「DBICが入らなくて、CentOS5.1でPerlのRPMリビルドした」で書いたようにSRPMからリビルドした物をRPMで入れてます。せっかくRPM再構築してるんだから、そのへんで何とか出来ないものかとジタバタしてみました。
SPECファイルを見ると、
sh Configure -des -Doptimize="$RPM_OPT_FLAGS" -Dversion=%{perlver} -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc='%{__cc}' -Dcf_by='Red Hat, Inc.' -Dinstallprefix=%{_prefix} -Dprefix=%{_prefix} %ifarch %{multilib_64_archs} -Dlibpth="/usr/localib64 /lib64 /usr/lib64" \ -Dprivlib="/usr/lib/perl5/%{version}" -Dsitelib="/usr/lib/perl5/site_perl/%{version}" -Dvendorlib="/usr/lib/perl5/vendor_perl/%{version}" -Darchlib="%{_libdir}/perl5/%{perlver}/%{_arch}-%{_os}%{thread_arch}" -Dsitearch="%{_libdir}/perl5/site_perl/%{perlver}/%{_arch}-%{_os}%{thread_arch}" -Dvendorarch="%{_libdir}/perl5/vendor_perl/%{perlver}/%{_arch}-%{_os}%{thread_arch}" %endif -Darchname=%{_arch}-%{_os}
こんなブロックが。ここ怪しい。
んで、libpthを増やしてみたり、あれこれやったけど無理。Perlのソースを拾ってきて、Configureを覗いてみると「otherlibdirs」なんてそれっぽくない? ここにコロン区切りでパスを追加していくとよさそう。ググっても何かそれっぽいこと書いてある。
-Dsitearch="%{_libdir}/perl5/site_perl/%{perlver}/%{_arch}-%{_os}%{thread_arch}" -Dvendorarch="%{_libdir}/perl5/vendor_perl/%{perlver}/%{_arch}-%{_os}%{thread_arch}" -Dotherlibdirs="/home/hoge/CPAN/lib/perl5:/home/hoge/CPAN/lib64/perl5/site_perl/5.8.8:/var/www/pm" %endif -Darchname=%{_arch}-%{_os}
てな具合に、vendorarchの次の行を追加してrpmbuild。でRPMを再インストールしたら、otherlibdirsに書いたパスが最初から@INCに入ってくれてます。やった。
この@INCのデフォルト値の変更って、結構需要はありそうな気がするんだけど、ググってもなかなか情報が見付からなかった。皆どうしてるんだろ。