nDiki : h2xs

h2xs

C言語のヘッダファイルから Perl モジュール(のスケルトン)を生成するツール。 pure Perl なモジュールの作成時にも使用できる。

Pure Perl モジュールのスケルトンを作成する

Foo というモジュールを作成する場合、以下のコマンドを実行する。

 h2xs -AX -n Foo

h2xs 1.23 (Perl 5.8.8 付属)の場合以下のようなファイルが作成される。

 Foo/lib/Foo.pm
 Foo/Makefile.PL
 Foo/README
 Foo/t/Foo.t
 Foo/Changes
 Foo/MANIFEST

Pure Perl モジュールのスケルトンを作成する (オブジェクト指向インタフェース)

オブジェクト指向的なモジュールなどで、シンボルを export する必要がない場合は --skip-exporter オプションを指定しておくと、余計なコードがスエルトンに含まれないようになる。

 h2xs -AX --skip-exporter Foo

古い Perl に対応した pure Perl モジュールのスケルトンを作成する

 h2xs -AX -b 5.005.03 -n Foo

のように互換性を維持したいバージョンを -b オプションで指定することが可能である。 v5.6.0 より前を指定すると 'our' や 'use warnings' を使わないようなスケルトンを生成してくれる (h2xs 1.23)。

Pure Perl モジュールのスケルトンを作成する (ネストしたパッケージ名)

 h2xs -AX -n Foo::Bar

とすると h2xs 1.23 の場合 Foo-Bar というディレクトリが作成され、その中にスケルトンが作成される (h2xs -AX -n Foo-Bar とはしない)。

 Foo-Bar/lib/Foo/Bar.pm
 Foo-Bar/Makefile.PL
 Foo-Bar/README
 Foo-Bar/t/Foo-Bar.t
 Foo-Bar/Changes
 Foo-Bar/MANIFEST

*.pm を置く場所

 h2xs -AX -b 5.005.03 -n Foo::Bar

として Foo::Bar モジュールのスケルトンを作成した場合、ソースディレクトリにある各 .pm は以下のようなモジュールであるとして扱われる (Makefile.PL があるディレクトリをカレントディレクトリとして)。

  • ./Bar.pm -> Foo/Bar.pm ( $(INST_LIBDIR)/Bar.pm )
  • ./A.pm -> Foo/A.pm ( $(INST_LIBDIR)/A.pm )
  • ./Bar/B.pm -> Foo/Bar/B.pm ( $(INST_LIBDIR)/Bar/B.pm )
  • ./lib/Foo/C.pm -> Foo/C.pm ( $(INST_LIB)/C.pm )

lib サブディレクトリに置く

配布アーカイブのトップディレクトリに *.pm を置きたくない場合は、lib サブディレクトリの下に置く(その際は Foo ディレクトリから作成する必要がある)。

Makefile.PL と同じ階層に置く

配布アーカイブのトップディレクトリに *.pm を置いてもよい場合は、Foo の下のモジュールは Makefile.PL と同じ場所に、Foo::Bar パッケージの下のモジュールは Barサブディレクトリを作成しそこに置く。

(PMLIBDIRS, BASEEXT, init_dirscan(), libscan(), 参照)

h2xs 以外のPerlモジュールスケルトン生成

モジュールのスケルトン作成をサポートするものとして、以下のモジュールがある。

スポンサード リンク

2004年10月16日 (土)

Template Toolkit のテンプレート上で対話的入力

ちょっとしたプログラムパッケージや LaTeX ドキュメントを作成する時に、Makefile やその他ファイルのスケルトンをまとめて生成する算段を検討中。 例えば Perlh2xs のような感じ。

基本的には Template Toolkit ベースでいってみたい。 ttree あたりを使えばだいたいできそうだ。 ここで --define var=value で全て間違えずに指定するのは大変になってくるだろう。 ということでテンプレート変数定義をまとめたテンプレートファイルを作成し、各テンプレート処理をする際にプリプロセスするようにする。

でこのテンプレート変数定義のテンプレートファイルは対話的に作成できるようにしたい。 テンプレートファイルのテンプレートファイルを処理して。

で対話的入力の方法なのだが、探してもそのようなディレクティブもプラグインもみつからない。ありそうなもんだけどなぁ。

しょうがないので、PERL ディレクィブ内で Term::ReadLineを使って入力。 こんな感じ。

 [% TAGS [- -] -%]
 [- PERL -]
 use Term::ReadLine;
 my $term = new Term::ReadLine('template');
 $stash->set('readline' => sub {
   my $prompt = shift || 'input:';
   my $text = $term->readline($prompt);
   if (defined $text) {
     $term->addhistory($text);
   }
   return $text;
 });
 [- END --]
 [% project.name = '[- readline('project name:') -]' -%]
 [% project.author = '[- readline('author:') -]' -%]

