Ruby1.9への移行も考えて、ruby1.8 と ruby1.9 の共存 - tashenの日記に書かれたままの方法でインストール*1した。で、
sudo gem1.9 install mechanize
とすると
make gcc -I. -I/usr/local/include/ruby1.9-1.9.0/i386-freebsd7.0 -I/usr/local/include/ruby1.9-1.9.0/ruby/backward -I/usr/local/include/ruby1.9-1.9.0 -I. -DHAVE_STDIO_H -fPIC -O2 -g -Wall -Wno-parentheses -ofast_xs.o -c fast_xs.c fast_xs.c: In function 'fast_xs': fast_xs.c:169: error: 'struct RArray' has no member named 'ptr' fast_xs.c:170: error: 'struct RArray' has no member named 'len' fast_xs.c:175: error: 'struct RArray' has no member named 'ptr' fast_xs.c:176: error: 'struct RArray' has no member named 'len' *** Error code 1 Stop in /usr/local/lib/ruby1.9/gems/1.9.0/gems/hpricot-0.6.164/ext/fast_xs.
とエラーを吐く。調べてみると、Ruby1.8とRuby1.9でRArrayの構造体が変わっている。で、下のように適当に直して試してみようとした。チャチャッと書いただけなので正しいかどうかも分からない。
VALUE fast_xs(VALUE self) { long i; struct RArray *array; char *s, *c; long s_len = 0; VALUE *tmp; array = RARRAY(rb_rescue(unpack_utf8, self, unpack_uchar, self)); /* tmp = array->ptr; */ tmp = RARRAY_PTR(array); /* for (i = array->len; --i >= 0; tmp++) */ for (i = RARRAY_LEN(array); --i >= 0; tmp++) s_len += escaped_len(NUM2INT(*tmp)); c = s = alloca(s_len + 1); /* tmp = array->ptr; */ tmp = RARRAY_PTR(array); /* for (i = array->len; --i >= 0; tmp++) */ for (i = RARRAY_LEN(array); --i >= 0; tmp++) c += escape(c, NUM2INT(*tmp)); *c = '\0'; return rb_str_new(s, s_len); }
確認のためにインストールを試みたのだけど、gemsがファイルの修正を更新してしまう。しかたがないのでrakeで直接インストールしようとしても別の理由エラーになる。だめだ、FreeBSDは良くわからん。Ruby1.9への道は遠い。