Ruby1.9 に hpricotをinstall しようとして力尽きた

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への道は遠い。

*1:厳密にはsvn headを取得