levenshtein-0.2.0-1.9

Erik Veenstra氏によるlevenshtein-0.2.0wrsに使っていたのだが、 ruby が 1.9 になってからうまくコンパイルできなくなっていた。 いや、もともとうまくコンパイルできないんで、工夫が要ったのだけど。 それでなんかいつも授業準備ばかりで煮詰まったので、 ソースをつらつら眺めてみると、 ruby-1.8 の ruby.h では

struct RArray {
    struct RBasic basic;
    long len;
    union {
        long capa;
        VALUE shared;
    } aux;
    VALUE *ptr;
};

となっているのが、ruby-1.9 では

struct RArray {
    struct RBasic basic;
    union {
        struct {
            long len;
            union {
                long capa;
                VALUE shared;
            } aux;
            VALUE *ptr;
        } heap;
        VALUE ary[RARRAY_EMBED_LEN_MAX];
    } as;
};

などとなっており、構造体や共用体の階層が深くなっていることがわかる。 で、

 l1    = RARRAY(rb_o1)->len;

となっているようなところを、

 l1    = RARRAY(rb_o1)->as.heap.len;

のように書き換えてやればコンパイルが通ることがわかった。 RString 構造体関係も同様に書き換えてやる必要がある。

このように、Ruby 1.9 は Array や String などの基本的な型の内部構造がかなり変更されているので、 外部ライブラリがそのままではコンパイルできないようになってしまったのだと思われる。

ま、ともかくやっとこれでうちも Ruby 1.9 に移行できる。やれやれ。 Rubyのパッケージの作り方とかよくわからんのだが、とりあえず levenshtein-0.2.0-1.9.tar.gzというものを置いておく。 展開して

ruby extconf.rb

して

make install

すればインストールされるはず。