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」も,できるようになりました.