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年前の竹之下さんバージョンと同じみたいです。
動かしてみるのは・・・早くても来週。
--
なかむら
コメント
y.nakamura
中村です。
> > 動かしてみるのは・・・早くても来週。
> ありがとうございます。
> お待ちしております。
やってみました。
問題が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の一部の機能しか使ってませんが)
--
なかむら
y.nakamura
中村です。
> これは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差分 |
y.nakamura
中村です。
CGI.pmとCGI/*もインストールするようにMakefileを直してみました。
ついでに、あると便利なFile/*も入れてます。
簡単なテストしかしていませんが、動いているようです。
差分と、差し替えファイルの両方を添付します。
添付の都合で、Makefileは"Makefile.txt"というファイル名にしてあります。
--
なかむら
ファイル | ファイルの説明 |
---|---|
perl-Makefile.patch | perlのMakefileのパッチ |
Makefile.txt | perlのMkefileの差し替え版 |
at_mangetsu
mkohei1122
森です。
perlですが、Armadillo-IoTで利用できて重宝しております。
もう一歩進んで、CPAN(http://www.cpan.org/)は、利用可能でしょうか。
現状、Armadillo-IoTにて、rubyでserialportのスクリプトを組んでおりますが、
Armadillo-IoT上のrubyがperlと比較してかなり重たいので、perlからserialportを
利用できないかと考えており、CPANのserialportのモジュールが使えたら、
重宝し、それ以外のモジュールも使いたいと考えております。
以上です。
at_yuma.arakawa
2015年10月15日 11時51分
ブログ記事について、Armadillo-IoT向けのビルド確認と、
記事の内容についてご指摘いただき、ありがとうございます。
他のお客様も参考にできますため、
このようなご報告は大変助かります。
> 動かしてみるのは・・・早くても来週。
ありがとうございます。
お待ちしております。