Ruby1.8.7 mswin32版のビルド
せっかくコンパイラが手元にあるのだし、バグFIXにしても最新の仕様を取り込むためにも、バイナリ配布を指を咥えて待たないためにも一度ビルドしておかなきゃ駄目だろうと思い、試してみた。(といっても、一般的に紹介されているVC版の手順をなぞるだけだが)
1. ソースコードを入手する
リポジトリに直接接続できる環境にないので、今回はruby_1_8ブランチ安定版を本家サイトから取得して解凍、使用することにした。
2. Visual Studio関連のパスを通す
といっても該当のバッチを実行するだけ。最新版は仕事のこともあってインストールしてしないのでVisual Studio 2005を使用する
D:\Program Files\Microsoft Visual Studio 8\VC\bin>vcvars32.bat D:\Program Files\Microsoft Visual Studio 8\VC\bin>"D:\Program Files\Microsoft Visual Studi o 8\Common7\Tools\vsvars32.bat" Setting environment for using Microsoft Visual Studio 2005 x86 tools.
Visual Studioはmakeの前にこれをやらないと始まらないよな。
3. make
ruby\win32ディレクトリに移動してconfigure.batを実行。これでmakefileが生成されるのでガイダンスに沿って、makeではなくnmakeを実行するだけだ。
E:\ruby>win32\configure.bat Creating Makefile type `"D:\Program Files\Microsoft Visual Studio 8\VC\BIN\nmake.exe"' to make ruby for mswin32. E:\ruby>nmake Microsoft(R) Program Maintenance Utility Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. Creating config.h config.h updated. Creating config.status cl -nologo -MD -O2b2xty- -DRUBY_EXPORT -I. -I./.. -I./../missing -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -Tc./../array.c array.c: : :省略 : 'svn' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 cl -nologo -MD -O2b2xty- -DRUBY_EXPORT -I. -I. -I./missing -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -Tcversion.c version.c e:\ruby\version.h(31) : fatal error C1083: include ファイルを開けません。'revision.h': No such file or directory NMAKE : fatal error U1077: '"D:\Program Files\Microsoft Visual Studio 8\VC\BIN\cl.EXE"' : リターン コード '0x2' Stop.
ありゃ。止まっちまった。
トレースから推測するにsvnが使えないんでrevision.hを読み込めない、結果としてversion.cのコンパイルに失敗しているらしい。
Makefile.subより抜粋
revision.h.tmp: $(REVISION_FORCE) @set LC_MESSAGES=C -@$(SET_LC_MESSAGES) $(VCS) info "$(srcdir)" | \ sed -n "s/.*Rev:/#define RUBY_REVISION/p" > "$@"
"svn info srcdir"コマンドを発行、その結果をsedに渡してRUBY_REVISIONだけが記述されたrevision.hをここで作るらしい。(makeファイルに関しては全く解らないのだが、なんとなくやっていることを推測している)
当然のことながらsvnもsedもインストールしていない。それでも通常のmakeの場合はmake upを実行すると同様にrevision.hが生成することができるらしいのだが、nmakeの場合は無いみたいんで、revision.hを手動で作成。カレントに置いてみた。
手動で作ったrevision.h (この時点での1.8系プランチのレビジョンは22714)
#define RUBY_REVISON 22714
これでもう一度nmakeを実行。進んだみたいだが、またエラーが...
: cl -nologo -MD -O2b2xty- -DRUBY_EXPORT -I. -I. -I./missing -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -c -Tcversion.c version.c lib -nologo -machine:x86 -out:msvcr80-ruby18-static.lib array.obj bignum.obj class.obj compar.obj dir.obj dln.obj enum.obj enumerator.obj error.obj eval.obj file.obj gc.obj hash.obj inits.obj io.obj marshal.obj math.obj numeric.obj object.obj pack.obj parse.obj process.obj prec.obj random.obj range.obj re.obj regex.obj ruby.obj signal.obj sprintf.obj st.obj string.obj struct.obj time.obj util.obj variable.obj version.obj acosh.obj crypt.obj erf.obj win32.obj dmyext.obj oldnames.lib user32.lib advapi32.lib shell32.lib wsock32.lib cl -nologo main.obj dmydln.obj msvcr80-ruby18-static.lib oldnames.lib user32.lib advapi32.lib shell32.lib wsock32.lib -Feminiruby.exe -link -incremental:no -debug -opt:ref -opt:icf mt -nologo -manifest miniruby.exe.manifest -outputresource:miniruby.exe;2 rbconfig.rb unchanged .\miniruby.exe -I./lib ./win32/mkexports.rb -output=msvcr80-ruby18.def msvcr80-ruby18-static.lib lib -nologo -machine:x86 -out:msvcr80-ruby18.lib -def:msvcr80-ruby18.def ライブラリ msvcr80-ruby18.lib とオブジェクト msvcr80-ruby18.exp を作成中 compiling win32api copy > nul ../.././ext/win32api/lib/win32/registry.rb ../../.ext/common/win32 NMAKE : fatal error U1077: 'copy' : リターン コード '0x1' Stop. NMAKE : fatal error U1077: '.\miniruby.exe' : リターン コード '0x1' Stop.
コアのコンパイルは成功したみたいだが※、その後/ext/配下の拡張ライブラリィのコンパイルに失敗しているようだ(最初のwin32apiで止まっている)な。
この部分、それぞれの拡張ライブラリィ毎に用意されているextconf.rbから生成されたmakefileがnmakeに適合していないらしい。
問題を絞り込むために、失敗したタスクのみ実行してみよう。(vcvars32.batは実行済みとする)
E:\ruby\ext\Win32API>nmake Microsoft(R) Program Maintenance Utility Version 8.00.50727.762 Copyright (C) Microsoft Corporation. All rights reserved. NMAKE : fatal error U1077: 'copy' : リターン コード '0x1' Stop.
ここで時間切れ。
配布バイナリ使わせて頂くだけとは違い、すんなりいかないとは聞いてはいたが...これではいつまでたってもプログラミングそのものに入れないな。(苦笑
※別途、nmakeをタスク別に実行してみたが、それぞれのタスクの成功は確認している。
nmake dll nmake ruby nmake rubyw namek test
本日のエントリで参考にさせて頂いたサイト
rubyビルドガイド
build Ruby on Windows 【第 1 回 - Rubyist Magazine】
build Ruby on Windows 【第 2 回 - Rubyist Magazine】
Ruby Install Guidemswin32 (ソースから)