exeの生成が必要
以前(随分前だけど)やったことが、あったので楽勝と思ったら、意外なところで躓いたのでちゃんと記録しておく。
基本的にスクリプト言語であるPerlのコードはテキストファイル。
Perlの実行環境さえあれば、ほぼ動く。
LinuxやMacなら最初からperlが入っているので、何も考えることはない。
じゃ、windowsのように実行環境がない場合はどうするかというと、
- Perlを動かせるようにインストールする(ActivePerlで簡単に入る)
- exeファイルにして、実行する。(ファイルが巨大になる)
- 諦める
と、これくらいしか選択肢がない。
今回は、作成したスクリプトを、Perl実行環境のない端末で何台も動かすことになりそう。
でもって、それぞれの端末にPerlをインストールして、pmなどのライブラリを揃えてというのが、メンテナンス上大変になりそう。
となると、2.のexe化を検討するしかない。
環境準備1
まずは、新しいVMを用意して、ActivePerlのインストールから始める。
早速インストール→数分で完了。
コマンドプロンプトから、
cpan install PAR::Packer
で、exe化に必要なモジュールをインストール。
まっさらな状態からのインストールなので、若干時間がかかるけれど、無事終了…。
あれ?無事終了しない。Error吐いてる。
main.c: In function 'main':
main.c:121:23: warning: assignment discards 'const' qualifier from pointer target type [enabled by default]
windres -i winres/pp.rc -o ppresource.coff --input-format=rc --output-format=coff --target=pe-i386
'windres' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
dmake.exe: Error code 129, while making 'ppresource.coff'
dmake.exe: Error code 255, while making 'subdirs'
RSCHUPP/PAR-Packer-1.026.tar.gz
C:\Perl\site\bin\dmake.exe -- NOT OK
おや? 必要なコマンド類も入れてくれるはずなのに、windresが無いという。
面倒なので、PPM(perl package manager)で入れてみる。確かwindowsのはGUIになっていたはず。
環境準備2
PPMを起動し、PAR::Packerを入れると、すんなり終了。
初めからこうすればよかった。
作業ディレクトリで、サンプルを変換してみる。
hello.plを作成。(まぁ予想通りのプログラムですww)
pp -o hello.exe hello.pl
これでサクッと…。
いかない。ちゅうかエラー吐いているし。
Perl lib version (5.20.2) doesn't match executable 'perl.exe' version (5.20.1) at C:/Perl/lib/Config.pm line 62.
はぁ?
インストールしたPerlは、5.20.2なのに、実行用perlは5.20.1って…。
パッキング用は別に用意するんだけど、バージョンの不一致が起きているのか?
と解釈して、Config.pmを書き換えてみることに。
62行目あたりのバージョンをチェックしている部分を 5.20.1に変更してみる。
すると、さっきとはエラーを吐くタイミングが少し変わったが、
Perl lib version (5.20.2) doesn't match executable 'perl.exe' version (5.20.2) at C:/Perl/lib/Config.pm line 62.
と、ますます訳の分からない表示に。
じゃ、古いActivePerlを入れれば動くんじゃね?と思って他のVersionを落としてくる。
5.22.0.2200
5.18.4.1805
が、提供されている。5.20.1は無いし…。試しに「5.18.4.1805」でやってみるが当然動作せず。
ActivePerlを何度も入れなおす羽目に。
調べてみると、ActiveStatesのCommunity Forumに全く同じ書き込みがあった。
PAR::Packer could not pack script: version mismatch between perl lib (5.20.2) and perl.exe (5.20.1)
そこを読んでいくと、最後に
This appears to be an upstream bug in Par::Packer.
Modules should not need to be recompiled, and should be compatible with newer releases of the same major revision of Perl. It's not clear why Par::Packer complains here. The maintainer should have a better idea.
って書いてあるやん。
6月の段階で見つかっているのに、まだ治っていないのかよ…。
次のリリースにって言われても、今使いたいんだし。
別の方法を探ることにする。
環境準備3
Googleでしつこく探してみると、同じような状況の記録がありました。
Perlスクリプトの汎用化+GUI化+exe化=アプリ誕生!(3)
あぁ同じような手順を踏んでいます。
なんと、環境準備1の方法で無理やりクリアしたらしい。
といっても、ものすごく簡単な方法だった。
windresが、異なるフォルダにあるらしいので、これをコピーしてやれと。
探してみると C:\Perl\site\lib\auto\MinGW\bin に確かにwindres.exeがありました。
そこで、こいつをPATHの通っているC:\Perl\site\bin にコピーする。
最後に、再度cpan installをかけてみる。
Appending installation info to C:\Perl\lib/perllocal.pod
RSCHUPP/PAR-Packer-1.026.tar.gz
C:\Perl\site\bin\dmake.exe install -- OK
やった!とりあえずエラー無しで導入まで完了した。
実際に動かしてみる
サンプル用のスクリプトを、exe化してみる。その時の結果が以下の通り。
18バイトだったスクリプトは、PERL本体とその他必要なライブラリ等を組み込んで約3MB程度になっています。
まあ、今どきの環境であれば、たかだか「Hello」を表示するのに3MB程度使っても
問題はないよね?
一応、無事にexeにすることができるようになりました。
ふぅ、これで終わりじゃ無いんだよね。
実際のスクリプトを作成しないといけないわけで、やっとスタートですゎ。