かねてから気になっていたperl2exe(perlスクリプトファイルを実行ファイルにしてくれるソフト)についに挑戦。
Win32環境での情報などは結構転がってるのだが、Unix版で参考になるサイトがないので、仕方なく本家のユーザーマニュアルを読みながらやってみる。
まずは本家からダウンロード。
http://www.indigostar.com/perl2exe.htm
私の場合はperl5.10.0でLinux上でコンパイル予定なので、
・Perl2Exe V9.100 for Linux (Jan 18 2008)
↑これを選んでダウンロード&解凍。
なにやらマニュアルを見ると、
・exeファイルの作り方は、コマンドにて、
「perl2exe yourscript.pl」
とするだけ。ふむふむ。
・特別なモジュールを読み込む場合は、スクリプト中に
#perl2exe_include "somemodule.pm";
的なことを書けばよいと・・・
まあこの辺はWin32版と同じだな。
ほんでもって、Unixホストで動かす場合は、同梱されてるインタプリタじゃなくて、動かしてるサーバのインタプリタとコア/ローカルモジュールを使用する設定にできるらしい。
後々、こっちの方が楽そうなので、切り替えてみる。
--------------------------------------------------------------------
cd ~/perl2exe
rm -rf perl5
perl ./setup_perl2exe.pl
--------------------------------------------------------------------
「切り替えました!」的なことが表示されたので、多分OK。
とりあえず試しに使ってみる。
まず最初に、
--------------------------------------------------------------------
cd ~/perl2exe
./setup
--------------------------------------------------------------------
実行ファイル生成
--------------------------------------------------------------------
cd ~/perl2exe
./perl2exe hellocgi.pl
--------------------------------------------------------------------
同じディレクトリに「hellocgi」という実行ファイル(バイナリファイル)ができた!!
とりあえず動作確認。
--------------------------------------------------------------------
cd ~/perl2exe
./hellocgi
--------------------------------------------------------------------
(あくまで実行ファイルなのでファイル名を指定するだけ)
・・・・よっしゃ成功!!
次に、WEBサーバ(ブラウザ)から実行できるか実験。
マニュアルにはtelnetを使って・・・みたいなこと書いてあったけど、面倒くさいんで、
#!/usr/bin/perl -w
system "./hellocgi";
exit;
とだけ書いたperlスクリプトを実行ファイルと同じ場所に置いて、このファイルにアクセスする。
よしよし、ちゃんと表示される。html出力もOKですな♪
じゃあいよいよ、もっと複雑なDBが絡んだスクリプトに挑戦してみようってことで、やってみたのだが、もちろん一発でうまくいくわけがなく、以下のエラーが連発。
Warning: Can't locate VMS/Stdio.pm
at /usr/lib/perl5/5.10.0/File/Temp.pm line 149
@INC = /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi, /usr/local/lib/perl5/site_perl/5.10.0, /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/vendor_perl/5.10.0, /usr/lib/perl5/vendor_perl, /usr/lib/perl5/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/5.10.0, ., .
Warning: Can't locate Compress/Bzip2.pm
at /usr/local/lib/perl5/site_perl/5.10.0/HTTP/Message.pm line 315
@INC = /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi, /usr/local/lib/perl5/site_perl/5.10.0, /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/vendor_perl/5.10.0, /usr/lib/perl5/vendor_perl, /usr/lib/perl5/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/5.10.0, ., .
Warning: Can't locate Compress/Bzip2.pm
at /usr/local/lib/perl5/site_perl/5.10.0/HTTP/Message.pm line 447
@INC = /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi, /usr/local/lib/perl5/site_perl/5.10.0, /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/vendor_perl/5.10.0, /usr/lib/perl5/vendor_perl, /usr/lib/perl5/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/5.10.0, ., .
Warning: Can't locate Compress/Bzip2.pm
at /usr/local/lib/perl5/site_perl/5.10.0/HTTP/Message.pm line 496
@INC = /usr/local/lib/perl5/site_perl/5.10.0/i386-linux-thread-multi, /usr/local/lib/perl5/site_perl/5.10.0, /usr/lib/perl5/vendor_perl/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/vendor_perl/5.10.0, /usr/lib/perl5/vendor_perl, /usr/lib/perl5/5.10.0/i386-linux-thread-multi, /usr/lib/perl5/5.10.0, ., .
(以下省略)
チーン。
まあ、エラーの言ってる意味はわかるのだが、Compress/Bzip2とか、聞いたこと無いようなモジュールまで要求してきやがる。
どうやら動作条件に関係なく、モジュール中にuseとかrequireとかの命令があったら、evalで呼ばれてても、とにかくそのモジュールはロードしなきゃならん仕様らしい。
仕方ないからインストールしてやるかと思い、cpan2rpm使おうとしたら「見つかりません!」的な。
ここまできたら、全部入れてやればいいんだろと思い、全部cpanからダウンロードしてきてmake installを実施。
しかしインストール中に今度は、
/bin/sh: gcc: command not found......
Cコンパイラまで追加すんのかよ!と思いつつ、こちらのサイト
http://memorva.jp/memo/linux/gcc_curses.php
を参考にしつつ、gccをインストール。
--------------------------------------------------------
yum install gcc*
--------------------------------------------------------
まあyumで一発だからいいけど。
これでようやく要求された全てのモジュールのmake install が完了。
インストール中に何やらいっぱい警告だのエラーだの表示されたけど、とりあえずpmファイルが入ったからいいや的な。
そしてもう一度実行ファイルを生成!
・・・お?
今度はエラーが出ない。
イエーイ!コンパイル成功〜〜〜〜!
さっそく実行〜!
あれ?
Software error:
DynaLoader object version 1.0801 does not match $DynaLoader::VERSION 1.08 at PERL2EXE_STORAGE/DynaLoader.pm line 93.
Compilation failed in require at PERL2EXE_STORAGE/DBI.pm line 157.
BEGIN failed--compilation aborted at PERL2EXE_STORAGE/DBI.pm line 157.
Compilation failed in require at ** line 15.
BEGIN failed--compilation aborted at ** line 15.
・・・うーむ・・
どうやらDBIの設定がいろいろ必要らしい。
苦戦は続く・・・
そして改めて説明をよく見ると、「Mysqlを使用する場合は、DBD::Mysql_PPを使用してください」
みたいなことが書かれている・・・
ということは、通常のCを使うデータベースドライバが使えないっつーことか。
このあたりで、ひょっとすると、これはものすごく使えないソフトなのでは・・・という不安がよぎる。
調べてみると案の定、Mysql_PPはいつまでたってもバージョンが0代だし、処理がくそ遅いという評判。
まあ全てPurePerlでやろうってんだからそうなるだろうな。
さらにMysql_PPの依存モジュールであるNet::Mysqlモジュールでもようわからんエラーが続出。
そして、ついに対応するのをあきらめた私。
結論:
データベース連携するプログラムはPerl2exeで(気軽に)使えない。
そうじゃないものなら使用する価値はまあまあある。
ただしスクリプトにモジュール名が書いてあったら必ず必要。
以上、ご参考までに。