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のインストールや新機能のお試しは後にしよう・・・