FC6のperlをアップデートした

redhat系のperl5.8.8にあてられているパッチのせいで動作が遅いという件に対応したのでメモ。

ずっとスルーしてたんだけどDBIx::Class::Cursor::Cachedを入れたら新しいDBIx::ClassがインストールされてしまいCatalystのテストサーバーを起動するたびに警告メッセージが出るようになったのでこの機会に対応することにしたという経緯。
でも実はrpmコマンドとかもよくわからず、「なんかrpmをインストールしたり、インストール済みのrpmを調べたりできるらしい」くらいしか知らなかった。そんな具合なので「該当のpatchをコメントアウトしてrpmをbuildする」と言われても具体的なやり方がわからないのでこの機会にrpmのキホンも学んだ。ついでにcpioというコマンドも学んだ。

で、いろいろとググったページを参考にしながら以下のようにしました。

$ sudo yum install rpmdevtools
$ /usr/bin/fedora-buildrpmtree
$ rpm -ivh http://ftp.riken.go.jp/Linux/fedora/core/6/source/SRPMS/perl-5.8.8-10.src.rpm
$ cd rpmbuild/SPECS
$ cp perl.spec perl.spec.orig
$ vi perl.spec
$ diff -u perl.spec perl.spec.orig
--- perl.spec   2007-12-20 17:10:02.000000000 +0900
+++ perl.spec.orig      2007-12-20 17:09:45.000000000 +0900
@@ -160,8 +160,8 @@
 Patch27116:    perl-5.8.8-U27116.patch
 Patch27391:     perl-5.8.8-U27391.patch
 Patch27426:    perl-5.8.8-U27426.patch
-#Patch27509:     perl-5.8.8-U27509.patch
-#Patch27512:     perl-5.8.8-U27512.patch
+Patch27509:     perl-5.8.8-U27509.patch
+Patch27512:     perl-5.8.8-U27512.patch
 Patch27604:     perl-5.8.8-U27604.patch
 Patch27605:     perl-5.8.8-U27605.patch
 Patch27914:     perl-5.8.8-U27914.patch
@@ -367,9 +367,9 @@

 %patch27426 -p1

-#%patch27509 -p1
+%patch27509 -p1

-#%patch27512 -p1
+%patch27512 -p1

 %patch27604 -p1
$ rpmbuild -ba SPECS/perl.spec
$ sudo rpm -Uvh --force RPMS/i386/perl-5.8.8-10.i386.rpm
$ sudo perl -MCPAN -e shell
cpan> force install Scalar::Util

最後にScalar::Utilをforce installしてるのは、インストールされてるのが最新版の1.19なんだけどXS版じゃないらしくweaken()が実装されてないのでインポートしようとするとエラーになるため入れ直す必要があるから。
エラーメッセージは

weaken references are not impremented in the version of perl

というようなやつで、これはScalar::Utilが出してる。どうやって出してるかというとExporterを使ってる場合、export_fail()というメソッドを実装しておくとインポートできなかったメソッド名のリストを引数にして読んでくれるので、ここでそれを無視するかどうかとかを処理できるみたい。初めて知った。

The Exporter will call an export_fail method with a list of the failed symbols
...
If the export_fail method returns an empty list then no error is recorded and all the requested symbols are exported. If the returned list is not empty then an error is generated for each symbol and the export fails.
http://search.cpan.org/~ferreira/Exporter-5.62c/lib/Exporter.pm

以上

いろいろ参考にしまくってるのでリンクはしませんが、ありがとうございました!

やっぱ問題の現象について自分なりに言葉にしておく。

overloadされているクラスを再blessするとoverloadフラグが立たないというperlのバグがあって、これに対応するためのパッチというのがあるんだけどパッチを適用すると動作がとても遅くなる。

ということでいいのかな。で、perl 5.9.4で直ったってことですね。