Windows7 64bit環境でi686-w64-mingw32を使ってRuby2.1.0をコンパイルする方法
※後日rubyinstallerを使ってコンパイルする方法を発見したので、この日記を全面的に書き換えます。(14/03/08)
目標はUTF-8日本語の扱いが正常なRuby2.1.0をビルドすることです。
64bit環境で正常なRubyを作るのに非常に苦労しました。狭き道です。
正しいコンパイラを使う
・UTF-8日本語が正常なのは今のところrubenvb版のmingw-w64だけなので、これを使います。
・mingw-w64 projectとは何か?
The mingw-w64 project is a complete runtime environment for gcc
to support binaries native to Windows 64-bit and 32-bit
operating systems.
・RubyInstallerがrubenv版のgcc-4.7.2を使っているので、これに習うことにします。
・するとこのページから正しいものを選ぶことになります。
・ファイル名規則はこうなっています
Packages are named as follows: [Target]-gcc-[Version]-release-[OS]-rubenvb.* [Target]-clang-[Version]-release-[OS]-rubenvb.* Target: GCC triplet for the system this toolchain builds code for: x86_64-w64-mingw32: 64-bit Windows i686-w64-mingw32: 32-bit Windows Version: GCC version OS: OS the toolchain is built for: linux64: 64-bit linux win64: 64-bit Windows win32: 32-bit Windows (also work on 64-bit Windows) cygwin: Cygwin (www.cygwin.com)
・普通に読むと次の名称のものが候補になります。
i686-w64-mingw32-gcc-4.7.2-release-win32-rubenvb.*
i686-w64-mingw32-gcc-4.7.2-release-win64-rubenvb.*
・release-win64を使うと、make中にmkmf.rbが
The compiler failed to generate an executable file.
というエラーを出すので、今のところ使えません。
MSYSはどこに配置すべきか?
・コンパラをいろいろ試しているとMSYSのアイコンがどんどん増えて大変です。
・コンパイラの数だけMSYSを用意するのはHDD容量的に無駄です。
・MSYSはc:\の直下に配置するのが正解だと思います。
・コンパイラはその下にmingwという名前で配置します。又は、fstabファイルを使ってコンパイラのフォルダをmingwにマウントします。
・コンパイラを入れ替えてもMSYSをいじる必要はないことになります。アイコンも一つでOKです。
・因みに、etc/fstabファイルは現在こんな具合になっています。いろいろ試してみた結果です。
#Win_Path Mount_Point C:\msys\i686-w64-mingw32-4.7.2-win32_rubenvb /mingw #C:\msys\i686-w64-mingw32-4.7.2-win64_rubenvb /mingw #MinGW/MSYS版 #C:\msys\mingw32-gcc-4.8.1 /mingw #MinGW版i686-w64 #C:\msys\i686-4.8.2-win32-dwarf-v3-2 /mingw #TDM版32bit #C:\msys\TDM-GCC-32 /mingw #TDM版64bit #C:\msys\TDM-GCC-64 /mingw
どのMSYSを使うか
・これでいいんじゃないでしょうか。
msys+7za+wget+svn+git+mercurial+cvs-rev13.7z
・このページにmingw-w64プロジェクトのMSYSがあるのですが、make cleanでパラメータエラーを出すので採用していません。
拡張用ライブラリはどこに配置するか?
・LIBRARY_PATH、BINARY_PATH、INCLUDE_PATHといった環境変数を設定すればどこでも良さそうなものですが、コンパイル中に走っているRubyとの関係もあり、場所が限定されます。結論としてrubyのソースの直下に入れます。
適切な拡張用ライブラリを準備する
・RubyInstallerが使用しているライブラリを使います。
:url => "http://packages.openknapsack.org/zlib",
'zlib-1.2.7-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/openssl",
'openssl-1.0.0l-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/libffi",
'libffi-3.0.11-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/libyaml",
'libyaml-0.1.5-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/libiconv",
'libiconv-1.14-x86-windows.tar.lzma'
:url => "http://packages.openknapsack.org/gdbm",
"gdbm-1.8.3-x86-windows.tar.lzma"
:url => "http://packages.openknapsack.org/pdcurses",
"pdcurses-3.4-x86-windows.tar.lzma"
:url => "http://packages.openknapsack.org/tcl",
"tcl-8.5.12-x86-windows.tar.lzma"
:url => "http://packages.openknapsack.org/tk",
"tk-8.5.12-x86-windows.tar.lzma"
:url => 'https://github.com/luislavena/rb-readline/archive',
:target => 'sandbox/rb-readline',
'v0.5.0.zip'
・上記のうちreadlineはRuby専用の特殊なものです。readline抜きでビルドした後で使います。
コンパイル
・Ruby2.1.0のソース、拡張用ライブラリを配置します。
・以下の手順でビルドできます。
PATH=/c/Ruby200/bin:$PATH export LIBRARY_PATH BINARY_PATH LIBRARY_PATH=/home/ユーザ名/ruby210c/lib BINARY_PATH=/home/ユーザ名/ruby210c/bin cd ruby210c configure --enable-shared --prefix=/Ruby210d6432 --disable-install-rdoc --build=x86_64-w64-mingw32 --host=i686-w64-mingw32 make make install
・ビルド完了後、ruby210c/binの下にあるファイルを全てRuby210d6432/binの下にコピーします。
readlineのインストール
・解凍したrb-readline-0.5.0フォルダをホームの下に配置します。
・ビルド済のRuby210d6432にパスを通して使い方を確認します。
PATH=/c/Ruby210d6432/bin:$PATH cd rb-readline-0.5.0 ruby setup.rb --help
・次のコマンドでインストールできます。
ruby setup.rb all
結果の検証
・UTF-8日本語の扱いは正常です。
・前の日記に書いた方法でRuby-2.1用のsqlite3を準備すれば、railsをインストールしてDBを使うアプリの作成まで正常に動作します。
・rubyinstallerでビルドしたものと同等と思われます。