Visual Studio 2008でruby(1.8.7-p160)、rubygems(1.3.2)を素からコンパイル&インストールしてみた。

Visual Studio6.0持ってないからいろいろコンパイルできないとエラー
→そんじゃ持ってるのでコンパイルしていれればいいんじゃね?
というわけでやってみた。
今回使ったのは Visual Studio 2008 Pro(Academic)だけど多分Expressでもいけるとおもう。

下準備

スタートメニュー
 →すべてのプログラム
  →Microsoft Visual Studio 2008
   →Visual Studio Tools
    →Visual Studio 2008 コマンド プロンプト
としてVisual Studio 2008 コマンド プロンプト(以降cmdと省略)を起動。
まずは次のように*1

>cd c:\
>mkdir ruby
>cd ruby
>mkdir bin lib include src
>PATH c:\ruby\bin;%PATH%
>cd src

zlib-1.2.3.tar.gz
ruby-1.8.7-p160.tgz
rubygems-1.3.2.tgz
をc:\ruby\srcにDLして保存。(ダウンロード方法は自由に)
tarとgzip入れてパスを通してあるならcmdに次のように。

>tar zxvf zlib-1.2.3.tar.gz
>tar zxvf ruby-1.8.7-p160.tgz
>tar zxvf rubygems-1.3.2.tgz

cmdはそのまま閉じないでおく。

zlib

エクスプローラでC:\ruby\src\zlib-1.2.3を開いて
zlib.hとzconf.hをC:\ruby\includeへcopy。
そのあと
projects\visualc6と進んで
zlib.dswを実行。
変換するというダイアログが出るので「すべてはい」を選択。
あとはDLL Releaseを選択し、ソリューションエクスプローラからzlibを右クリックしてビルド。
できたものはC:\ruby\src\zlib-1.2.3\projects\visualc6\Win32_DLL_Releaseにある。
中のもののうち
zlib1.dllをc:\ruby\binにcopy
zlib1.libをc:\ruby\libにcopy
これでおk。

ruby

cmdにて次のようにする。

>cd ruby-1.8.7-p160
>win32\configure.bat
>nmake
>nmake test
>nmake DESTDIR=C:\ruby install
>cd ext/zlib
>ruby extconf.rb --with-zlib-include=C:\ruby\include
>nmake
>nmake install
>cd ../..

これでおk。
ruby extconf.rbのところのオプションはc:\では通らないので必ずC:\で。*2

rubygems

>cd rubygems-1.3.2
>ruby setup.rb
>nmake
>nmake test
>nmake install

ここで試しにrails入れようとしたらこけた。
調べるとC:\ruby\lib\ruby\site_ruby\1.8\rubygems\package\tar_input.rb
のzipped_stream(entry)を次のように変更する必要があるらしい。

  def zipped_stream(entry)
    if defined? Rubinius then
      zis = Zlib::GzipReader.new entry
      dis = zis.read
      is = StringIO.new(dis)
    else
      # This is Jamis Buck's Zlib workaround for some unknown issue
      entry.read(10) # skip the gzip header
      zis = Zlib::Inflate.new(-Zlib::MAX_WBITS)
             ######### EDIT START ###
       #is = StringIO.new(zis.inflate(entry.read))
       __buf = ""
       while __temp = entry.read( 128 * 1024 ) do
         __buf << zis.inflate( __temp )
       end
       is = StringIO.new( __buf )
       ######### EDIT END #####
    end
  ensure
    zis.finish if zis
  end

これで通った。

+α

rubyまでのパス(c:\ruby\bin)を環境変数PATHへ登録しておきましょう。
あとコマンドでruby関係のコマンド(rubygemsとか)を使うときは「Visual Studio 2008 コマンド プロンプト」からやると
ネイティブでコンパイルできたりしていいかも?

余談

twbot.rbが向いていないことが発覚したのでTwitter4rを入れようとしたらこけた - bot構築雑記 - はてなグループ::ついったー部
今までどうやっても入らなかったtwitter4rがこれで入れたらすんなりはいった。なぜだ…
まぁうん、とりあえずこれでbot制作できるようになるからいっか(ぁ

*1:めんどくさいならバッチファイル作るといいと思うよ!

*2:なぜかはわからん。