Armadilloフォーラム

Perl-5.14

y.nakamura

2015年10月15日 1時58分

中村です。

#投稿時の製品選択でArmadill-4x0とIoTを選んでますが、
#ATDE5を使う800シリーズなどでもOKではないかと思います。

at_mangetsuさんのブログにあるPerl-5.14を(IoTで)試してみました。
(まだ動かしてないです。ビルドだけ)

https://users.atmark-techno.com/blog/1562/1595
です。

今まで、5年くらい前に竹之下さんが作ってくれたperl-5.8.8の
パッチを使わせていただいていました。
使えるモジュールがほとんどなく、最小限のものだけをなんとか
入れてますが、やはり、いろいろ使いたいと思ってました。

寝る前になんとなくブログを見ていてPerl-5.14を見つけましたので、
どのようなモジュールが使えるのか、試しにビルドしてみました。

モジュールの話の前に、ブログの記述に間違いと思われるものが
ありましたので(単純なコピペミスだと思います)、
それを先に書いておきます。

3.4 次に、Perlのソースをダウンロードし、古いものと差し替えます。
 
ダウンロードURL: https://users.atmark-techno.com/system/files/blogs/perl5.14.tar.gz
atmark@atde5:~/atmark-dist$ cd ..                   <=== これ、不要です。
atmark@atde5:~/atmark-dist$ cd user
atmark@atde5:~/atmark-dist/user$ mv perl perl-old
atmark@atde5:~/atmark-dist/user$ tar zxf ../../perl5.14.tar.gz
atmark@atde5:~/atmark-dist/user$ mv perl-5.14.2 perl   <=== これ、不要です。
atmark@atde5:~/atmark-dist/user$ cd ..

romfs/usr/perlの下に入ったモジュール:
(ちょっと長いです)

atmark@atde5:~/tmp/atmark-dist-20150918$ LANG=C tree romfs/usr/lib/perl
romfs/usr/lib/perl
|-- 5.14 -> 5.14.2
`-- 5.14.2
    |-- Config.pm
    |-- Config_git.pl
    |-- Config_heavy.pl
    |-- Cwd.pm
    |-- DynaLoader.pm
    |-- Errno.pm
    |-- Fcntl.pm
    |-- File
    |   |-- Glob.pm
    |   |-- Spec
    |   |   `-- Unix.pm
    |   `-- Spec.pm
    |-- Hash
    |   `-- Util.pm
    |-- IO
    |   `-- Socket
    |       |-- INET.pm
    |       `-- UNIX.pm
    |-- IO.pm
    |-- List
    |   `-- Util.pm
    |-- POSIX.pm
    |-- Scalar
    |   `-- Util.pm
    |-- Socket.pm
    |-- attributes.pm
    |-- auto
    |   |-- Cwd
    |   |   `-- Cwd.so
    |   |-- Fcntl
    |   |   `-- Fcntl.so
    |   |-- File
    |   |   `-- Glob
    |   |       `-- Glob.so
    |   |-- Hash
    |   |   `-- Util
    |   |       `-- Util.so
    |   |-- IO
    |   |   `-- IO.so
    |   |-- List
    |   |   `-- Util
    |   |       `-- Util.so
    |   |-- POSIX
    |   |   |-- POSIX.so
    |   |   |-- autosplit.ix
    |   |   `-- load_imports.al
    |   |-- Socket
    |   |   `-- Socket.so
    |   |-- attributes
    |   |   `-- attributes.so
    |   `-- re
    |       `-- re.so
    |-- lib.pm
    `-- re.pm

それから、ブログ記事では

3.5 make menuconfigを実行し、perlのチェックをONにします。

だけですが、"base modules"もONにしておいた方が良さそうです。

"base modules"もONにすると、romfs/usr/share/perlの下に
次のものが入りました。(ちょっと長いです)

atmark@atde5:~/tmp/atmark-dist-20150918$ LANG=C tree romfs/usr/share/perl
romfs/usr/share/perl
|-- 5.14 -> 5.14.2
`-- 5.14.2
    |-- AutoLoader.pm
    |-- Carp
    |   `-- Heavy.pm
    |-- Carp.pm
    |-- Exporter
    |   `-- Heavy.pm
    |-- Exporter.pm
    |-- FileHandle.pm
    |-- Getopt
    |   `-- Long.pm
    |-- IPC
    |   |-- Open2.pm
    |   `-- Open3.pm
    |-- SelectSaver.pm
    |-- Symbol.pm
    |-- Text
    |   |-- ParseWords.pm
    |   |-- Tabs.pm
    |   `-- Wrap.pm
    |-- Tie
    |   `-- Hash.pm
    |-- XSLoader.pm
    |-- base.pm
    |-- bytes.pm
    |-- bytes_heavy.pl
    |-- constant.pm
    |-- feature.pm
    |-- fields.pm
    |-- integer.pm
    |-- locale.pm
    |-- overload.pm
    |-- strict.pm
    |-- utf8.pm
    |-- utf8_heavy.pl
    |-- vars.pm
    |-- warnings
    |   `-- register.pm
    `-- warnings.pm

