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スクリプトを解釈してしまってだめだった。
0 コメント:
コメントを投稿 | |