2007-06-21

ZaurusにPerl 5.8.8をインストール


ZaurusにPerlといったらLinuxザウルス/Perl- Walrus, Visit.のが有名だが、ここのはバージョンが少し古く、スレッドやが使えなかったりするので新しいバージョンをいれてみた。

まず、以下のdebianパッケージをダウンロード
/pool/main/p/perl/perl-base_5.8.8-7_arm.deb
/pool/main/p/perl/perl-modules_5.8.8-7_all.deb
/pool/main/g/glibc/libc6_2.3.2.ds1-22sarge6_arm.deb
リンクはhttp://ftp.jp.debian.org/のものにしてますが、ミラーサイトもあります。
libcの取扱いには注意。うっかりZaurusのもとのものと置き換えると何も起動できなくなります。


cd /mnt/card/tmp/perl
dpkg-deb -x perl-base_5.8.8-7_arm.deb .
dpkg-deb -x perl-modules_5.8.8-7_all.deb .
dpkg-deb -x libc6_2.3.2.ds1-22sarge6_arm.deb .
mv ./usr/lib/perl/* /mnt/card/QtPalmtop/perl/lib/perl/
mv ./usr/share/perl/* /mnt/card/QtPalmtop/perl/share/perl/

適当にディレクトリを作ってそこに展開。
そのままだとPerlモジュールのパスが通らないので昔のPerlをインストールしていた時に作られていたディレクトリに移動。
昔のPerlをインストールしていなければ

ln -s /mnt/card/QtPalmtop/perl/lib/perl /usr/lib/
ln -s /mnt/card/QtPalmtop/perl/share/perl /usr/share/

とでもすればOKなはず。

このPerlは必要とするglibcのバージョンが違うので普通には起動できない。

LD_LIBRARY_PATH=/mnt/card/tmp/perl/lib /mnt/card/tmp/perl/lib/ld-linux.so.2 /mnt/card/tmp/perl/usr/bin/perl

こうやって起動するけど面倒なので

alias perl='LD_LIBRARY_PATH=/mnt/card/tmp/perl/lib /mnt/card/tmp/perl/lib/ld-linux.so.2 /mnt/card/tmp/perl/usr/bin/perl'

と.bashrcに書いておくと吉。
./hoge.plみたいに#!/usr/bin/perlでの起動はできなので、perl ./hoge.plみたいに呼び出さきゃいけない。

また、Perlの中で他のコマンドを呼ぶ時は

undef $ENV{LD_LIBRARY_PATH};

としておかないとうまくいかない。

threadsモジュールとかConfig_heavy.plとかは
/pool/main/p/perl/perl_5.8.8-7_arm.debに入ってるので個別に追加するといい。

おまけ
#!/usr/bin/perlを無理矢理動作するようにもしてみた。

#include <stdlib.h>

extern char **environ;

int main(int argc,char* argv[])
{
char** newargv=malloc(argc+2);
char** newenv;
int i;

newargv[0]="/mnt/card/tmp/perl/lib/ld-linux.so.2";
newargv[1]="/mnt/card/tmp/perl/usr/bin/perl";
for(i=1;i<argc;i++) newargv[i+1]=argv[i];
newargv[argc+1]=NULL;

for(i=0;;i++)
if(!environ[i]) break;
newenv=malloc(i+2);
for(i=0;;i++){
if(!environ[i]) break;
newenv[i]=environ[i];
}
newenv[i]="LD_LIBRARY_PATH=/mnt/card/tmp/perl/lib";
newenv[i+1]=NULL;

execve("/mnt/card/tmp/perl/lib/ld-linux.so.2",newargv,newenv);
}

これをコンパイルして/usr/bin/perlにおけばOK。

ちなみに

#!/bin/sh
LD_LIBRARY_PATH=/mnt/card/tmp/perl/lib
/mnt/card/tmp/perl/lib/ld-linux.so.2 /mnt/card/tmp/perl/usr/bin/perl $*

を/usr/bin/perlとしておく方法では、shがPerlスクリプトを解釈してしまってだめだった。