わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

CygwinでRubyスナップショットをビルド

Cygwinで,Rubyの最新版および安定版スナップショットをビルドし,つまずきどころを確認しました.
Cygwin 1.7を前提としています.1.5の方はhttp://www.cygwin.com/をご覧の上でアップデートを行ってください.Cygwinのバージョンは,シェルを起動させて「cygcheck -c cygwin」で知ることができます.
ビルドのほうは,make,gccなどdevelのパッケージをきちんと入れていて,~/src を作っておき,ビルドのための設定をしておいたら,ruby-installの実行でインストールしてくれます.
しかしそのままでは,次のようなメッセージが延々と出力され,gemでsqlite3やiconvなど,Pure Rubyでないものを入れることができません.

$ gem install sqlite3
Fetching: sqlite3-1.3.7.gem (100%)
Building native extensions.  This could take a while...
      0 [main] ruby 6712 child_info_fork::abort: address space needed by 'fcntl.so' (0x4C0000) is already occupied
      0 [main] ruby 3804 child_info_fork::abort: address space needed by 'date_core.so' (0x5E0000) is already occupied
(以下略)

アドレス空間がなんたらと言っているので,rebaseの問題です.よく知られている対策は,シェルをはじめCygwinプロセスをすべて終了させ,Cygwinのパスをたどってash.exeを起動し,「rebaseall」を実行すること,なのですが,これでもうまくいきません.
解決のヒントは

にありました.そこでは,「"/usr/local" ディレクトリ配下の "*.so" ファイル全てを指定」していますが,自分のruby-installの件に置き換えると,「ホームディレクトリの中 .so で終わるファイルを指定」することになります.
具体的には,普段のシェルで

$ find ~ -name '*.so' > ~/rebase_so.lst

を実行して,rebaseの対象となるファイル名リストを作ります.
それからシェルを抜け,ash.exeをダブルクリックで起動し,そ次のコマンドを実行します.

$ cd
$ rebaseall -T rebase_so.lst -v
$ exit

再び普段のシェルを起動.これで,「gem install sqlite3」も「gem install iconv」も,できるようになりました.