Ruby1.8.7 mswin32版のビルド

せっかくコンパイラが手元にあるのだし、バグFIXにしても最新の仕様を取り込むためにも、バイナリ配布を指を咥えて待たないためにも一度ビルドしておかなきゃ駄目だろうと思い、試してみた。(といっても、一般的に紹介されているVC版の手順をなぞるだけだが)

1. ソースコードを入手する
リポジトリに直接接続できる環境にないので、今回はruby_1_8ブランチ安定版を本家サイトから取得して解凍、使用することにした。

Ruby ダウンロード


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ファイルに関しては全く解らないのだが、なんとなくやっていることを推測している)
当然のことながらsvnsedもインストールしていない。それでも通常の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 (ソースから)