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をビルドしたらこちらはあっさり通りましたよ、というお話でした。おしまい。

2012-10-30

今日は半日くらい外向きの文章を書いては消し、書いては消ししてた。
C++でmain()より先に実行される処理をライブラリ化したい - QA@IT
ひとつは上記リンク先で、プログラミングのお悩み相談。起きている問題と、本当に解決したい問題が別なのでややこしい。ただ、どちらにしろ解決したい問題ではある。
もうひとつは仕事で某所へ質問を書いた。ただ、これが最初の文を書いている内、自分の書いた内容に疑問を持って検証したらそれ自体には問題がなく、代わりに別の問題が起きたのでそれの質問を書いている内に…みたいなことがいくつか連続して、最終的にはコンパクトな質問になった。
よく頭で悩んでいることを文章に起こしてみると矛盾が見つかったり解決方法が浮かび上がったりすることがあって、今回も同様だった。ただ一番の問題は、悩んでばかりで仕事が進んでいないことなんだがw いや笑い事ではないか。

「iMac 1TB Seagate ハードドライブ交換プログラム」についてAppleへ問い合わせた

交換/リペアエクステンションプログラム - Apple サポート
Appleから上記プログラムのお知らせが届いた。会社のiMacがそのプログラムの対象となるらしいが、実は会社のiMacのHDDを今年6月に交換したばかり。4ヶ月くらいでまた交換ってのもどうかと思ったり、上記リンク先に返金も受け付けてくれそうなことが書いてあったので、ひとまずAppleサポートに連絡してみた。
電話に出たサポートの担当者から聞いた感じでは、とりあえず交換するか、とりあえず返金の手続きをすすめるくらいしかできることがなく、手元の交換済みHDDが大丈夫なものなのかどうかとい細かい情報はまだ持っていないようだった。
こちらとしては現状普通に動いてるし、サポートからは来年春頃までプログラムが継続されるっぽく*1、その頃にはマズいハードの詳細もつかめるんじゃないかみたいな雰囲気だったので、また後日改めて連絡するってことにした。

*1:と、口頭では聞いたのだが、実際にはわからない。

自宅の居間のテレビを買い換えた

自宅の居間に置いてある液晶テレビ(ソニー KDL-23A10)が不調のため、母からの希望でテレビを買い換えた。
当初は同じソニーの26インチのものにしようとしたが若干お高めだったので、店頭でシャープ製のものに決めた。ただし、26インチのテレビが軒並み品切れで、同じシャープの32インチのもの(シャープ LC-32V7)にした。後日自宅のテレビを引き取ってもらうべくリサイクルの手続きもしておいた。
とりあえずテレビを配置、BDデッキとCATVのSTBからの入力をテレビで確認した。画面が大きくなって母もご満悦の様子。二人して何回も画面のでかさを確認しあったりとか。
自宅で留守番の間、テレビのDNLAプレイヤー機能を使ってnasneに保存された番組を見てた。でかい画面で氷菓 #21を視聴しながら僕もご満悦。なんかすげー便利な世の中になったものだなあ。

シャープ 32V型 液晶 テレビ AQUOS LC-32V7-B ハイビジョン   2012年モデル

シャープ 32V型 液晶 テレビ AQUOS LC-32V7-B ハイビジョン 2012年モデル

++age;

日付が変わってしまいましたが、昨日42歳になりました。去年や一昨年に比べてあまり感慨もなく誕生日を迎えましたが、まあこういう穏やかな誕生日もいいんじゃないでしょうか。ちょうど仕事の方も落ち着き始めてるので、昨日は平日でありながらわりとのんびりとした一日を過ごせました。
仕事では去年の誕生日以降からするとPSPが3本、DSが1本、iPhoneのお手伝いが1本と、発売タイトル数からするとわりと働いた気がします(笑)。ただ仕事の遅さというか集中力の無さがひどくて、しかもそれがあとになって響いてしまって会社に泊まって作業することが多くなりました。色々言い訳はあるんですが結果を出さんと意味が無いので、まあ今後は頑張りますということで勘弁。
プライベートの方は正直ほとんど記憶に無いです。多分Twitterなどに書き残したものを読んだり、こんなことあったよねなどと話しかけられないと思い出せない状態です。ああ、直近の大きな話題としてはMacBook Pro with Retina Display(SSDが512GBの方)を買いました。
なんか厄年(本厄)らしいので、ひっそりと暮らしていきたいと思います。そんなこんなで、今後ともよろしくおねがいします。

x64-mswin64版Ruby 1.9.3をビルドした

2012-07-03追記: NokogiriのGitHubのURLが変更されたことへの追従。https://github.com/tenderlove/nokogirihttps://github.com/sparklemotion/nokogiri

以前から何度も玉砕している、x64-mswin64版Ruby 1.9.x(今回は1.9.3-p125)のビルドに成功したので、やったことをメモっておく。
環境はこんな感じ:

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

  • libiconv-1.11 (artonさんのASRのページから入手)
  • libxml2-2.7.8
  • libxslt-1.1.26
  • openssl-1.0.0g
  • 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 C++ 2010 Express

