録箱

[last updated:2005/03/30] [since:2003/11/09]

Ruby 1.8.xをPlan9で動かす

もともとは「Ruby 1.8.0をPlan9で動かす」という題名でしたが、 Ruby 1.8.1にも対応したので、変更しました。

Plan9の Additional Software を見ると、PerlとかPythonとかはあるのに、 Rubyはありません。 ということで、RubyをPlan9でコンパイルしてみることにしました。 Plan9のAPE環境でコンパイル出来るようにすることを目指しました。

成果物を以下に置いておきます。 使用条件は、もとのRubyと同じということで(手抜き)。 このアーカイブのソースコードは、他のプラットフォームではコンパイルできない (かもしれない)形に改変されています。 単にmakeしてmake testを通しただけなので、バグが残っているかもしれません。

Ruby 1.8.1

インストール例

cpu% CFLAGS='-D_BSD_EXTENSION -D_LIMITS_EXTENSION'
cpu% ./configure --prefix'='$home
                 --bindir'='$home/bin/$objtype
                 --libdir'='$home/lib
                 --build'='i386

Ruby 1.8.1では、--with-default-kcode=utf8を指定すると、make testで失敗する ようです。

変更メモ

基本的には、1.8.0と同じ改変がなされていますが、幾つか異なる部分もあるため、 以下に変更をリストアップします。

bignum.c
eval.c
io.c
file.c
ruby.h
re.c
marshal.c
missing/isinf.c
missing/isnan.c
ext/Setup
ext/bigdecimal/bigdecimal.c
ext/socket/socket.c
ext/socket/addrinfo.h
instruby.rb

Ruby 1.8.0

以下に、行なった改変についてのメモを記載しておきます。

compile & link

configure
bignum.c
eval.c
io.c
ruby.h
marshal.c
parse.c
re.c
time.c
io.c/file.c
ext/Setup

make test

missing/isinf.c

厄介な問題たち(日付順に列挙)

2003/10/19
make testで、stack underflowした。 sample/test.rbの構文解析中に落ちるようである。(ruby_strtod関数)
2003/10/28
sample/test.rbの中で、 test_check "condition" 以降に浮動小数点数があるとruby_strtodでこける。 test_check "assignment" 以前にある場合は、そこでは落ちない。 a,b,*c = loop do break []; end; test_ok([a,b,c] == [nil,nil,[]]) が境界線のようである。
2003/10/31

gc.cについて、GCの実行を殺してみる。

まだ、「0/0!=NaN」およびreadでのIOErrorの問題がある。

2003/11/02

Plan9の8c(386コンパイラ)には、NaNの取扱に関するバグがあるような気配である。

readの問題は調査中。io.cのremain_sizeでこけている。st.st_sizeやtellの 結果がおかしいようである。

2003/11/03
st.size問題については、Plan9のコンパイラとoff_t=long longの問題である ような気配である。stat構造体のバイナリダンプは正しいのに、状況によって .や->でアクセスしたメンバの値が変わる事があるようである。
2003/11/06

stat構造体について、本来のsizeof(struct stat)は32であるが、 #include "ruby.h"をすると(-L. -lruby-staticも必要)、 sizeof(struct stat)が36になってしまう。

あとは、Marshalについてnot okがある。(浮動小数点数に誤差が出る)

2003/11/07
load_mantissaの定義箇所で、#ifdef DBL_MANT_DIGが真の方に入った場合に load_mantissaが定義され、偽の場合はload_mantissaは空の定義となる。
2003/11/08

save_mantissaの処理を簡単なプログラムで確かめていくと、

d = modf(ldexp(d, MANT_BITS),&n);
m = (unsigned long)n;

にて、mが0x80000000になってしまっている。(本当は、0xce560000)

以上でmake testは通った。

extライブラリ

bigdecimal

bigdecimal.h
bigdecimal.c

socket

socket.c
addrinfo.h

fcntl

racc/cparse

stringio

strscan

他は、ライブラリの不備により恐らくコンパイル不可能。

その他

インストールに関する選択

instruby.rb

configure実行時のオプション例

--prefix=$home
--bindir=$home/bin/$objtype
--libdir=$home/lib
--with-default-kcode=utf8
--build=i386

make install

IOError "sysread for buffered IO"でこける

io.c

NotImplementedError: "`truncate': The truncate() function is unimplemented on this machine"でこける

instruby.rb

録箱

anraku@lemon.plala.or.jp