Armadilloフォーラム

420 perlのインストール方法を教えてください。

joshua

2014年9月15日 14時24分

Armadillo 420にperlをインストールしようとしています。
atde3-20120709
atmark-dist-20140602
linux-2.6.26-at19
という組み合わせです。

以下のメーリングリストを参考にしながらperlのパッケージからのインストールを試みていますが、現在、状況が変化していてなかなかうまく行きません....。

http://lists.atmark-techno.com/pipermail/armadillo/2010-November/006172…
http://lists.atmark-techno.com/pipermail/armadillo/2010-November/006167…
http://lists.atmark-techno.com/pipermail/armadillo/2006-February/000859…
http://lists.atmark-techno.com/pipermail/armadillo/2007-August/001954.h…

まず、これらに出てくるパッケージ:

libc6_2.3.6.ds1-13etch2_arm.deb
perl-base_5.8.8-7_arm.deb

perl-base_5.8.7-10_arm.deb
libc6_2.3.5-12_arm.deb

が存在なく、または、実際にインストールしても認識されないようで、とりあえず、これらは今回の質問から外します。

http://lists.atmark-techno.com/pipermail/armadillo/2010-November/006172…

を参考に、

libc6_2.13-38+deb7u4_armel.deb
perl-base_5.14.2-21+deb7u1_armel.deb

をダウンロードし、インストールしました。
http://lists.atmark-techno.com/pipermail/armadillo/2010-November/006172…
から張られているDebianへのリンクもすでにオブソリートで、Debianから探せる、stable armel を探したところ、上述二つが見つかったのですが、以下の作業結果、パッケージが適切なバージョンではないというのが見解です。だれか、最近perlをうまくインストールしたという方いらっしゃったらお教えください。

森 ひろひさ

==================

1.
perl-base_5.14.2-21+deb7u1_armel.deb
だけをインストールしてみる。
つまり、これを展開し、/usr/bin, /usr/lib /usr/share 内ファイルをromfs 対応ディレクトリへコピー。make image でromfs.img.gz を作り、armadillo へ転送。

perlと打つと、
[root@armadillo420-0 (ttymxc1) ~]# perl
perl: /lib/libc.so.6: version `GLIBC_2.11' not found (required by /usr/lib/libp)

libcが問題ありとのこと。

2.
libc6_2.13-38+deb7u4_armel.deb

perl-base_5.14.2-21+deb7u1_armel.deb
の一部をインストール。
http://lists.atmark-techno.com/pipermail/armadillo/2006-February/000859…
にあるように

libthread*
libdl*
 
のみをコピーしてみました。

[root@armadillo420-0 (ttymxc1) ~]# perl
perl: /lib/libc.so.6: version `GLIBC_2.11' not found (required by /usr/lib/libp)

の問題は変化がありません。

3.
libc6_2.13-38+deb7u4_armel.deb

perl-base_5.14.2-21+deb7u1_armel.deb
の全部をインストール、

/lib/libc.so.6 -> /lib/arm-linux-gnueabi/libc-2.13.so とシンボリックリンクを張ってみる。

としてみましたが、今度は、armadillo の起動途中でカーネルパニックとなります。

コメント

中村です。

何年も前から、

> http://lists.atmark-techno.com/pipermail/armadillo/2010-November/006167…

で竹之下さんが作ってくれたパッチ(といってもほぼ全部入れ替えですけど)を
使っています。Armadillo-4x0でです。

使い方(コンパイルやromfsへのinstall)で特に難しかったり
面倒だったりするところはなかったと思います。

少し前のatmark-distでコンパイルしたperlのバイナリ(perl本体と
ライブラリ)だけを最新のatmark-distにコピーして使うこともありますが、
(distのソースを入れ替えてビルドしなおすのは面倒だけど、
ちょっとperlを使いたい、というときなどです)
そういう使い方をしてもちゃんと動いてくれてます。
そのために「この一式を実機にコピればOK」というのを
作ってあったりします。

コンパイルやインストールは問題も苦労もありませんでしたが、
動作上、1つ問題がありました。
実数演算が化けるときがあります。

sv.cだけ"-O2"オプションをはずせば回避できます。

具体的には、

--- atmark-dist/user/perl/cflags.SH-orig
+++ atmark-dist/user/perl/cflags.SH
@@ -113,11 +113,11 @@
     pp_sys) ;;
     regcomp) ;;
     regexec) ;;
     run) ;;
     scope) ;;
-    sv) ;;
+    sv) optimize=-O0;;
     taint) ;;
     toke) ;;
     usersub) ;;
     util) ;;
     *) ;;

