Ruby 3.2をVisual Studioでビルドすると、拡張ライブラリの不具合が原因でgemが動作しないという致命的な問題が生じました。そこで、Windows版のGNU環境である
MSYS2でビルドすることにします。
Cygwinを使うという選択肢もありますが、Windowsネイティブで動かしたいという考えから、MSYS2を使うことにしました。
1. MSYS2に必要なパッケージをインストールする
まずはMSYS2をインストールし、Rubyのビルドに必要なパッケージをインストールします。ここで「なんだこりゃ?」となるのは、MSYS2のenvironmentです。「MinGW x64」とか「MinGW UCRT x64」があり、何を使えばいいのか最初は分かりませんでした。
ドキュメントを読んでいくと、MinGW x64はMSVCRTを使い、MinGW UCRT x64は
Universal CRTを使う環境だと分かります。とてもとても大雑把に言えば、MSVCRTはWindows10以前で使われていた環境、UCRTはWindows10以降で使われるようになった新しい環境です。どちらを使ってもいいと思いますが、Windows10以前の環境を使わないのであれば、UCRTでいいと思います。
MSYS2をインストールし、ドキュメントにあるとおり、システムのパッケージを最新の状態に更新します。
> pacman -Suy
このコマンドを何度か繰り返し、最新の状態と言われるようになった後、gccとRubyのパッケージをインストールします。
> pacman -S mingw-w64-ucrt-x86_64-gcc
> pacman -S mingw-w64-ucrt-x86_64-ruby
これでRubyのビルドに必要なパッケージがインストールされます。
2. Ruby 3.2をビルドする
やることはLinuxと変わりません。
> ./configure --prefix=/app/ruby-3.2.0-ucrt
> make all install
configureしてmake installするだけです。ここでの落とし穴は、configureに指定するprefixです。prefixが渡されるのは、ビルド中に生成されたminiruby.exeです。これはMSYS2の世界ではなく、Windowsの世界で動くため、
prefixの値はWindowsのパスになります。MSYS2ではルートディレクトリ
/
を
c:\app\msys64
(インストール環境によってディレクトリ名は異なります。なぜmsys64としたのかは分かりません…)にマウントしているのですが、
prefix=/app/ruby-3.2.0-ucrt
と指定したとき、インストール先のパスは
c:\app\ruby-3.2.0-ucrt
となります。
c:\app\msys64\app\ruby-3.2.0-ucrt
となるわけではありません。これを知らないと、いったいどこにインストールされたんだと探し回ってしまうことになります。
3. 必要なパスを通す
RubyをWindows Terminalなどでも使うためには、Rubyの実行ファイルや動作に必要なライブラリが格納された場所にパスを通しておく必要があります。Windows標準のライブラリだけで動作する・・・と思いきや、MSYS2内のライブラリも使われているため、何らかの対処をする必要があります。
(MSYS2インストール先ディレクトリ)\ucrt64\bin
にパスを通す
(MSYS2インストール先ディレクトリ)\ucrt64\bin\libgmp-10.dll
をruby.exeと同じディレクトリなどパスの通った場所にコピーする
ビルドするときにこのライブラリを静的リンクしてしまえばいいのですが、その方法が分からないため、対処療法的な手を取っています。
パスを通す方法で試してみたところ、gemも動作しています。が、拡張ライブラリが作成できません。環境を整えればうまくいくと思うのですが、現在のところ、うまくいっていません。そのため、完全に使う場合は
RubyInstallerを待つのが一番楽そうです(とんでもない結論に辿り着いた!)。なお、Ruby 3.2.0版のRubyInstallerは12月29日(日本時間では30日?)に公開されました。