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