です。
"-O0"以外でも大丈夫なものがあるかもしれませんが、
"-O0"しか試してません。

どういう問題なのか?、他のバージョンのperlでは?などは、
いつか機会があったら。(作業メモは残っているのですが・・・・)

--
なかむら

中村様

ありがとうございます。
ソースコードコンパイルは、パッケージがどうしてもダメだったら....と思っていたのですが、
試してみました。

>http://lists.atmark-techno.com/pipermail/armadillo/2010-November/006167…

最初はなにやらいろいろありましたが、
atmark-dist-20140602
をサラピンからインストールし直し、以下パッチをあてて、再構成をしたところ、パッチも問題なくスムーズに当たり、コンパイルもちゃんと通り、A-420にアップロード、実行したところ、perl も無事動作。

ありがとうございました。

> sv.cだけ"-O2"オプションをはずせば回避できます。

昔、といっても十年以上前ですが、Solarisのgccで-O2でコンパイルすると、挙動不審なバイナリが生成され、-O0で問題なく行った経験がありますが、うーむ。未だにそういったことが起こるんですかねえ。

なにはともあれ、ありがとうございました。

森 ひろひさ

中村です。

森さん、perl動いたようで、よかったです。

フォーラムのメンテ担当者様、
1つ前の私の投稿を読みなそうとしたら、
 作成者:y.nakamura 作成日:2014/09/15 - 20:07
だけで、本文が何も表示されません。
私のパソコンだけの問題でしょうか?

> 昔、といっても十年以上前ですが、Solarisのgccで-O2でコンパイルすると、挙動不審なバイナリが生成され、-O0で問題なく行った経験がありますが、うーむ。未だにそういったことが起こるんですかねえ。

何かおかしなことが起きたら最適化を外してみると大丈夫になることがありますね。

ちなみに、perl5.8.8ではなくてperl-5.8.9を使うと-O2でも問題なく、
また、perl-5.8.8をdistの下ではなくて単独でクロスコンパイルして
armadilloに入れてみたところ、やはり-O2でおかしくなってました。
perl5.8.8でもArmadillo-2x0(atde2ですね)では-O2で大丈夫でした。
perl5.8.8をatde3でx86で-O2でビルドしてatde3で動かすのも問題なしです。

atde3のgccでperl5.8.8のsv.cのどこかのコードが-O2でおかしくなっているようです。

実数の化けは、こんなのです。

perl -e 'print 1327402000+0,"\n"'
1327402000
 
perl -e 'print 1327402000+10,"\n"'
1327402010
 
perl -e 'print 1327402000+0.0,"\n"'
1327401984.24578
 
perl -e 'print 1327402000+10.0,"\n"'
1327401984.24578
 
perl -e 'print 1327402000.0,"\n"'
1327401984.24577
 
perl -e 'print 1327402010.0,"\n"'
1327401984.24577

--
なかむら

中村です。

1つ前の投稿で、一か所修正です。

> atde3のgccでperl5.8.8のsv.cのどこかのコードが-O2でおかしくなっているようです。

atde3のgccでARM用にクロスコンパイルすると、perl5.8.8のsvのどこかのコードが・・・
です。

> 中村です。
>
> 1つ前の投稿で、一か所修正です。
>
> > atde3のgccでperl5.8.8のsv.cのどこかのコードが-O2でおかしくなっているようです。
>
> atde3のgccでARM用にクロスコンパイルすると、perl5.8.8のsvのどこかのコードが・・・
> です。
>

あ、これは了解しております。
しかし、確かにヘンですねえ。以下、もっとも単純な例。

[guest@armadillo420-0 (ttyp0) ~]$ perl -e 'print 1.0,"\n"'
1.00000000022903
[guest@armadillo420-0 (ttyp0) ~]$

-O0が効いていないみたいです。sv.oを削除し忘れたか。コンパイルし直しかな。

森さん、中村です。

> しかし、確かにヘンですねえ。以下、もっとも単純な例。
>
> [guest@armadillo420-0 (ttyp0) ~]$ perl -e 'print 1.0,"\n"'
> 1.00000000022903

簡単な例をありがとうございます。
実は、あの1327402000という数値は、"Tue Jan 24 19:46:40 2012"なんです。
このころこの不具合を見つけたわけでして・・・その時のメモから
そのまま投稿にはり付けました。

--
なかむら

中村です。

