いわゆるCPANモジュール形式で展開されているモジュールに対して一般的に行う以下の手順:
perl Makefile.PL make make test make install # 以下はモジュール作成者のみが気にするであろう make clean make disttest make dist make manifest

これがそれぞれ何をしているのかって案外しられてないのかもしれない。

perl Makefile.PL - これはMakefile.PLを単純に実行している。この中では一般的にExtUtils::MakeMaker、Module::Build、Module::Install等のモジュールが使用され、インストールに使うMakefileというファイルを作る。これはmakeコマンドが自動的に検知して、使用してくれる。ちなみにmod_perlでテストを作成する時に使うApache::Testフレームワークの中ではApache::TestMMというような物がその代用をしたりする。

Makefile.PL内で使用しているモジュールによっては挙動に違いがあるかもしれないが、だいたいこのMakefile.PLを動かした時点でMakefileにインストール対象となるスクリプトやlibディレクトリ内に存在するモジュールのリストを作り、これ以降はそれらのファイルに対してのみ作業を行うようになる。

makeフェーズはこれがCで書かれたプログラムだったりするとコンパイルが始まったりするのだが、Perlでは基本的にファイルの移動とちょっとしたフィルタリングを行うだけで終わる。

基本的な動作としては、blibというディレクトリが作られ、lib内にあるモジュールがblibへ、実際にインストールされた状態と同じレイアウトでコピーされる。blib 内を見るとautoやらなにやら怪しげな名前のディレクトリができてるかもしれないが、その辺りはXSでコードを書いていたり、AutoLoader等の黒魔術的な魔法を使ってなければ無視して良い。

インストールするスクリプトを指定していた場合は、そのスクリプトの#!ラインがMakefile.PLを動かした時のperlのパスで書き換えられる。/usr/local/bin/perl Makefile.PLとやっていたら、#!/usr/bin/perlとなっていたものが#!/usr/local/bin/perlに書き換えられる。これもblib以下にとりあえず格納される。

あとはそれぞれのモジュールやスクリプトからPODを抽出してman化したものを作ったり。

blib内のファイルレイアウトを明示的に使用するにはblibというプラグマを使う。これを使用すると開発者モードのようなものがオンになりblib内のファイルレイアウトを理解した上でperlを実行できる(開発者モードと言ったって、blibのレイアウトを理解してくれるということだけだが)。だからmakeを通さずにt/内のテストを動かすにはperl -Mblib t/test.tとかする。これでblib内のモジュールを使いつつ、t/test.tを実行できる。

このblibにモジュールを入れるという作業が結構キモで、インストールする時はともかく、自分のモジュールを開発している時はエラーになったりするので注意が必要。makeの次のフェーズであるmake testで使用されるディレクトリはlibではなくblib内だからだ。

だから例えば、make を通さないでperl -Mblib t/test.tとかを実行していると、その途中でlib内に変更を加えてもテストには反映されない。いつまでたっても古いコードしか実行されなくて首をかしげる事になるだろう。それは単純にmakeを行っていないのでlibの中身がblibに反映されてないからだ。

同様にたまにlibにファイルを追加したのにいくらmakeを行ってもblibにその中身が反映されず、結果make testが落ちる。これはMakefileの中にモジュールのリストが書いてあったりするせい。Makefileでどのファイルをlibからblibにコピーするのか指定されていると、Makefile.PLを実行した時にlibディレクトリになかったモジュールは無視されてしまう。この場合は色々対処法があると思うが、個人的には素直にmake cleanして(後述)perl Makefile.PL、make、make testと行うのが良いと思う。間違いがないから。

make cleanは読んで字のごとし、ディレクトリ内を掃除してくれる。主にblibの中身を消してくれたり、その他一時ファイルを消してくれる。Module::Installはincの中に色々とメタデータを入れたりするのでそれを確実に消したい場合はこれを実行するといい。あとMakefileも削除されるので、再度作業するにはperl Makefile.PLが必要

make manifestはMANIFESTファイルを作る。MANIFESTファイルはCPANにあがっているディストリビューション(いわゆるCPANモジュールのtar ball)内に入っているべきファイルのリスト。ディストリビューションに必要なファイルが全部揃っているかどうかはこのファイルと実際に格納されているファイル群を比べる。

make manifestを実行すると、基本的に現在のディレクトリ以下に格納されている全てのファイルをMANIFESTに追加する。.svn等の隠しファイルは無視されるが、それは良く知られている隠しファイルだけ。あとは全て追加されてしまうのでMANIFEST.SKIPで指定するか、一度MANIFESTを作ってしまったら手動で削除しないといけない。必要なファイルのみをMANIFESTに追加しないと、この後のmake dist/disttestフェーズで問題が出てくる

make distとmake disttestは最終結果であるディストリビューション用のtar ballを作るのに使う。基本的な動作としては"MyModule"のバージョン"0.01"というディストリビューションを作っている場合、現在のディレクトリにMyModule-0.01というディレクトリを作成し、ディストリビューションに必要なファイルを全部コピーする。そしてこれはtar + gzipでtar ballを作成してくれる。

make disttestは最後のtar ballを作成する動作の代わりに、該当ディレクトリ内でmake testを走らせてくれる。これで開発ディレクトリ以外でmake testを動かした時の動作を確認できる。

気をつけなければいけないのはmake distがディレクトリにコピーするファイル群は、MANIFESTに記されているファイルである、ということ。だから例えば必要なファイルなのにMANIFESTに入ってなかったり、不必要なファイルがなぜかMANIFESTに存在していても、MANIFESTに書いてある通りのファイルがコピーされる。余計なファイルがあった場合は恥ずかしいだけだが、ファイルが足りない場合はmake testでこける事が多いのでちゃんと確認すべきだ。そのためにもディストリビューションを作成する場合はmake disttestは必須ステップと言える。

と、こんなところかしら。なんか間違ってたら突っ込みいれてください。