モジュールがDamian先生流に作れない。

| コメント(0) | トラックバック(0)

昨日紹介した「正しい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だしなぁ。)

トラックバック(0)

トラックバックURL: http://hoge.sub.jp/blog-cgi/mt/mt-tb.cgi/506

コメントする

このブログ記事について

このページは、Lyoが2007年10月25日 05:55に書いたブログ記事です。

ひとつ前のブログ記事は「MD5」です。

次のブログ記事は「Module::Starter::PBPの続き」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

OpenID対応しています OpenIDについて
Powered by Movable Type 4.261