Win32にEncode::Detectを入れる(2)
以前のエントリは手作業が多くてややこしかったので、もう少し自動化。Win32::InternetShortcutがAPIの都合でXSからの変換を明示的にC++にしないとVCでインストールできなかったので、あれこれ調べた成果ともいう。
1) CPANからtarballを落として解凍
これは前回と同じ。http://search.cpan.org/dist/Encode-Detect/
2) VC98の人はDetector.xsを編集
最新版の人はいらないそうですが、Detector.xsの冒頭にある extern "C" { と対応する } を削除。
extern "C" {#define PERL_NO_GET_CONTEXT /* we want efficiency */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h"}
3) Makefile.PLを書く
今回はひとつだけでいいです。
use strict; use ExtUtils::MakeMaker; use File::Copy; use File::Path; unlink "MANIFEST"; mkpath('lib/Encode/Detect'); move('Detect.pm', 'lib/Encode/Detect.pm'); move('Detector.pm', 'lib/Encode/Detect/Detector.pm'); move('Detector.xs', 'src/Detector.xs'); move('typemap', 'src/typemap'); open my $fh, '>', './src/Makefile.PL'; print $fh <<'_END_OF_MAKEFILE_'; use strict; use ExtUtils::MakeMaker; WriteMakefile( NAME => 'Encode::Detect::Detector', VERSION_FROM => '..\lib\Encode\Detect\Detector.pm', INC => '-I..\include -I.', XS => { 'Detector.xs' => 'Detector.cpp' }, OBJECT => '$(O_FILES)', ); sub MY::xs_c { return <<'_EOT_'; .xs.cpp: $(PERL) -I$(PERL_ARCHLIB) -I$(PERL_LIB) $(XSUBPP) $(XSPROTOARG) $(XSUBPPARGS) $*.xs >xstmp.c && $(MV) xstmp.c $*.cpp _EOT_ } _END_OF_MAKEFILE_ WriteMakefile( NAME => 'Encode::Detect', VERSION_FROM => 'lib\Encode\Detect.pm', PREREQ_PM => {'Data::Dump' => 0}, DIR => ['src'], );
4) あとは通常通り
perl Makefile.PL → nmake → nmake test → nmake install