Ruby 1.6.8 on MacOSX Leopard

懐かしのRuby 1.6をコンパイルする。

ソース取得

ソースは http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_6 にある。

コンパイル

$ autoconf
$ ./configure --program-suffix=-1.6
$ make miniruby

ここまでは良い。問題は添付拡張ライブラリのコンパイルである。

lib/mkmf.rb

61行目付近にある rm_f がうまく動作しない。conftestで作成するバンドルのところで転ける。システムにとってはライブラリファイルだけどUNIXインターフェースにとってはディレクトリ、という状況を想定してないのだろう。

面倒なので、こう書き換える

  def rm_f(*files)
    system 'rm', '-rf', *files
    return
    # .... もとの実装
  end

ext/extmk.rb

44行目付近にあるrm_fが同じく

rbconfig.rb

まず、12行目のsrcdir。 /path/to/checkout/dir/'.' とか、余計な '.' が付いているので削除する。

それから、あちこちによく分からない |#!!#| という記号が付いているので全部削除する。

readline

readlineのヘッダと整合性がとれてなくてコンパイルできないっぽい。直すのが面倒なので捨てる。

ext/readline/extconf.rb の9行目を

if false and have_header("readline/readline.h") and

と無効にしてしまう。

ext/readlineのディレクトリ丸ごと消すのでも良いと思う。

make

ここまででmakeできる。

make install

make installすると、ftools.rbが見つからなくてinstruby.rbが転ける。Makefileを編集して、installのルールのminirubyを実行してるやつに、" -Ilib "を足す。

./miniruby$(EXEEXT) -Ilib $(srcdir)/instruby.rb --mantype=$(MANTYPE) $(DESTDIR)

それから、ruby_install_nameがなくて nil + String で例外が起きる。これを避けるためにrbconfig.rbを編集する。

  CONFIG["RUBY_INSTALL_NAME"] = "ruby-1.6"

とか書いてある行があるので、これをコピーして

  CONFIG["ruby_install_name"] = "ruby-1.6"

みたいな行を作る。

これでmake installできる。

おことわり

言うまでもないけど、くれぐれも自己責任で。うっかりruby 1.8を上書きして泣かないように。