わさっきhb

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

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

Rubyのスナップショットをビルド―2.1.0dev & 2.0.0対応―に記した対策のうち,「intern.hに#include を書く」については,今朝,安定版スナップショットを見てみると,コードが入っていました.よかったよかったです.
しかし,めでたしめでたしです,とはいきません.別の不具合に気づきまして,一つ一つ,対応を試みましたので,報告します.

configureで止まる

ソースファイルのダウンロードと伸張までは,問題ありません.しかし./configureの実行で,出るべきメッセージが一切出なくなりました.Cygwinの複数の環境で,ビルド時にこの不具合が発生しました.
ソースのせいではありませんでした.Rubyのビルドと別のところでも,トラブルに見舞われ,そこでふと,次のコマンドを実行したときに,原因が分かったのでした.

$ which diff
/cygdrive/d/w32tex/bin/diff

このパスを見て,最近,TeXインストーラ 3を使ってインストールなりアップグレードなりを行ったことを思い出しました.そのときに,platex.exeなどの実行パスが設定され,それがRubyのビルドを行うCygwinにも反映されて*1,/usr/bin/diffよりも優先してしまった,という次第です.
対策として,diffほかの基本コマンドは/usr/binのものを使うよう,zshスクリプトを書きました.

export W32TEX_BASE=""
for d in c d e f
do
    if [ -d "/cygdrive/$d/w32tex/bin" ]
    then
        W32TEX_BASE=/cygdrive/$d/w32tex
        break
    fi
done
if [ -n "$W32TEX_BASE" ]
then
    PATH=$W32TEX_BASE/bin:$PATH
    function w32tex-disable-exe() {
        for f in basename cat cmp cp curl diff dirname egrep expr grep gunzip gzcat gzip mkdir nkf rm sed sort tar tie uniq unzip zip
        do
            echo "$W32TEX_BASE/bin/$f.exe => $W32TEX_BASE/bin/w32tex_$f.exe"
            mv $W32TEX_BASE/bin/$f.exe $W32TEX_BASE/bin/w32tex_$f.exe
        done
    }
else
    unset W32TEX_BASE
fi

zshを起動して,

$ w32tex-disable-exe
(出力:略)
$ which diff
/usr/bin/diff

これで,configure……いつものメッセージが出るようになりました.

gem update/installでmakeに失敗

2.1.0devで出た不具合です.
Rubyのインストールまでは,うまくいきました.which ruby,そしてgem listの出力も,問題ありません.gemパッケージをアップデートしようとすると,forkがらみの異常が発生します.

$ gem update
(略)
Updating json
Building native extensions.  This could take a while...
      0 [main] ruby 4060 child_info_fork::abort: unable to remap fcntl.so to sam
e address as parent (005D0000) - try running rebaseall
      0 [main] ruby 6216 child_info_fork::abort: unable to remap openssl.so to same address as parent (02510000) - try running rebaseall
      0 [main] ruby 4268 child_info_fork::abort: address space needed by 'fcntl.so' (0x5D0000) is already occupied
(Ctrl+Cで停止)

おそらくjsonだけでなく,ビルドを行う(Pure Rubyでない)パッケージのインストールやアップデートで,同様の事態になることが予想されます.
メッセージにあるとおり,rebaseallを実行します.手順は次のとおり.

  1. シェルで,「find ~ -name '*.so' > ~/rebase.lst」を実行します.少し時間がかかります.
  2. Cygwinを使用しているプログラム(シェルのほか,emacs---cmigemoを使用しているため)を終了します.
  3. エクスプローラで,(Cygwinのパス)\bin\ash.exeを見つけてダブルクリックします.
  4. 「cd」「rebaseall -v -T rebase.lst」を実行します.少し時間がかかります.
  5. ashを終了します.

としたところで,いつものシェルを開いて,

$ gem update
(略)
Updating json
Building native extensions.  This could take a while...
Successfully installed json-1.8.0
Parsing documentation for json-1.8.0
Installing ri documentation for json-1.8.0
Installing darkfish documentation for json-1.8.0
Done installing documentation for json after 2 seconds
Gems updated: json

うまくいきました.

*1:platex,dvipdfmxなどは,そのパスの実行コマンドを使い,Cygwinのシェルで実行しています.