MinGW/MSYSでRuby2.1.0をコンパイルしてRails4.0をインストールまで
大きなプログラムのコンパイルのお勉強ということで、RubyInstallerがまだ配布していないRuby2.1.0をビルドしてみました。全てGoogle先生に聞きながらやっていて泥沼にずっぽしハマりましたので、メモしておきます。
はじめに
・環境はWindows7 64bit、VM上にXPの32bit版を入れてます。
・Rubyをコンパイルすることの概念を知る上で良かったのは、たむらけんいちさんのこの記事でした。
・RubyInstallerはMinGWでコンパイルしているし、DevKitもMinGWだし、合わせておいた方が良いような感じがします。
・RubyinstallerのDevKitというのは殆どMinGWそのものですね。インストールするとコンパイラ用の環境変数とか自動的に設定されるようになるようです。その他にどんな機能があるのかはまだ分かりません。
・Ruby2.0用のDevKitは今回ビルドしたRuby2.1.0を認識してくれません。騙してインストールしても、機能しませんでした。Railsをインストールするには奥の手が必要です。
・configure時には--prefix=/Ruby210みたいに出力先を絶対パスで指定した方が吉です。
・64bit環境でRuby2.1.0をMinGWでコンパイルするとio.cでエラーが発生します。しかたがないのでVM上のXP32bitでコンパイルしました。ちなみにMinGWの64bit版でもio.cで引っかかります。訳が分かりません!
・CygWinは便利な感じですが、64bit環境で問題なくコンパイルできるものの、今の所使い物になりません。gemが動かない! これはgemに対応するgem.batを作ってくれないのが原因です。それが何故かは今の所謎です。
・Ruby2.1.0のソースはこちらからダウンロードします。
MinGW/MSYS
・32bit環境でないとRuby2.1.0はコンパイルできません!
・最新版はここからダウンロードします。しかし、MSYSを起動するアイコンを作ってくれないので初めての人は訳が分からないと思います。
・旧版はここからダウンロードします。インストールする時に、ライブラリをアップデートするように選択(ボタンをクリック)します。
・インストール先はデフォルトが吉です。
・MinGWとMSYSの構成とか、MSYSの設定に関してはこの記事を読むと役に立ちます。ネットでは環境変数をあれこれ設定するような話が出てきますが、ウソです。シンプルな方が安心だし、この記事の通りで正しくコンパイルできます。
・追加のライブラリが必要です。
http://gnuwin32.sourceforge.net/packages.html
openssl の Binariesと Developer files
readline の Binariesと Developer files
zlib の Binariesと Developer files(もしかすると不要、試していません)
http://jarp.does.notwork.org/win32/
gdbm-1.8.3-1-mingw32.zip
pdcurses-2.60-1-mingw32.zip
・これらを解凍して、bin\,lib\,include\をc:\MinGW\にコピペします。
・MSYSを一度起動するとユーザーのホームディレクトリが作成されるので、Rubyのソースをコピーしておきます。
・あとはGoogle先生が教えてくれるようにコンパイルします。
$ ./configure --enable-shared --prefix=/Ruby210 > log_conf.txt $ make > log_make.txt $ make install > log_inst.txt
・/Ruby210でc:\Ruby210に出力されます。
Rails4.0のインストール
・基本的な流れは前回の日記を見てください。
・旧版のRubyからsetrbvaes.batをコピーしてきて、Ruby2.1用のコマンドプロンプトを作ります。
・上記までのままですと、gemのシステムのアップデートとrakeのアップデートは通りますが、JSONのインストールができません。
・RailsInstallerのRuby2.0用のDevKitはこのビルドを認識してくれません。
・対策として導入済みのMinGWを利用します。一時的な環境変数のPATHの先頭にC:\MinGW\binとC:\MinGW\msys\1.0\binを追加します。setrbvars.batのPATHの設定部分に追加すると良いでしょう。
SET PATH=%RUBY_BIN%;%PATH%;C:\MinGW\bin;C:\MinGW\msys\1.0\bin
・以上でJSONのインストールからRails4.0のインストールまで進めます。さらにrails newでmyappを作ってbundle installも完了します。
・ここでrails sでWEBrickサーバーを起動すると、sqlite3が見つからないと言われてコケます!
・Google先生に聞いてみると、Ruby2.1用のsqlite3のgemがサイト側で準備されていないのが原因らしい。対策はこの覚書に書いてありました。
・sqlite3のソースを入手してコンパイルなど準備をし、sqlite3のgemをuninstallしてから指示通りにインストールしたら動きました。
> gcc -O3 sqlite3.c -c > ar rv libsqlite3.a sqlite3.o
> gem uninstall sqlite3 -a > gem install sqlite3 --version=1.3.8 --platform=ruby -- --with-sqlite3-include=C:\Ruby210\sqlite3080300 --with-sqlite3-lib=C:\Ruby210\sqlite3080300
・scaffoldでユーザーページを作って、db:migrateも完了。ユーザーページにアクセスしてユーザー登録も出来ました。
・しかし、bundle updateを行うとInstalling sqlite3 1.3.8となって、動かなくなります!
・対策:
C:\Ruby210\lib\ruby\gems\2.1.0\gems\sqlite3-1.3.8-x86-mingw32\lib\sqlite3\2.1\
フォルダーを作り、ここに
C:\Ruby210\lib\ruby\gems\2.1.0\gems\sqlite3-1.3.8\lib\sqlite3\sqlite3_native.so
をコピーします。
・これでbundle updateしてもOKです。
・ここまで動いているとなれば、今回のビルドはまず成功と言って良いのかと思われます。