Top > PARによるPerlスクリプトのEXE化
[注]以下の文書は PAR-0.959 を基に書かれていますが,Version 0.970 以降の PAR では,pp コマンドが同梱されておらず,以下に述べられている方法ではインストールがうまくいきません。最新版の PAR で成功するインストール方法は,現在調査中です。
Perl スクリプトを,PAR によって,Windows で単独実行可能な EXE ファイルに変換する方法を記します。
ひとまず,インストール方法と使い方の説明を行い,その操作の意味は後半で解説します。
まず,以下がインストールされていて,実行ファイルにパスが通っていることを前提とします。
MinGW のインストール方法に関しては, C-Compiler Wiki - MinGW/インストール を参照。
nmake.exe の入手先は, .NET Framework SDK や, Windows Platform SDK や, 自己解凍書庫の nmake15.exe など。
wget, unzip, tar, cp コマンドは,Cygwin がインストールされていれば,Cygwin のものを利用すればよいです。
wget コマンドに関しては,Windows用wget の wget.exe を使用すればOK.
unzip コマンドに関しては, unzip.exeの実行ファイル をダウンロードすればOK.
tar コマンドに関しては,texinst755.zip に含まれる tar.exe を利用すればOK.
cp コマンドに関しては,
@echo off
copy %*
というバッチファイルを cp.bat という名前で保存して使えばOK.
(Windows2000/XP系のcmd.exeでは,%* でコマンドライン引数を全て渡せることを利用。9x系なら,
最大9個までになりますが, %1 %2 %3 %4 %5 %6 %7 %8 %9 と列挙すればOK.)
CPANにおいて,ExtUtils::FakeConfig および PAR の最新版を確認します。
2006/11/17現在,
ExtUtils-FakeConfig-0.08 および PAR-0.959 が最新です。
次の内容のバッチファイルを作成し,保存します。
ただし,2行目,3行目の,ExtUtils::FakeConfig および PAR のバージョンの部分は,
実行時の最新バージョンの数値に直しておいてください。
このバッチファイルを実行すると,まずPARの実行に必要なライブラリをインストールして,次に ExtUtils::FakeConfig および PAR の最新版のソースコードをダウンロードし,コンパイルしてインストールする作業を全自動で行います。
@echo off
set ExtUtils-FakeConfig-Archive=ExtUtils-FakeConfig-0.08
set PAR-Archive=PAR-0.959
rem レポジトリに bribes が登録されていない場合は新規登録
set ADDBRIBES=0
call ppm3 rep | find "bribes" || call ppm3 rep add bribes http://www.bribes.org/perl/ppm && set ADDBRIBES=1
rem bribes の優先順位が低い場合は上げる
set UPBRIBES_A=0
call ppm3 rep | find "[1] bribes" || call ppm3 rep up bribes && set UPBRIBES_A=1
set UPBRIBES_B=0
call ppm3 rep | find "[1] bribes" || call ppm3 rep up bribes && set UPBRIBES_B=1
call ppm3 install File-Temp
call ppm3 install Compress-Zlib
call ppm3 upgrade Compress-Zlib -install -precious
call ppm3 install Archive-Zip
call ppm3 install Module-ScanDeps
call ppm3 install PAR-Dist
call ppm3 install Parse-Binary
call ppm3 install Win32-Exe
call ppm3 install Digest-SHA
call ppm3 install Module-Signature
rem 設定変更した項目を元に戻す
if %UPBRIBES_B%==1 call ppm3 rep down bribes
if %UPBRIBES_A%==1 call ppm3 rep down bribes
if %ADDBRIBES%==1 call ppm3 rep del bribes
rem FakeConfigのソースコードを取得してコンパイル・インストール
pushd .
dir %ExtUtils-FakeConfig-Archive%.zip || wget http://search.cpan.org/CPAN/authors/id/M/MB/MBARBON/%ExtUtils-FakeConfig-Archive%.zip
unzip %ExtUtils-FakeConfig-Archive%.zip
cd %ExtUtils-FakeConfig-Archive%
perl Makefile.PL
nmake
nmake install
popd
rem PARのソースコードを取得してコンパイル・インストール
pushd .
dir %PAR-Archive%.tar.gz || wget http://search.cpan.org/CPAN/authors/id/S/SM/SMUELLER/%PAR-Archive%.tar.gz
tar zxvf %PAR-Archive%.tar.gz
cd %PAR-Archive%
perl -MConfig_m Makefile.PL
nmake
nmake install
popd
pp -o hoge.exe hege.pl
こうしてできる hoge.exe は,実は zip ファイルです。 拡張子を .zip に変更すれば解凍できますので,ソースコードの隠蔽目的には使えません。
この hoge.exe は,必要なライブラリおよびインタプリタを含んでいるので,ActivePerl がインストール
されていない環境でもクリック一発で実行できます。
ただし実行時にまず大きなzipを裏で展開するためか,起動時にCPUパワーを食い,やや時間がかかりますが,
それは仕方がないでしょう。
pp --gui -o hoge.exe hege.pl
pp -i hoge.ico -o hoge.exe hege.pl
pp -a data.txt -o hoge.exe hege.pl
pp -M Net::SMTP -o hoge.exe hege.pl
pp -h
※ -more- は [enter] → [space] で一画面進む
バッチファイル前半部では,まず,bribes のレポジトリから,PARに必要なライブラリをインストールしています。cmd.exeのコマンドセパレータ A || B (Aが失敗したらBを実行),A && B (Aが成功したらBを実行) を使用しています。途中に行った設定変更は,環境変数で管理して,元に戻しておきます。
さて,参考サイト[1]や[2]にも書かれている通り, ppmでレポジトリからインストールできるPARのパッケージや,PARの配布サイトに置いてある Windows用にコンパイルされたPARのバイナリパッケージは,ActivePerl の最新版に対応していません。
そのため,パッケージを使ったPerlスクリプトをEXE化して実行すると,実行時に
プロシージャエントリポイントPL_memory_wrapがダイナミックリンクライブラリperl58.dllから見つかりませんでした。
というエラーが出てしまいます。
そこで,参考サイト[2]にあるとおり,CPANから最新版の PAR のソースコード をダウンロードし,それをMinGWでコンパイルして使用したいわけです。
しかし,CPANのモジュールはUNIX用に作られているので,まず,CPANのモジュールをMinGWでコンパイルできるようにしておかなければなりません。そのために使用するのが ExtUtils::FakeConfig です。
参考サイト[3]にあるとおり,ExtUtils::FakeConfig をインストールすれば,本来
perl Makefile.PL
とするところを,
perl -MConfig_m Makefile.PL
として,あとは普通に
nmake
nmake install
とすれば,CPAN のモジュールを MinGW でコンパイルしてインストールすることができます。
バッチファイル中盤では,ExtUtils::FakeConfig のソースコードをCPANからダウンロードし,MinGWでコンパイルしてインストールしています。
そして,バッチファイルの終盤では,PAR のソースコードをCPANからダウンロードし, 先程の ExtUtils::FakeConfig を使って MinGW でコンパイルしてインストールしています。
これで,めでたく最新版の ActivePerl で PAR が使えるようになる,というわけです。
PerlスクリプトをEXEに変換するツールは,PARだけではなく,他にもあります。 参考サイト[4]や[5]に比較があります。