5.14が動くなら5.8.8は使うことはないと思いますが、
ブログで配布しているperl5.14.tar.gzには5.8.8も入っていて
5.14.2と5.8.8を選べるようになってました。
5.8.8は、5年前の竹之下さんバージョンと同じみたいです。

動かしてみるのは・・・早くても来週。

--
なかむら

コメント

ブログ記事について、Armadillo-IoT向けのビルド確認と、
記事の内容についてご指摘いただき、ありがとうございます。

他のお客様も参考にできますため、
このようなご報告は大変助かります。

> 動かしてみるのは・・・早くても来週。
ありがとうございます。
お待ちしております。

中村です。

> > 動かしてみるのは・・・早くても来週。
> ありがとうございます。
> お待ちしております。

やってみました。

問題が2つ。
1つは、サイズ(メモリ不足)です。
Armadillo-IoTのデフォルトのコンフィグレーションに
perl-5.14.2を追加したところ、ブート時のRAMDISK展開で
oom-killerです。

perl-5.14.2を入れることによるサイズの増加は3MBくらいなので、
とりあえず、使う予定のないjavaを外して(javaは13MBくらい)
起動できるようになりました。

もう1つの問題は、romfsへのインストールに失敗している
モジュールがいくつかありました。(Makefileの不備)
romfs/usr/lib/perlの下の

    |-- IO
    |   `-- Socket
    |       |-- INET.pm
    |       `-- UNIX.pm

のところです。
本来は、IOディレクトリ直下にいくつかの.pmファイルが
あるはずなのですけど、インストールされていません。

たとえばこんなエラーが出てました。

romfs-inst.sh destdir/usr/lib/perl/5.14/IO/File.pm \
                /usr/lib/perl/5.14.2/IO/File.pm
cp: 通常ファイル `/home/atmark/work/atmark-dist-20151026/romfs/usr/lib/perl/5.14.2/IO/File.pm' を作成できません: そのようなファイルやディレクトリはありません

mail all でインストールされませんが、make romfsでは入ります。
これはperl/Makefileのバグで、IOディレクトリのmkdirが抜けてました。

Makefileでは、このIOディレクトリのmkdir問題の他に、
次の問題もありました。
- IO/Dir.pmとIO/Poll.pmがインストールされない。
- romfs/lib/libperl.so.5.14.2のインストールに失敗している。

IO/Dir.pmとIO/Poll.pmは、Makefileに記述がぬけているだけです。

romfs/lib/libperl.so.5.14.2は、存在しないものをインストールしようとして、

romfs-inst.sh destdir/usr/lib/libperl.so.5.14.2 \
                /lib/libperl.so.5.14.2
cp: `destdir/usr/lib/libperl.so.5.14.2' を stat できません: そのようなファイルやディレクトリはありません

というエラーになってました。

ここで失敗しても、トップレベルのMakefileで実行される
shard-Library installerによって、クロスライブラリから
インストールされるので問題はないのですが、
これも修正してみました。

perl/Makefileの差分です。

--- Makefile-orig       2015-07-16 10:20:33.000000000 +0900
+++ Makefile    2015-11-04 01:18:53.357580425 +0900
@@ -91,8 +91,9 @@
 
 romfs: install
        $(ROMFSINST) $(DEST_DIR)/usr/bin/perl /usr/bin/perl
-       $(ROMFSINST) $(DEST_DIR)/usr/lib/libperl.so.$(SRC_FULLVER) \
+       $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/CORE/libperl.so.$(SRC_FULLVER) \
                /lib/libperl.so.$(SRC_FULLVER)
+       chmod +w $(ROMFSDIR)/lib/libperl.so.$(SRC_FULLVER)
        $(ROMFSINST) -s libperl.so.$(SRC_FULLVER) /lib/libperl.so.$(SRC_VER)
 
        [ -d $(ROMFSDIR)/usr/lib/perl/$(SRC_FULLVER) ] || \
