Visual C++ 10でif_rubyを有効にしたVimをビルドする

# Visual C++ 10でif\_rubyを有効にしたVimをビルドする

## 概要

Windows で Ruby を使う場合、おそらく[RubyInstaller](http://rubyinstaller.org/) で提供されているバイナリを使うのが最も一般的でしょう。（他には、[ActiveScriptRuby](http://www.artonx.org/data/asr/) があります。）

Windows 版の Vim で if\_ruby を有効にしてビルドする場合、通常は Ruby のバイナリをビルドするのに使った物と同じコンパイラを使う必要があります。RubyInstaller で提供されているバイナリは、[MinGW-w64](http://mingw-w64.sourceforge.net/) でビルドされているため、それを使うには通常は Vim も MinGW(-w64) を使ってビルドする必要があります。

ここでは、VC10 を使って Vim をビルドしつつ、if\_ruby で RubyInstaller のバイナリを使えるようにするための方法を説明します。**ただし、保証された方法ではありません。**
（ActiveScriptRuby 用バイナリを作成する方法も簡単に説明します。こちらは正規の方法です。）


## Ruby の DLL ファイル名とインクルードディレクトリ名

Ruby をビルドすると、コンパイラと Ruby のバージョンに応じて、DLL ファイル名やインクルードファイルのディレクトリ名などが変わります。このため、Ruby とアプリをビルドする際のコンパイラが異なると、アプリのビルドが通りません。

RubyInstaller 2.1.4 (32bit版) の場合を例に説明します。

### DLL ファイル
Ruby の DLL ファイルは、以下のディレクトリに格納されています。

```
C:\Ruby21\
    + bin\
        + msvcrt-ruby210.dll
```

DLL のファイル名のうち、`msvcrt` は、ランタイムライブラリの名前を示しています。MinGW では `msvcrt` ですが、VC10 では `msvcr100` です。

`210` は Ruby の API バージョンを示しています。（Ruby 2.1.4 の API バージョンは、2.1.0 です。）

なお、64bit 版の場合は、頭に `x64-` がつき、`x64-msvcrt-ruby210.dll` などのファイル名になります。


### インクルードファイル
インクルードファイルは、以下のディレクトリに格納されています。

```
C:\Ruby21\
    + include\
        + ruby-2.1.0\
            + i386-mingw32\
            |   + ruby\
            |       + config.h
            + ruby\
            |   + ruby.h, etc.
            + ruby.h
```

`2.1.0` は Ruby の API バージョンを示しています。

`i386-mingw32` はプラットフォームを示しています。つまりこの場合は、32bit版 MinGW であることを示しています。64bit版 MinGW では `x64-mingw32` に、VC10 32bit の場合は、`i386-mswin32_100` に、VC10 64bit の場合は、`x64-mswin64_100` になります。VC の場合の末尾の `100` は VC のバージョンを示しています。

`config.h` は、コンパイラに依存した設定が書かれたヘッダファイルで、MinGW と VC10 では内容が異なります。

これらの DLL 名やプラットフォーム名を無理やり合わせた上で、適切な `config.h` を用意することで、アプリを VC10 でビルドしても、MinGW でビルドした Ruby のバイナリを組み込んで使うことが出来るようになります。前述の通り、これは保証された方法ではないことに注意してください。


## ビルド手順

まずは、[VisualStudio10を使ってのビルド方法](http://vim-jp.org/docs/build_windows_msvc.html) を読んで、通常のビルド方法を把握しておいてください。

### Ruby

VC10 用の `config.h` を用意するため、Ruby を途中までビルドします。

まずは、Ruby のソースコードを取得します。（`C:\work` での作業を想定）

```
> cd \work
> git clone https://github.com/ruby/ruby.git
> cd ruby
> git fetch --tags
```

普通に `git clone` や `git pull` でコードを取得した場合、タグが一部しか取得できないようで、全てのタグを取得するには `git fetch --tags` を使う必要があります。

次に、目的のバージョンのコードをチェックアウトします。

```
> git checkout v2_0_0_594  (Ruby 2.0.0-p594 の場合)
> git checkout v2_1_4      (Ruby 2.1.4 の場合)
```

VC10 のコマンドプロンプトを開き、以下の２つのコマンドを実行します。

```
> win32\configure
> nmake .config.h.time
Creating config.h
.ext\include\i386-mswin32_100\ruby\config.h updated
```

これで、VC10 用の `config.h` が `.ext\include\<プラットフォーム>\ruby\` に作成されます。（Ruby 本体のビルドは不要です。）

なお、32bit 用と 64bit 用の `config.h` は、同じ ruby のソースコードディレクトリの下に生成することが出来ます。例えば、Windows SDK 7.1 (コンパイラは VC10 と同じ) を使っている場合は、SDK のコマンドプロンプトを開き、以下の手順を実行することで 32bit 用と 64bit 用の `config.h` を両方生成できます。

```
> setenv /release /xp /x86
> win32\configure
> nmake .config.h.time
Creating config.h
.ext\include\i386-mswin32_100\ruby\config.h updated

> setenv /release /2003 /x64
> win32\configure
> nmake .config.h.time
Creating config.h
.ext\include\x64-mswin64_100\ruby\config.h updated
```

### Vim

次は Vim のビルドです。Vim のソースコードディレクトリに移動（例: `cd \work\vim\src`）し、以下のコマンドを実行してください。（行末の `^` は、行の連結。）

32bit の場合:

```
> nmake -f Make_mvc.mak ^
    RUBY=c:\work\ruby DYNAMIC_RUBY=yes RUBY_VER=21 RUBY_VER_LONG=2.1.0 ^
    RUBY_INSTALL_NAME=msvcrt-ruby$(RUBY_API_VER) RUBY_PLATFORM=i386-mswin32_100 ^
    RUBY_INC="/I $(RUBY)\include /I $(RUBY)\.ext\include\$(RUBY_PLATFORM)" ^
    WINVER=0x0500
```
（`RUBY_INSTALL_NAME` を `msvcr100-ruby$(RUBY_API_VER)` に変更すると、ActiveScriptRuby 用のバイナリを作成できます。）

64bit の場合:

```
> nmake -f Make_mvc.mak ^
    RUBY=c:\work\ruby DYNAMIC_RUBY=yes RUBY_VER=21 RUBY_VER_LONG=2.1.0 ^
    RUBY_INSTALL_NAME=x64-msvcrt-ruby$(RUBY_API_VER) RUBY_PLATFORM=x64-mswin64_100 ^
    RUBY_INC="/I $(RUBY)\include /I $(RUBY)\.ext\include\$(RUBY_PLATFORM)" ^
    WINVER=0x0500
```
（`RUBY_INSTALL_NAME` を `x64-msvcr100-ruby$(RUBY_API_VER)` に変更すると、ActiveScriptRuby 用のバイナリを作成できます。）

ここで使われているオプションは次の通りです。

* `RUBY`: Ruby のディレクトリ。上記で取得した Ruby のソースコードのディレクトリを指定する。
* `DYNAMIC_RUBY`: ダイナミックリンクにするかどうか。通常は `yes` を指定する。
* `RUBY_VER`: Ruby バージョン。ドットを省いて、先頭の2桁を指定する。
* `RUBY_VER_LONG`: Ruby API バージョン。ドット付きで指定する。
* `RUBY_API_VER`: Ruby API バージョン。ドットを省いた形式。`RUBY_VER_LONG` の値を元に自動的に設定されるため、手動での設定は不要。
* `RUBY_INSTALL_NAME`: DLL のベースファイル名に相当。RubyInstaller の DLL 名（Vim を実行する際に使用する DLL 名）に合わせて指定する。
* `RUBY_PLATFORM`: Ruby のプラットフォーム名。RubyInstaller のプラットフォーム名ではなく、VC10 のプラットフォーム名を指定する。
* `RUBY_INC`: Ruby のヘッダファイルのディレクトリ。RubyInstaller のディレクトリではなく、上記で取得した Ruby のソースコードの中のディレクトリを指定する。
* `WINVER`: これを `0x0500` 以上の値に設定しないと、Ruby 2.1.0 以降では `iphlpapi.h` でコンパイルエラーになる。

（Python など）Ruby 以外のオプションは、[上記のサイト](http://vim-jp.org/docs/build_windows_msvc.html)を参考に適宜追加してください。


### 動作確認

```
> path C:\Ruby21\bin;%path%     (Ruby の DLL に PATH を通す)
> gvim                          (ビルドした Vim を起動)
:ver                            (+ruby/dyn が含まれていることを確認)
:ruby print RUBY_VERSION        (Ruby のバージョンを表示)
2.1.4
```

参考: [Vimの言語インターフェースのバージョン確認 - Qiita](http://qiita.com/k-takata/items/3e0e67cc2e2b8b3fd633 "Vimの言語インターフェースのバージョン確認 - Qiita")


## 参考情報

### Ruby のバージョンと API バージョン

| Ruby Version  | Ruby API Version |
|---------------|------------------|
| 1.9.1 - 1.9.3 | 1.9.1            |
| 2.0.0         | 2.0.0            |
| 2.X.Y         | 2.X.0            |

### Ruby のインストール名とプラットフォーム名

| Compiler   | RUBY\_INSTALL\_NAME  | RUBY\_PLATFORM    |
|------------|----------------------|-------------------|
|MinGW 32bit | msvcrt-rubyXXX       | i386-mingw32      |
|MinGW 64bit | x64-msvcrt-rubyXXX   | x64-mingw32       |
|VC10 32bit  | msvcr100-rubyXXX     | i386-mswin32\_100 |
|VC10 64bit  | x64-msvcr100-rubyXXX | x64-mswin64\_100  |

XXX は、ドット省略形式の Ruby API バージョン。(210等)