tpage でこのテンプレートファイルを処理すると、対話的に値を入力しながらテンプレートファイルを生成できる。 実際は文字列のエスケープなどもうちょっと工夫が必要。

ちなみに Debian GNU/Linux sid の libtemplate-perl は 2.10-1 で、このバージョンの Template Toolkittpage だと EVAL_PERL が有効になっておらずうまく動かない。 手元にコピーして Template オブジェクトの初期化部分に EVAL_PERL => 1 を追加する必要あり (2.14 の tpage は --eval_perl オプションで有効にできる)。

スポンサード リンク
[ 10月16日全て ]

2004年10月17日 (日)

ExtUtils::ModuleMaker

Perl モジュールのスケルトンを生成するためのモジュール。 h2xs と同じ目的で使うもの。 modulemaker というスクリプトが付属していて、実行すると対話的に項目を設定した後、スケルトンを生成することができる。

h2xs よりはいろいろ項目を設定してスケルトンを生成できる。 h2xs よりは良いがカスタマイズはあまりできなさそう。

直接これを使うためというよりか、ExtUtils::ModuleMaker::TTを使ってみるためにインストール

[ 10月17日全て ]

2006年12月15日 (金)

Perl スクリプトを PAR ファイルにして PAR リポジトリに登録する

PAR リポジトリから Perl モジュールをネットワーク配信するためには、以下の手順で PAR ファイルを作成する。

 perl Makefile.PL
 make
 make test
 perl -MPAR::Dist -e blib_to_par

blib ディレクトリ以下のファイルもとに PAR ファイルが作成されるので、でき上がった PAR ファイルを リポジトリに登録すれば良い(PAR::Repository でビルド済み Perl モジュールをネットワーク配信)。

ではちょっとした Perl スクリプトを PAR リポジトリからロードして使えるようにするにはどうすればよいか。もちろん h2xs などで一式そろえ make して blib ツリーを作るようにすればいいが、たった 1 つのスクリプトファイルだけの時などは大袈裟だ。

この場合は pp でいける。

 echo 'print "hello world!"' > myscript.pl
 pp -o myscript.par -p myscript.pl
 parrepo inject -r /tmp/PAR myscript.par -v 1.00 \
   -a MSWin32-x86-multi-thread -p 5.8.8 \
   --any-arch --any-version

スクリプトのメタデータがないので、parrepo に登録する際に明示的にオプションで指定してあげる必要がある。

-v
プログラムのバージョン番号
-a
アーキテクチャ
-p
Perl のバージョン
--any-arch
アーキテクチャ非依存で動くならば指定しておく
--any-version
任意の Perl のバージョンで動くならば指定しておく。

PAR ファイル(にした Perl スクリプト)が --any-arch で --any-version であっても、-a と -p は必須だ (PAR::Repository の中にアーキテクチャ/バージョンつきで登録された上でシンボリックリンクの形で any 扱いにされるため)。

これで PAR リポジトリからスクリプトを実行できるようになる。 スクリプトの更新もリポジトリ側で行うだけで良くなる。

 perl -e "use PAR { repository => 'http://www.example.com/PAR/',
                    run => 'myscript.pl'}"

お好みで実行形式ファイルにしておけば Perl をインストールすることなく実行できるようになるので便利。

 pp -o myscript.exe -M PAR::Repository::Client \
   -e "use PAR { repository => 'http://www.example.com/PAR/',
                 run => 'myscript.pl'}"

ちなみに PAR リポジトリを使わずに、直接 PAR ファイルを指定して実行できることもできる。

 perl -e "use PAR { file => 'http://www.example.com/myscript.par', \
                    run => 'myscript.pl' }

ちょっとした用途ではこちらでも良いけれど、アーキテクチャ別の管理やらモジュールの管理やらを考えると PAR リポジトリを作ってしまった方が楽。

[ 12月15日全て ]

About Me

Naney Naney (なにい)です。株式会社ミクシィで SNS 事業の部長をしています。

nDiki1999年1月に始めたコンピュータ日誌を前身とする NaneyWeb 日記(兼パーソナルナレッジベース)です。ちょっとしたノートは nNote にあります。

※内容は個人的見解であり所属組織とは関係ありません。

月別インデックス
Process Time: 0.323172s / load averages: 0.62, 1.05, 0.97
nDiki by WATANABE Yoshimasa (Naney)
Powered by DiKicker