正直64bitの開発環境を用意するところが一番時間がかかった。

などを踏まえてインストールしていったら最後のCompiler Updateができない(Windows SDKを見つけられない)とかいわれてVCのインストールからやり直したりした。
以下ライブラリやRubyのビルドの際は、vcvars32.batやvsvars32.batに相当するもの(C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd)を実行することで64bit開発環境のための設定を行えた。

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

libiconv、readline、zlibはRuby環境構築講座Windows編の記述通りに進めた。
libyamlはプラットフォームにx64を加えて、かつWindows SDK 7.1を使用するように設定を変更した上でビルドした。

OpenSSLはVC-WIN64Aでビルドした。
libxml2とlibxsltはのちほどNokogiriをインストールするために必要なもの。win32と同じビルド方法が使えた。

Rubyのインストール

都合によりRuby環境構築講座Windows編での方法と異なりインストール先のbinをPATHに加えずに進めたため、configureに--with-opt-dirを指定して関連ライブラリの検出を行えるようにした。ちなみに--prefixで指定するパスはバックスラッシュ(半角円マーク)区切りだが、--with-opt-dirで指定するパスはスラッシュ区切りにしないと上手くいかないことが過去にあったので、今回もそうした。
また、--platform=x64-mswin64を付けた(これを付けずに何度かビルドして泣きそうになった)。http://yanmo.info/?p=85

> win32\configure.bat --prefix=D:\private\tools\ruby-1.9.3-p125 --target=x64-mswin64 --with-opt-dir=D:/private/tools/ruby-1.9.3-p125

あとはwin32と同様にコンパイルとインストールを行えば良い。

ruby console的なものを用意する

インストールしたRubyのbinをPATHに追加して、かつVC 64bitの設定も行ったあとDOS窓を開きっぱなしにするため、二段構えのBATファイルを用意する。

REM ruby_console.bat
@ECHO OFF
CMD /k %~dp0\ruby_console_start.bat
REM ruby_console_start.bat
@ECHO OFF
PATH=%~dp0bin;%PATH%
"C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd"

Rubyのインストール先のフォルダにこの2つのBATファイルを置いて、一つ目のBATファイルを実行する。

Nokogiriのインストール

いくつかの理由によりnative buildが失敗するので、修正したgemファイルを作成してからgem installした。修正内容はこの記事を書く前にpull requestしておいたら、この記事を書いている最中にすでに取り込まれててビビった。Fix to build for x64-mswin64 by iwadon · Pull Request #629 · sparklemotion/nokogiri · GitHub

まとめ

VCの用意さえ出来れば、比較的容易に64bitバイナリを用意できた、気がする。なのでみんなもx64-mswin64版Rubyをビルドして使おう。使う人が多くなれば今回のNokogiriみたいに対応ライブラリを増やせていけると思うんだよね。
ちなみにこれらを終えたあとになってartonさんの能楽堂を発見した。能楽堂を使えば簡単に64bitなWindowsRubyを手に入れられる。というか次回があれば僕もこっち使うよ。NougakuDo Manual

Ninjaのテストにgtest 1.6.0以降を使う

NinjaはテストのためにGoogle C++ Testing Framework(以下gtest)が使われているが、当初はシステムにインストールされたgtestをテストプログラム(ninja_test)のビルドに利用されていた。しかしgtestの最新版である1.6.0以降はシステムへのインストールできなくなり、gtestを使う各プロジェクト毎にビルドする形になった。その理由はgtestのFAQにて説明されている。
Why is it not recommended to install a pre-compiled copy of Google Test (for example, into /usr/local)?
僕が使っている環境(Mac OS X + Homebrew)でもgtest 1.5.0を使用できるが、gtest 1.6.0とうっかり混ざるとコンパイルエラーになり、かつ今自分がgtest 1.5.0とgtest 1.6.0のどちらを利用しているのか判別つかないことが多々あり、自分の環境ではgtest 1.6.0で統一しようと考えた。
そこでNinjaでもgtest 1.6.0を使うことになるが、2012-01-06現在のNinjaではconfigure.pyからgtestを展開したディレクトリを指定するオプションが用意されているため、そのオプションを利用する。

% ./configure.py --help                    
Usage: configure.py [options]

Options:
  -h, --help           show this help message and exit
  --platform=PLATFORM  target platform (linux/freebsd/mingw/windows)
  --host=HOST          host platform (linux/freebsd/mingw/windows)
  --debug              enable debugging flags
  --profile=TYPE       enable profiling (gmon/pprof)
  --with-gtest=PATH    use gtest unpacked in directory PATH
  --with-python=EXE    use EXE as the Python interpreter

% ./configure.py --with-gtest=./gtest-1.6.0

% ./ninja ninja_test

これでninja_testが出来上がる。