x64-mswin64版Ruby 2.0.0-preview1をVisual Studio 2012 for Desktopでビルドした

前回 x64-mswin64版Ruby 1.9.3をビルドした - 単なる日記@はてな に懲りず、今回もx64-mswin64版Rubyをビルドしましたのでメモします。記事の内容も前回に沿った形にします。今回はわりと楽でした。
環境はこんな感じ:

使用するソフトウェアはこんな感じ:

  • libiconv-1.11 (artonさんのASRのページから入手)
  • libxml2-2.9.0
  • libxslt-1.1.26
  • openssl-1.0.1c
  • readline-4.3-2 (artonさんのASRのページから入手)
  • yaml-0.1.4 (libyaml)
  • zlib-1.2.5 (artonさんのASRのページから入手)

目標:

  • Rubyやそれに関連するバイナリはすべて64bitにする。
  • ASRのruby console的なものを用意する。
  • Nokogiriインストール時のnative buildに対応する。

資料:

Visual Studio 2012 Express for Desktop

前回使用したVisual Studio 2010 Expressは64bitの開発環境を用意するのが大変でしたが、今回のVisual Studio 2012 Express for Desktopは噂によると最初から64bitの開発環境が用意されているらしく(かつWindows SDKなどを後から入れる必要もないらしい)、実際何もせずに済んだのでたいへん助かりました。

関連ライブラリのインストール

libiconv、readline、zlibはRuby環境構築講座Windows編の記述通りに進めました。
libyamlはプラットフォームにx64を加えてからビルドしました。SDKは勝手に最新のものを使うようになっていましたのでそのまま。
OpenSSLはVC-WIN64Aでビルドしましたが、nasmでのアセンブル中にエラーが出まくるため、Ruby環境構築講座Windows編の記述通りのms\do_nasm.batではなくms\do_win64a.batを使いました。
libxml2とlibxsltはのちほどNokogiriをインストールするために必要なもの。win32と同じビルド方法が使えましたが、libxml2はヘッダファイルのインストール先が微妙に変わったため、libxsltのビルド時にヘッダファイルの位置を指定しました。

Rubyのインストール

前もってよしだむさんがRedmineへ報告されたバグ報告からパッチをもらって当てます。よしだむさんに感謝。

前回同様、都合によりRuby環境構築講座Windows編での方法と異なりインストール先のbinをPATHに加えずに進めたため、configureに--with-opt-dirを指定して関連ライブラリの検出を行えるようにしました。ちなみに--prefixで指定するパスはバックスラッシュ(半角円マーク)区切りですが、--with-opt-dirで指定するパスはスラッシュ区切りにしないと上手くいかないことが過去にありましたので、前回に引き続き今回もそうしました。
もちろん --platform=x64-mswin64 を忘れずに。
ちなみに前回はコマンドプロンプトで手打ちしててよく間違えてましたけど、今回はビルド用バッチファイルを用意しました。

build.bat
@ECHO OFF
CALL %~dp0build-env.bat

SET LOGFILE=%~dp0build.log
COPY NUL %LOGFILE%

ECHO libiconv
ECHO ***** libiconv ***** >>%LOGFILE%
PUSHD libiconv-1.11.1
%NMAKE% -f makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD >>%LOGFILE% 2>&1
%NMAKE% PREFIX=%RUBY_PREFIX% -f makefile.msvc NO_NLS=1 DLL=1 MFLAGS=-MD install 2>&1 >>%LOGFILE% 2>&1
POPD

ECHO readline
ECHO ***** readline ***** >>%LOGFILE%
PUSHD readline-4.3-2\win32
%NMAKE% >>%LOGFILE% 2>&1
%NMAKE% prefix=%RUBY_PREFIX% install >>%LOGFILE% 2>&1
POPD

ECHO zlib
ECHO ***** zlib ***** >>%LOGFILE%
PUSHD zlib-1.2.5
%NMAKE% -f win32\Makefile.msc >>%LOGFILE% 2>&1
COPY *.dll %RUBY_PREFIX%\bin >>%LOGFILE% 2>&1
COPY *.lib %RUBY_PREFIX%\lib >>%LOGFILE% 2>&1
COPY zlib.h %RUBY_PREFIX%\include 2>&1 >>%LOGFILE% 2>&1
COPY zconf.h %RUBY_PREFIX%\include 2>&1 >>%LOGFILE% 2>&1
POPD