あのperlパッチでArmadilloにインストールされるのはperl本体のみなので、
デバッグに役立つstrictすら使うことができません。
そこで、strictも使えるようにする方法です。
strictの他にopen2なども使えるようにしてみました。
open2は、ちょっとした文字列をnkfで変換なんてときに使ってます。

atmark-dist/user/perl/Cross/makefile のromfsのところを次のように書き換えます。
(小文字の"m"で始まるmakeファイルですので注意してください)

PM_DIRTOP = /usr/lib/perl5/5.8.8
PM_DIRS = $(PM_DIRTOP) $(PM_DIRTOP)/IPC
PM_FILES = strict.pm Carp.pm Exporter.pm Symbol.pm IPC/Open2.pm IPC/Open3.pm
 
romfs:
        $(ROMFSINST) ../miniperl /usr/bin/perl
        for i in $(PM_DIRS); do \
                [ -d $$i ] || mkdir -p $(ROMFSDIR)$$i; \
        done
        for i in $(PM_FILES); do \
                $(ROMFSINST) ../lib/$$i $(PM_DIRTOP)/$$i; \
        done

strictだけでいいなら、PM_FILESのCarp.pm以降と
PM_DIRSの$(PM_DIRTOP)/IPCは不要です。

このやり方で他のpmも使えるようにできるのですが、
pmファイル1つで済むものは少なく、依存関係を調べて
いろいろ追加しないとならないので大変です。

--
なかむら

> 中村です。
>
> あのperlパッチでArmadilloにインストールされるのはperl本体のみなので、
> デバッグに役立つstrictすら使うことができません。
> そこで、strictも使えるようにする方法です。

有用な情報をありがとうございます。pmをインストールはどうするのかなと思っていたところです。
少なくともstrictは欲しいですね。試したいと思います。
あと、必要と分かっているのはSocketですね。findしてみると、とりあえずあるようではあります。同じやり方でいけるでしょうかね。

===
ちなみに、sv.c問題は解決しました。

[root@armadillo420-0 (ttymxc1) ~]# perl -e 'print 1.0,"\n"'
1
[root@armadillo420-0 (ttymxc1) ~]#

ありがとうございます。

森 ひろひさ

中村です。

> あと、必要と分かっているのはSocketですね。findしてみると、とりあえずあるようではあります。同じやり方でいけるでしょうかね。

http://d.hatena.ne.jp/perlcodesample/20090406/1238902770
ここにあるechoクライアントでも動かして見ようかと始めたのですが・・・

前の投稿で書いたExporter.pmとCarp.pmはすでに入っているものとします。

ext/Socket/Socket.pmをArmadilloの/usr/lib/perl5/5.8.8/の下へ
コピーして動かしてみると、あれが足りない、これが足りないと
怒られますので、足りない物を入れていきます。

まず
warnings.pm, warnings/register.pm, vars.pm, AutoLoader.pm
この4つをArmadilloの/usr/lib/perl5/5.8.8/の下へ。

configpm, config.sh, myconfig.SH, Porting/Glossary
この4つをArmadilloの適当なところへコピーして、
カレントディレクトでminiperl -> /usr/bin/perlにリンクをはって、
(あるいはconfigpmの1行目を書き換えて)
カレントディレクトリにlibディレクトリをmkdirして、
configpmを実行するとlibの下に
Config.pm, Config.pod, Config_heavy.pl
ができますので、Config.pmとConfig_heavy.plを
/usr/lib/perl5/5.8.8/の下へ。

ext/DynaLoader/DynaLoader_pm.PL
ext/DynaLoader/XSLoader_pm.PL
この2つをArmadilloの適当なところへコピーして、
それぞれ実行するとDynaLoader.pmとXSLoader.pmが
できますので、この2つを/usr/lib/perl5/5.8.8/の下へ。

ここまでの作業で/usr/lib/perl5/5.8.8/の下には次のものがあります。

# ls -1 /usr/lib/perl5/5.8.8/
AutoLoader.pm
Carp.pm
Config.pm
Config_heavy.pl
DynaLoader.pm
Exporter.pm
Socket.pm
XSLoader.pm
strict.pm
vars.pm
warnings/
warnings.pm

# ls -1 /usr/lib/perl5/5.8.8/warnings
register.pm

上に書いたechoクライアントを実行すると、
Unknown error
Compilation failed in require at ../a line 3.
BEGIN failed--compilation aborted at ../a line 3.
というエラーになって"use Socket;"の行で止ってしまいました。

何か間違いか勘違いしていところがあるのか、足りないものがあるのか、
そもそも、無理なのか・・・

--
なかむら