dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

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
#MinGWi686-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'

・上記のうちreadlineRuby専用の特殊なものです。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でビルドしたものと同等と思われます。