LoginSignup
3
3

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-11-13

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 clonegit 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_NAMEmsvcr100-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_NAMEx64-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等)

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3