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 のバイナリを使えるようにするための方法を説明します。(ただし、保証された方法ではありません。)
Ruby の DLL ファイル名とインクルードディレクトリ名
Ruby をビルドすると、コンパイラと Ruby のバージョンに応じて、DLL ファイル名やインクルードファイルのディレクトリ名などが変わります。このため、Ruby とアプリをビルドする際のコンパイラが異なると、アプリのビルドが通りません。
RubyInstaller 2.1.4 の場合を例に説明します。
DLL ファイル
Ruby の DLL ファイルは、以下のディレクトリに格納されています。
C:\Ruby21\
+ bin\
+ msvcrt-ruby210.dll
DLL のファイル名のうち、msvcrt
は、ランタイムライブラリの名前を示しています。MinGW では msvcrt
ですが、VC10 では msvcr10
です。
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
はプラットフォームを示しています。VC10 32bit の場合は、i386-mswin32_100
になり、VC10 64bit の場合は、x64-mswin64_100
になります。末尾の 100
は VC のバージョンを示しています。
config.h
は、コンパイラに依存した設定が書かれたヘッダファイルで、MinGW と VC10 では内容が異なります。
これらの名前を無理やり合わせた上で、適切な 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 本体のビルドは不要です。)
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
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
: Ruby のディレクトリ。上記で取得した Ruby のソースコードのディレクトリを指定する。DYNAMIC_RUBY
: ダイナミックリンクにするかどうか。通常はyes
を指定する。RUBY_VER
: Ruby バージョン。ドットを省いて、先頭の2桁を指定する。RUBY_LONG_VER
: Ruby API バージョン。ドット付きで指定する。RUBY_API_VER
: Ruby API バージョン。ドットを省いた形式。RUBY_LONG_VER
の値を元に自動的に設定されるため、手動での設定は不要。RUBY_INSTALL_NAME
: DLL のベースファイル名に相当。RubyInstaller の DLL 名に合わせて指定する。RUBY_PLATFORM
: Ruby のプラットフォーム名。RubyInstaller のプラットフォーム名ではなく、VC10 のプラットフォーム名を指定する。RUBY_INC
: Ruby のヘッダファイルのディレクトリ。RubyInstaller のディレクトリではなく、上記で取得した Ruby のソースコードの中のディレクトリを指定する。WINVER
: これを0x0500
以上の値に設定しないと、Ruby 2.1.0 以降ではiphlpapi.h
でコンパイルエラーになる。
Ruby 以外のオプションは、上記のサイトを参考に適宜追加してください。
動作確認
> path C:\Ruby21\bin;%path% (Ruby の DLL に PATH を通す)
> gvim (ビルドした Vim を起動)
:ver (+ruby/dyn が含まれていることを確認)
:ruby print RUBY_VERSION (Ruby のバージョンを表示)
2.1.4
参考情報
Ruby のバージョンと API バージョン
Ruby Version | Ruby API Version |
---|---|
1.9.1 - 1.9.3 | 1.9.1 |
2.0.0 | 2.0.0 |
2.1.X | 2.1.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 バージョン。