@@ -126,12 +127,18 @@
                /usr/lib/perl/$(SRC_FULLVER)/Hash/Util.pm
        $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO.pm \
                /usr/lib/perl/$(SRC_FULLVER)/IO.pm
+       [ -d $(ROMFSDIR)/usr/lib/perl/$(SRC_FULLVER)/IO ] || \
+               mkdir -p $(ROMFSDIR)/usr/lib/perl/$(SRC_FULLVER)/IO
+       $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/Dir.pm \
+               /usr/lib/perl/$(SRC_FULLVER)/IO/Dir.pm
        $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/File.pm \
                /usr/lib/perl/$(SRC_FULLVER)/IO/File.pm
        $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/Handle.pm \
                /usr/lib/perl/$(SRC_FULLVER)/IO/Handle.pm
        $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/Pipe.pm \
                /usr/lib/perl/$(SRC_FULLVER)/IO/Pipe.pm
+       $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/Poll.pm \
+               /usr/lib/perl/$(SRC_FULLVER)/IO/Poll.pm
        $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/Seekable.pm \
                /usr/lib/perl/$(SRC_FULLVER)/IO/Seekable.pm
        $(ROMFSINST) $(DEST_DIR)/usr/lib/perl/$(SRC_VER)/IO/Select.pm \

これにより、romfs/usr/lib/perlの下のIOディレクトリのところは
次のようになります。

    |-- IO
    |   |-- Dir.pm
    |   |-- File.pm
    |   |-- Handle.pm
    |   |-- Pipe.pm
    |   |-- Poll.pm
    |   |-- Seekable.pm
    |   |-- Select.pm
    |   |-- Socket
    |   |   |-- INET.pm
    |   |   `-- UNIX.pm
    |   `-- Socket.pm

IO::Socketを使って簡単なhttpクライアントを書いてみたところ、
動作はOKのようでした。
(IO::Socket::INETの一部の機能しか使ってませんが)

--
なかむら

中村です。

> これはperl/Makefileのバグで、IOディレクトリのmkdirが抜けてました。
...
> - IO/Dir.pmとIO/Poll.pmがインストールされない。

こういうミスが発生するのは、Makefileの書き方の問題だと思います。
同じような行が大量にあって、どこかに抜けやミスがあっても、
簡単にはわからないです。

Makefileをちょっといじってみました。
差分ファイルと、修正量が多いので差し替えファイルの両方を添付します。
添付の都合で、Makefileは"Makefile.txt"というファイル名にしてあります。

usr/lib/perlとusr/share/per(unicore以外)lは、元のMakefileを元にして
手で修正しましたが、unicoreのところは2700行くらいあって、
とても手作業でできる量ではありませんでしたので、
ビルドで出来上がったファイルがあるディレクトリから
ファイルの一覧を作って、ファイルリストを作り直してます。

unicoreで次の3つが抜けてました。
不要なものなのかわからないですけど、加えておきました。
CombiningClass.pl
Decomposition.pl
Name.pl

それから、romfs-inst.shは、cpなどのコマンドのエラーを
無視してる(見てない)んですね。
romfs-inst.shでエラーになってもmakeが停止してくれません。

--
なかむら

ファイル ファイルの説明
Makefile.txt perl/Makefile差し替え
Makefile.diff perl/Makefile差分

中村です。

CGI.pmとCGI/*もインストールするようにMakefileを直してみました。
ついでに、あると便利なFile/*も入れてます。

簡単なテストしかしていませんが、動いているようです。

差分と、差し替えファイルの両方を添付します。
添付の都合で、Makefileは"Makefile.txt"というファイル名にしてあります。

--
なかむら

ファイル ファイルの説明
perl-Makefile.patch perlのMakefileのパッチ
Makefile.txt perlのMkefileの差し替え版

ご指摘ありがとうございます。
base modulesにも使用頻度の高いモジュールが含まれており、
こちらにもチェックを入れる方がよいですね。
誤記修正ともどもブログに追記しました。

また、Armadillo-800シリーズでも動作確認済みです。
対象製品に追加しました。

森です。

perlですが、Armadillo-IoTで利用できて重宝しております。
もう一歩進んで、CPAN(http://www.cpan.org/)は、利用可能でしょうか。

現状、Armadillo-IoTにて、rubyでserialportのスクリプトを組んでおりますが、
Armadillo-IoT上のrubyがperlと比較してかなり重たいので、perlからserialportを
利用できないかと考えており、CPANのserialportのモジュールが使えたら、
重宝し、それ以外のモジュールも使いたいと考えております。

以上です。