Armadillo9でRubyを動かす。
取りあえず"Hello World!"、そしてwebrickまで動いてくれた。ビルドには下記を参考に。
configureのsetpgrpあたりでエラー発生。configure.in から AC_FUNC_SETPGRP を削除して、autoconf すると消えた。下記を参照。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/16160
「Android Dev Phone1 であそぶメモ」
http://android-dev.g.hatena.ne.jp/takuma104/
./ext/extmk.rb:357: undefined method `<<' for nil:NilClass (NoMethodError)
上記エラーの対処として、
$ruby = CONFIG['MINIRUBY'] || ''
を参考にした。
あとは、configureの--host=arm-linuxあたりや--with-ld=/usr/local/bin/arm-linux-gnu-ldあたりを設定してmakeすれば、できてくれるみたい。debianに慣れてなくて色々行ったり来たりしてしまったが。
configureは下記のような感じで。
./configure --host=arm-linux --prefix=/usr/local --with-as=/usr/arm-linux/bin/arm-linux-gnu-as --with-ld=/usr/arm-linux/bin/arm-linux-gnu-ld --with-headers=/usr/arm-linux/include --with-libs=/usr/arm-linux/lib --enable-shared --disable-nls --with-bundled-sha1 --with-bundled-md5 --with-bundled-rmd160
それをArmadilloへ転送する。libruby.soも忘れずに。
rootfsはCF上に作成。NFS経由でrubyを転送して、動作確認。
lib**.soが無いと言われるので、言われるがままにPC上の/usr/arm-linuxからArmadillo上の/libにコピーして、やっとHello Worldできた。
上手くいったかと思っていたが、socket.soが無い!
configureオプションに --disable-ipv6 を加えると、socketのコンパイルが始まったが、またエラー。
addrinfo.h:167 error: conflictong types for 'gai_strerror'
下記を参考にしてみる。型を無理矢理変えると通るみたいだが…。
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-dev/16160
addrinfo.hとgetaddrinfo.cのgai_strerror()の宣言にconstを加えると通った。
で、試しにwebrickをrequireしてみたら、またエラー。
[root@a9-0 (ttyp0) /mnt/ruby-1.8.7-p174]# ruby -I/lib -e 'require "webrick"' /lib/digest/md5.so: /lib/digest/md5.so: undefined symbol: MD5_Init - /lib/digest/md5.so (LoadError) from /usr/local/lib/ruby/1.8/webrick/httpauth/digestauth.rb:18 from /usr/local/lib/ruby/1.8/webrick/httpauth.rb:12:in `require' from /usr/local/lib/ruby/1.8/webrick/httpauth.rb:12 from /usr/local/lib/ruby/1.8/webrick.rb:29:in `require' from /usr/local/lib/ruby/1.8/webrick.rb:29 from -e:1:in `require' from -e:1
困った。どうもmd5init.c中で、ヘッダファイルのincludeするかしないかの判断で問題があるようだけど、面倒なので、ext/digest/md5/md5init.cに下記を追加。
extern void MD5_Init _( (MD5_CTX *pms)); extern void MD5_Update _( (MD5_CTX *pms, const uint8_t *data, size_t nbytes)); extern void MD5_Finish _( (MD5_CTX *pms, uint8_t *digest));
同様にsha1も変更。そしたらrequireできた。でもハッシュがちゃんと計算できているのかどうかは確認してない。
やっとwebrickが動いた。
[root@a9-0 (ttyp0) ~]# ruby -I/lib server.rb [2000-01-01 21:17:38] INFO WEBrick 1.3.1 [2000-01-01 21:17:38] INFO ruby 1.8.7 (2009-06-12) [arm-linux] [2000-01-01 21:17:38] INFO WEBrick::HTTPServer#start: pid=1194 port=10080 192.168.32.100 - - [01/Jan/2000:21:17:41 JST] "GET / HTTP/1.1" 200 66
これでRubyを使ってネットワーク関係のプログラミングができますね。