ruby 1.9.1-p0 @ Visual C++ 2005

12月31日、Ruby 1.9系統初の安定版となるRuby 1.9.1のリリース候補版が公開された。Ruby公式サイトにダウンロード用URLが掲載されている。

Ruby 1.9.1 リリース候補版公開:CodeZine(コードジン)

年明け以降公式サイトを訪問してなかったので、全く気付かなかった。安定版としての 1.9.1 のリリースは今月下旬以降になりそうかな?
とりあえず試してみようかと思ったけど、ruby 1.8で、外部からパッケージを持ってきたり、rubygem install するたびに、Visual C++ 6.0 の CD を入れて環境設定するのが面倒くさかったので、今開発環境にしている Visual C++ 2005 でソースコードからビルドすることにした。
公式サイトから 1.9.1 RC の tar ball をダウンロードして展開、ruby-1.9.1-rc1/win32/ に入り、README.win32 を開いて手順を確認。それほど難しくなさそうだ、けど・・・

1.開発環境の環境変数設定

方法としては例の環境変数設定バッチファイルを叩くか、VC++コンソールを開くか、自分で設定するか、の三通りあるけど、今回はバッチファイルを叩いた。

>"\Program Files\Microsoft Visual Studio 8\vc\vcvarsall.bat"
Setting environment for using Microsoft Visual Studio 2005 x86 tools.

後々で気付いたけど、ここで手順に書いてない罠があった。zlib のヘッダ、ライブラリがあるディレクトリをそれぞれ INCLUDE, LIB 環境変数に通しておかないと、zlib モジュールがインストールされずに、rubygems が拗ねてしまう。デフォルトの環境変数設定では、zlib は存在しないので、この罠にはまってしまった。手順書だけでなくトップの README にも書いてないし・・・

>SET INCLUDE=c:\lib\zlib\include;%INCLUDE%
>SET LIB=c:\lib\zlib\lib;%LIB%

SVN リポジトリから取ってきた場合は、他に bison, sed が必要になるらしいけど、ftp から落としてきた物なので、必要なさそうかな。

2.configure

Windows ならでは、ってことでバッチファイル版の configure.bat が用意されている。
D:\ruby 下にインストールしたいので、パラメータにパスを指定して configure。

>configure --prefix=D:\ruby
...

configure 出来たら、Makefile を開いて名前を変えたり出来るよ、と手順にあるけど、デフォルトの名前で十分なので、それはしなかった。

3.make, test, install

ここまで来れば、あとは無事通ってくれることを祈るのみ。Visual C++ では make じゃなくて nmake。

>nmake
...
>nmake test
...
>nmake install
...

なんとか、無事に通ってくれたけど、この先何かが起きようとは誰も知る由もなかった・・・

rubygems が動かない?

hpricot は標準で入っていないので rubygems で入れる必要があった。ということで、rubygems で入れようとすると、なんか zlib ねーよっていうエラーが。これが 2. で言った罠で、しっかり引っかかってしまった。ひどいよね。
仕方ないので後付で zlib をビルドしに行った。ruby-1.9.1-rc1/ext/zlib に入り、extconf.rb で Makefile を生成して、nmake。

>nmake
...
zlib.c
指定されたパスが見つかりません。
...
        mt -nologo -manifest zlib.so.manifest -outputresource:zlib.so;2
指定されたパスが見つかりません。
...

とりあえず生成は出来ているみたいだけど、なんかおかしいエラーが・・・?

rbconfig が変だ?

nmake は /N オプションで実行コマンドリストが見られるので、出してみると

>nmake /N
...
        C:\WINDOWS\system32\cmd.exe /C \win32\rm.bat zlib.so
...
        C:\WINDOWS\system32\cmd.exe /C \win32\rm.bat zlib.so.manifest

わけがわからない。Makefile を見てみると、

RM = $(COMSPEC) /C $(top_srcdir:/=\)\win32\rm.bat

これが原因らしい。top_srcdir が設定されてないので、そんなバッチファイルはないと転けているわけか。RM の出所はどこだろう・・・? Makefile を生成する extconf.rb によると、mkmf モジュールが関わっているらしい。
mkmf モジュールの本体は \lib\ruby\1.9.1\mkmf.rb。覗いてgrepしてみると、あったあった。

RM = #{config_string('RM') || '$(RUBY) -run -e rm -- -f'}

つまり、config_string('RM') がそんな感じに設定されているということかな。
config_string は何かというと、ただの関数で 72 行目に定義が書いてあった。

def config_string(key, config = CONFIG)
  s = config[key] and !s.empty? and block_given? ? yield(s) : s
end

CONFIG 配列から文字列を引く関数らしい。CONFIG の定義は8行目。

CONFIG = RbConfig::MAKEFILE_CONFIG

RbConfig にその定義を羅列した配列があるようだ。RbConfig は \lib\ruby\1.9.1\i386-mswin32_80(ビルド環境依存?) の rbconfig.rb がその本体。覗いて検索すると・・・

  CONFIG["CP"] = "copy > nul"
  CONFIG["RM"] = "$(COMSPEC) /C $(top_srcdir:/=\)\win32\rm.bat"
  CONFIG["ALLOCA"] = ""

これはひどい。抹消したい気持ちを抑えて、当該行だけデリートしておいた。
再度ビルドし直してみると、エラーもなく完了。すっきり。

試してみる

ビルドだけで体力を使い果たしたので、hpricotのインストールや新機能のお試しは後にしよう・・・