PAR

Perl で書かれたプログラムを Windows で動く実行ファイル(exe)に変換してくれる、PAR。現在、POPFileWindows 版には、ActiveState 社の Perl Dev Kit で作成された実行ファイルが使われているが、有償のソフトウェアでなくても同じような実行ファイルを作ることができないか、という話。
試行錯誤してなんとか動くようになったので、とりあえず忘れないようにメモ。詳しくはもう一度やってみながら明日か明後日にでも。
PAR のホームページから Windows 用にコンパイルされたバイナリファイルをダウンロードすることができるのだけど、Perl 5.8.6 にしか対応していないので、最新バージョンの 5.8.7 では動作しない(実行時にエラーが起こる)。そこで、まず、PAR をコンパイルするところからのスタートとなった。ここでかなり苦労した(5.8.6 で動かす場合は、バイナリを使えばよいので下に書いたほとんどの手順は必要ない)。

  • まず、ActivePerl の最新バージョン(これを書いている時点では 5.8.7)をダウンロード・インストールする。
  • そして、Windows 上で C コンパイルができるようにするために、MinGW と MSYS をインストール(MSYS のインストールの際に、MinGW をインストールした場所を聞かれた)。
  • さらに、make を行うために nmake を入手し、MinGW/bin へ展開(パスが通っていればどこでもよい)しておく。
  • DOS 窓から ppm を起動し、PAR を動かすために必要なモジュール(PAR::Dist、Parse::Binary、Win32::Exe くらいだったろうか)をダウンロード・インストールする。
  • MinGWPerl モジュールをコンパイルできるようにするため、ExtUtils::FakeConfig を入手し、インストールする(これは MSYS から行った)。(参考)MinGW で CPAN のモジュールをコンパイルする方法
  • PAR のソースコードをダウンロードする。上記ページを参考に、perl -MConfig_m Makefile.PL、nmake、nnamke install でインストールされる。が、make 時に mkdir マクロの 2 重定義でエラーが発生するので、このマクロを使っているファイル(myldr/static.c と myldr/mktmpdir.c)について、mkdir を my_mkdir に変更するなどの修正が必要。

これで pp コマンドで Perl スクリプトを実行ファイルに変換することができる。スクリプトコンパイルされるわけではなく、実行時にテンポラリフォルダに展開され、それが実行されるという仕組み。だから、実行中は変換前と変わらないが、起動に少し時間がかかるようになる。モジュールはすべて実行ファイルの中に入れられることになるので、多くのモジュールを使用する場合は実行ファイルのサイズが大きくなる。必要なモジュールは自動的にファイルの中に組み込まれるが、必要なものがうまく認識されないこともあるようなので、-M オプションで追加することができる。また、コンソールを表示したくないときには --gui オプションを、アイコンをつけたいときは --icon オプションを指定する。作成する実行ファイルのバージョンなどの情報を --info オプションで指定することができるようだが、詳細は不明。
使うモジュールを実行ファイルの中に組み込んでしまうのではなく、外に置いて実行時に読み込ませることができるかどうか、タスクトレイアイコンなどの UI を追加することができるか、などが今後の課題。