Ubuntu 11.04 (Natty) で perl がインストール出来ない場合の理由と対策

追記

perlbrew 最新版では修正済みです。
patchperl にパッチ投げておきました。
perlbrewも最新のpatchperl を使うようになったので、失敗する場合はもう一度perlbrew の最新版を再インストールしてください(perlbrew のバージョン番号は変わってないので注意)
追記終わり

http://d.hatena.ne.jp/Itisango/20110504/1304487042 の原因。

原因 - Ubuntu の math ライブラリ諸々がディレクトリごと移動した

Configure はデフォルトで

/usr/local/lib
/lib
/usr/lib
/usr/lib64

を読みに行くところ、Ubuntu Natty からは libm などのライブラリが

/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu

などに移動しているためリンクできずにリンカがエラーを吐く。

対策

Configure の plibpth にこれらのディレクトリを加えてやれば解決できる。

ライブラリのパスは環境に依存してるので

$ gcc -print-search-dirs | grep libraries | cut -f2 - -d= | tr ':' '\n'

などして確認できる。

おまけ

make test の時に

../lib/User/pwent.t ............................................... ok
../lib/feature/unicode_strings.t .................................. ok
x2p/s2p.t ......................................................... ok

Test Summary Report
-------------------
op/stash.t                                                      (Wstat: 0 Tests: 31 Failed: 0)
  TODO passed:   26
../cpan/Memoize/t/errors.t                                      (Wstat: 11 Tests: 6 Failed: 0)
  Non-zero wait status: 11
  Parse errors: Bad plan.  You planned 11 tests but ran 6.
../ext/ODBM_File/t/odbm.t                                       (Wstat: 32512 Tests: 0 Failed: 0)
  Non-zero exit status: 127
  Parse errors: No plan found in TAP output
../lib/DBM_Filter/t/01error.t                                   (Wstat: 32512 Tests: 3 Failed: 0)
  Non-zero exit status: 127
  Parse errors: Bad plan.  You planned 21 tests but ran 3.
Files=1808, Tests=349977, 930 wallclock secs (73.67 usr 14.43 sys + 511.11 cusr 72.13 csys = 671.34 CPU)
Result: FAIL
make: *** [test_harness] Error 3

のようなエラーが出た場合は libgdbm のリンクに失敗しているため、

$ perlbrew install perl-5.12.3 # もしここで失敗したら
$ cd ~/perl5/perlbrew/build/perl-5.12.3/
$ locate libgdbm | grep o$
/usr/lib/i386-linux-gnu/libgdbm.so
/usr/lib/i386-linux-gnu/libgdbm_compat.so
$ vim ext/ODBM_File/hints/linux.pl

として ext/ODBM_File/hints/linux.pl の条件式をlocate で確認したパスに合わせて次のように書き換える

if (-e '/usr/lib/libgdbm_compat.so' or -e '/usr/lib64/libgdbm_compat.so'
    or -e '/usr/lib/i386-linux-gnu/libgdbm.so' or -e '/usr/lib/i386-linux-gnu/libgdbm_compat.so'
) {

パーミッションが -r--r--r-- なので強制的に上書き。その後、

$ make clean && make && make test
$ make install

すればあら不思議インストールされています。

$ perlbrew list
* perl-5.12.1
  perl-5.12.3
  /usr/bin/perl (5.10.1)

ということでライブラリのパスが変わってしまったために起きた問題でした。