Ruby
Windows
VisualC++

RubyをWindows上でVisual C++でビルドする2018

普通はRubyInstallerを使うんで、あえて茨の道を行きたい人向けです。以下の記事のアップデート版

ruby-mswinとは

Microsoft Visual C++を用いて作成されるCRubyです。これはmingw版やcygwin版などとバイナリ互換性がなく、それら用にコンパイルされた拡張ライブラリを用いることが出来ません。

Visual C++

まずはコンパイラの調達です。すでにVisual Studioをインストール済みならばそれを使えばいいのですが、そうでない場合はBuild Tools for Visual Studio 2017というIDEなしのインストーラを使うと速いです。

インストーラを実行したら以下を選択の上でインストールします。

  • 個別のコンポーネント
    • Windows ユニバーサル CRT
    • Visual C++ Build Tools のコア機能
    • VC++ 2017 バージョン 15.8 v14.15 最新の v141 ツール
    • Windows 10 SDK (10.0.17134.0)
  • 言語パック
    • 英語

以降、コマンドプロンプトはスタートメニューの「Visual Studio 2017」→「VS 2017用 x64 Native Tools コマンドプロンプト」を用います。

BASERUBY

Rubyをソースコードからビルドする場合、特にtarballからではなくリポジトリから取得した場合にはbisonやgrep、sedといったUnixツールが必要ですし、なんとRubyまで必要です。個別に調達すると大変なので、たとえVisual C++でビルドするのだとしても、RubyInstaller(WITH DEVKITかつx64のもの)をインストールしましょう。インストール中にdevkitのインストールを促されるのでそれも入れます。

インストールできたらC:\Ruby25-x64\msys64\mingw64.exeを実行し、mingw64用msysを起動し、以下の通りbisonとgitをインストールします。

pacman -S bison git

注1: Unixツールは従来Git for Windows SDKを用いる方法を紹介していましたが、RubyInstaller2ではMSYS2を用いるようになったため、RubyInstallerのみで事足りるようになりました
注2: BASERUBYはWSLを用いる方法もあるかもしれません

vcpkg

ruby-mswin版のインストールにおいて、従来大きなハードルになっていたのが拡張ライブラリの依存先ライブラリのビルドです。しかし2016年、vcpkgの登場によってだいぶ便利になりました。以下のようにインストールした後、Rubyで必要となるライブラリをビルドします。

\Ruby25-x64\usr\bin\git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
bootstrap-vcpkg.bat
vcpkg --triplet x64-windows install libxml2 libxslt openssl readline zlib

環境変数

前述の通り、VS2017 x64 Native Tools コマンド プロンプトなどを用いてコンパイラ等の環境変数はあらかじめ設定しているものとして、以下の環境変数を設定します。

set PATH=C:\vcpkg\installed\x64-windows\bin;%PATH%;C:\Ruby25-x64\msys64\usr\bin

ポイントはvcpkgのものを冒頭に置くということですね。前述の通りRubyInstallerのDLLはruby-mswinと互換性がないため、それらではなくvcpkgで入れた物を見つけられるよう、先に指定する必要があります。

Rubyのビルド

以下の通りでビルド・インストールできます。(パスは適当に読み替えてください)

win32\configure.bat --with-opt-dir=/vcpkg/installed/x64-windows
nmake install

なお、libxml2やlibxsltをvcpkgで入れているため、従来mswinでは使うことが難しかったNokogiriもRubyGemsから以下の通りインストールすることが可能です。

gem install nokogiri -- --use-system-libraries --with-xml2-dir=/vcpkg/installed/x64-windows --with-xslt-dir=/vcpkg/installed/x64-windows --with-exslt=/vcpkg/installed/x64-windows