昨日紹介した「正しいPerl/CGIの書き方」を読んで自分でもモジュールを作ろうとしたのが、見事にはまった。
module-starter --module=My::Module
とかやっても、Unknown placeholder <MAIN PM FILE> in Makefile.PL と怒られてしまうのだ。
[とりあえず自分の環境]
- FreeBSD 5.4 レガシーでスマン
- Module::Starter::PBPをcpanシェルで普通にインストール。
とりあえず何がいかんのか調べた。が、google先生に聞いても特にそれっぽい記事が無し。同じような現象ではまってる人がいたのを確認できたぐらい。オレの環境がまずいのか?オレが悪いのか?
とりあえずこのままじゃ先にすすまんのでModule::Starter::PBPのソースを見てみる。
131 $text =~ s{<([A-Z ]+)>} 132 { $context_ref->{$1} 133 || die "Unknown placeholder <$1> in $rel_file_path\n" 134 }xmseg;
エラーメッセージを見る限り、ここで死んでますな。この文を含んでいる関数:_load_and_expand_templateがどこで呼び出されてるのか見てみる。色々hitしたが、Makefile.PLの生成でこけているので以下の部分だろう。
23 sub Makefile_PL_guts { 24 my $self = shift; 25 my %context = ( 26 'MAIN MODULE' => shift, 27 'MAIN PM FILE' => shift, 28 'DATE' => scalar localtime, 29 'YEAR' => $self->_thisyear(), 30 ); 31 32 return $self->_load_and_expand_template('Makefile.PL', \%context); 33 }
MAIN PM FILEがちゃんと定義されてるジャン、と思って試しにprintf STDERR $context{'MAIN MODULE'} . "\n";とやってdumpしてみたが中身が空でうまく渡ってないようだ。Makefile_PL_gutsをこのパッケージ内では呼んでないので継承元のModule::Starter::Simpleを見てみる。
ドキュメントにはMakefile_PL_guts( $main_module, $main_pm_file )とでているが、実装見ると
sub Makefile_PL_guts { my $self = shift; my $main_module = shift; my $main_pm_file = $self->_module_to_pm_file($main_module);
$main_moduleから$main_pm_file求めとる? Σ(´Д`ι)
Makefile_PL_gutsを呼び出す側でも...
sub create_Makefile_PL { (略) $self->create_file( $fname, $self->Makefile_PL_guts($main_module) ); $self->progress( "Created $fname" ); return $output_file; }
$main_moduleしか渡してないじゃん。
てなわけでModule::Starter::PBPの修正に入る。Makefileと同じく'MAIN PM FILE'を使用しているBuildの方も同様に直す。
とりあえずパッチを作ってみた。
# diff -u /usr/local/lib/perl5/site_perl/5.8.6/Module/Starter/PBP.pm.orig /usr/local/lib/perl5/site_perl/5.8.6/Module/Starter/PBP.pm
--- /usr/local/lib/perl5/site_perl/5.8.6/Module/Starter/PBP.pm.orig Thu Oct 25 06:33:00 2007 +++ /usr/local/lib/perl5/site_perl/5.8.6/Module/Starter/PBP.pm Thu Oct 25 10:35:14 2007 @@ -22,9 +22,10 @@ sub Makefile_PL_guts { my $self = shift; + my $main_module = shift; my %context = ( - 'MAIN MODULE' => shift, - 'MAIN PM FILE' => shift, + 'MAIN MODULE' => $main_module, + 'MAIN PM FILE' => $self->_module_to_pm_file($main_module), 'DATE' => scalar localtime, 'YEAR' => $self->_thisyear(), ); @@ -34,9 +35,10 @@ sub Build_PL_guts { my $self = shift; + my $main_module = shift; my %context = ( - 'MAIN MODULE' => shift, - 'MAIN PM FILE' => shift, + 'MAIN MODULE' => $main_module, + 'MAIN PM FILE' => $self->_module_to_pm_file($main_module), 'DATE' => scalar localtime, 'YEAR' => $self->_thisyear(), );
とりあえず、Buildまではいけた。
だが、今度はPerl::Criticがインストールできなくて....\(^o^)/
#4時間後の追記
Perl::Criticはportsからいれた。
その後、cpanシェル上でinstall Test::Perl::Criticとやったら今後は上手く入った。ついでにModule::Buildも入ってなかったのでついでに入れた。
よーやく
$ perl Build.PL
$ perl Build
までいったが、今度は
$ perl Build test
でコケる。Error: Global symbol "$VERSION" requires explicit package nameと言われるので、テンプレートの~/.module-starter/PBP/Module.pmを見たら
use version; $VERSION = qv('0.0.3');とあるのでこいつを
use version; our $VERSION = qv('0.0.3');に修正。
#use strict;の前にuse version;なら大丈夫かなぁと思ったが、Test::Perl::Criticが許さないようだ。
とにかく、漸くtestも全部通った。これでtest firstな環境完成。
#更に深追い
google code で Module::Starter::Simpleを調べてみたらVersion 1.38の頃にはMakefile_PL_guts($main_module, $main_pm_file);とmain_pm_file付きで呼んでいた。
んで1.44にはMakefile_PL_guts($main_module)というインタフェースに変更されちゃってるけど、(Changesを見る限り、1.43_02 Wed Apr 25 09:37-Wed May 09 14:46 PDT 2007あたりなのだろうか?)これにModule-Starter-PBPが追いついてない感じなんだと思う。(最終更新0.0.3 Fri Feb 17 16:02:05 2006だしなぁ。)