Win32にEncode::Detectを入れる
このエントリのフォロー記事が http://d.hatena.ne.jp/charsbar/20060622/1150903898 にあります。
先日Plaggerの推奨モジュールとなったEncode::Detect。
This module provides an interface to Mozilla's universal charset detector, which detects the charset used to encode data.
とのことで、多少のクセはあるものの判定精度はなかなかよろしいらしいのですが、なにせCPAN Testersのうち無事にインストール成功したのはたったの3人。Linuxユーザ含めて11人が失敗していて、バグレポートもあがっているのに半年近く更新されていないのですから個人的にはあまり使う気にならんのだよなあと、思いつつも、やっぱり気にはなるので例によってWinマシンにインストールしようとして、あえなく玉砕。
ふだんならここで悪態のひとつもついておしまいにしてしまうところなのですが、c++のソース読んでも特別けったいなことをしているでなし、なんでこれが入らないのかという思いが捨てきれなかったので、あれこれ試して、ようやく一手間かければVC98でも問題なく入ることを確認したので以下その手順など。
1) とりあえずtarballを落としてくる
Debianならapt-getせんでもCPANから素直に入りますし、Cygwin環境でも事前にある程度準備ができていればすんなり入るようなのですが、ActivePerl+VC98だとその辺期待薄なので手作業で。
2) Module::Build関係のファイルを消す
うまいことすればMBでも入るのかもしらんですが、よくわからなかったのでとりあえず消す。ついでにMANIFESTも消しておく。
3) いくつかのファイルの配置を変える
lib/Encode/Detect.pm lib/Encode/Detect/Detector.pm src/Detector.xs src/include/...
てな具合に移動しておく。
4) Makefile.PLを書く
use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Encode::Detect', VERSION_FROM => 'lib/Encode/Detect.pm', DIR => ['src'], );
もちろん面倒でなければAUTHORとかABSTRACTの指定もするよろし。
5) src/Makefile.PLを書く
use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Encode::Detect::Detector', VERSION_FROM => '../lib/Encode/Detect/Detector.pm', INC => '-Iinclude', OBJECT => '$(O_FILES)', XS => {'Detector.xs' => 'Detector.cpp'}, );
あらかじめ書いておくと、この辺の指定はいろいろ過不足ありそう。
DIR設定しているのでこれだけでsrc/Makefile.PLの方も処理されます。
7) xsubppで事前にxsをcに変換しておく
cd src xsubpp -typemap (ActivePerlのインストール先)\lib\ExtUtils\typemap -typemap typemap Detector.xs > Detector.cpp
これと次の8についてはMakefile.PLを正しく書けば自動的にしてくれそうなものなんですが、うまくいかなかったのでとりあえず応急処置として。
8) 生成されたDetector.cppを編集
コメントをスキップして、コード冒頭の
extern "C" { #define PERL_NO_GET_CONTEXT /* we want efficiency */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" }
のextern "C" {}をはずす。
9) nmake → nmake test → nmake install
VCの環境設定さえ間違っていなければ、あとはこれで入るはず。
最近のVCならまた違うのかなあとか思わんでもないですが、なんにせよいちばん参考になったのはTemplate-ToolkitのMakefile.PLでした、ということで。