Visual C++ 10でif_rubyを有効にしたVimをビルドする
概要
Windows で Ruby を使う場合、おそらくRubyInstaller で提供されているバイナリを使うのが最も一般的でしょう。(他には、ActiveScriptRuby があります。)
Windows 版の Vim で if_ruby を有効にしてビルドする場合、通常は Ruby のバイナリをビルドするのに使った物と同じコンパイラを使う必要があります。RubyInstaller で提供されているバイナリは、MinGW-w64 でビルドされているため、それを使うには通常は 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を使ってのビルド方法 を読んで、通常のビルド方法を把握しておいてください。
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 のコマンドプロンプトを開き、以下の2つのコマンドを実行します。
> 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 以外のオプションは、上記のサイトを参考に適宜追加してください。
動作確認
> path C:\Ruby21\bin;%path% (Ruby の DLL に PATH を通す)
> gvim (ビルドした Vim を起動)
:ver (+ruby/dyn が含まれていることを確認)
:ruby print RUBY_VERSION (Ruby のバージョンを表示)
2.1.4
参考: 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等)