ECHO openssl
ECHO ***** openssl ***** >>%LOGFILE%
PUSHD openssl-1.0.1c
perl Configure VC-WIN64A --prefix=%RUBY_PREFIX% >>%LOGFILE% 2>&1
CALL ms\do_win64a.bat >>%LOGFILE% 2>&1
%NMAKE% -f ms\ntdll.mak >>%LOGFILE% 2>&1
%NMAKE% -f ms\ntdll.mak install >>%LOGFILE% 2>&1
POPD

ECHO libyaml
ECHO ***** libyaml ***** >>%LOGFILE%
PUSHD yaml-0.1.4 
COPY win32\vs2008\x64\Release\yaml.dll %RUBY_PREFIX%\bin >>%LOGFILE% 2>&1
COPY win32\vs2008\x64\Release\yaml.lib %RUBY_PREFIX%\lib >>%LOGFILE% 2>&1
COPY include\yaml.h %RUBY_PREFIX%\include >>%LOGFILE% 2>&1
POPD

ECHO libxml2
ECHO ***** libxml2 **** >>%LOGFILE%
PUSHD libxml2-2.9.0\win32
cscript configure.js prefix=%RUBY_PREFIX% >>%LOGFILE% 2>&1
%NMAKE% -f Makefile.msvc >>%LOGFILE% 2>&1
%NMAKE% -f Makefile.msvc install >>%LOGFILE% 2>&1
POPD

ECHO libxslt
ECHO ***** libxslt **** >>%LOGFILE%
PUSHD libxslt-1.1.27\win32
cscript configure.js prefix=%RUBY_PREFIX% include=%RUBY_PREFIX%\include\libxml2 >>%LOGFILE% 2>&1
%NMAKE% >>%LOGFILE% 2>&1
%NMAKE% install >>%LOGFILE% 2>&1
POPD

ECHO ruby
ECHO ***** ruby ***** >>%LOGFILE%
PUSHD %RUBY_VER%
PUSHD .
CALL win32\configure.bat --prefix=%RUBY_PREFIX% --target=x64-mswin64 --disable-win95 --with-out-ext=tk --with-opt-dir=%RUBY_PREFIX_SLASH% >>%LOGFILE% 2>&1
POPD
%NMAKE% >>%LOGFILE% 2>&1
%NMAKE% install >>%LOGFILE% 2>&1
POPD

ECHO bat
ECHO ***** bat ***** >>%LOGFILE%
COPY ruby_console.bat %RUBY_PREFIX% >>%LOGFILE% 2>&1

PAUSE
build-env.bat
CALL "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86_amd64

REM SET RUBY_VER=ruby-1.9.3-p327
SET RUBY_VER=ruby-2.0.0-preview1
SET RUBY_PREFIX=D:\private\tools\%RUBY_VER%
SET RUBY_PREFIX_SLASH=D:/private/tools/%RUBY_VER%
SET NMAKE=nmake /nologo

PATH %PATH%;%RUBY_PREFIX%\bin

ruby console的なものを用意する

前回はバッチファイルを2つ用意しましたが、よくよく考えるとバッチファイルは一つだけでも大丈夫でした。

@ECHO OFF
SET PATH=%~dp0bin;%PATH%
%ComSpec% /k "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86_amd64

Nokogiriのインストール

gem install nokogiriでスムーズにインストールできました。楽ちんだわあ。

まとめ

前回に比べて今回は楽にできました。年末から来年にかけてRuby 2.0.0のリリース準備が行われていますので、みなさんも連休や冬休みなどにお手元のWindows 7Windows 8などでRuby 2.0.0をビルドしてみてはいかがでしょうか。

ところでRuby 1.9.3は?

実は当初Ruby 1.9.3-p327をビルドしようとしたんだけど、Rubyのビルド中にどうにもエラーがとれなくてね。結局諦めて、ダメ元でRuby 2.0.0-preview1をビルドしたらこちらはあっさり通りましたよ、というお話でした。おしまい。