2011年8月19日金曜日

Ruby on Windows

テキストのプログラム言語を自動的に判別するlinguist(https://github.com/github/linguist)というライブラリがあることを知って使いたくなったけれど、Rubyで書かれているらしい。試すためにWindows上で環境を作ろうとしたらちょっとハマったのでメモ。
Rubyの実行環境は簡単に作れたんだが、linguistがbundler(ruby版aptやportsみたいなものらしい)を使っていたり、拡張ライブラリを使っているせいでコンパイルが必要だったりして面倒だった。
bundlerは裏で色々やってくれるのはありがたいんだけど、内部で何をしているのかが直観的に分かり難かった。
任せきりにしてもエラーが発生しないならブラックボックスとして使えるので良いんだろうけどまだその域には達していなさそう。Linuxで使うならもっとスムーズに行くのかもしれないけど。

rubyをダウンロードして解凍。(以下、C:\nazochu\rubyに置いたとして記載)
http://www.garbagecollect.jp/ruby/mswin32/ja/download/release.html

PATHを変えるのは嫌だったので以下のbatファイルを作成してrubyを使う時はこれからコマンドプロンプトを開くようにする。
set path=%path%;C:\nazochu\ruby\bin
%comspec% /k

lignuistのHPにあるとおりにやってみる。
git clone https://github.com/github/linguist.git
cd linguist/
gem install bundler
bundle install
bundle exec linguist bin/linguist

エラーが色々出てくるので順番に解決していく。

・DLLが見つかりませんのポップアップ

以下から落としてきてbinに放り込む。

zlib, readline : http://jarp.does.notwork.org/win32/
openssl : http://www.limber.jp/2005/04/05/316
iconv : http://sourceforge.net/projects/gettext/files/libiconv-win32/

・nmakeが見つかりません。

必要な環境変数が設定されていないせい。Visual Studio 2008コンソールからbundle installを実行する。

・MSC version unmatch: _MSC_VER: 1200 is expected.

C:\nazochu\ruby\include\ruby-1.9.1\i386-mswin32\ruby\ruby.hを修正する。
#if _MSC_VER != 1200

#if _MSC_VER < 1200

・'VALUE' : この型は演算子として使用できません、みたいなエラー

VC++はC99に対応していないのでブロックの最初以外で変数が宣言されるとエラーになる。
escape_utils.cの拡張子を.cから.cppにリネームしてC++としてコンパイルすることで回避。

・rb_define_methodとかで型エラー

1つ前の対策の副作用。C++になったことで関数ポインタの型が合わなくなったのでキャストを追加。
rb_define_method(mEscapeUtils, "escape_html", rb_escape_html, -1);

#define RB_FUNC(f) reinterpret_cast(f)

rb_define_method(mEscapeUtils, "escape_html", RB_FUNC(rb_escape_html), -1);

・hexCharsのところでエラー
const unsigned char hexChars[16] = "0123456789ABCDEF";

const unsigned char hexChars[17] = "0123456789ABCDEF";

・修正したソースファイルを使わせるにはどうするの?

bundlerで自動ダウンロードされるソースを修正したのだが、bunder installを使うと修正前のファイルで上書きされてしまうため困った。しょうがないのでエラーとなるgemだけ、bunderを使わずにインストールすることにする。
cd C:\nazochu\ruby\lib\ruby\gems\1.9.1\gems\escape_utils-0.2.3\ext\escape_utils
nmake
cd C:\nazochu\ruby\lib\ruby\gems\1.9.1\gems\escape_utils-0.2.3
gem build escape_utils.gemspec
gem install --local escape_utils-0.2.3.gem
ここまでやってbundle installに成功。

・MSVCR90.dllが見つからない。
bundle exec linguist bin/linguistと実行したら怒られた。
ランタイムを入れても良いけど必要ないようにコンパイルオプションを変更してmakeをやり直し。

C:\nazochu\ruby\lib\ruby\1.9.1\i386-mswin32\rbconfig.rb
CONFIG["CFLAGS"] = "-MD -Zi -W2 -O2b2xg- -G6 -Zm600"
CONFIG["CXXFLAGS"] = "-MD -Zi -W2 -O2b2xg- -G6 -Zm600"

CONFIG["CFLAGS"] = "-MT -Zi -W2 -O2b2xg- -G6 -Zm600"
CONFIG["CXXFLAGS"] = "-MT -Zi -W2 -O2b2xg- -G6 -Zm600"

・異常に遅い。

そこそこ新しいPCなのに4秒以上かかる。本処理の前の起動処理で時間がかかっているみたいだ。
bunder経由での起動をやめたらかなり早くなった。

lib以下のファイルをruby -e "puts $LOAD_PATH"で出力されるディレクトリのどこかに置くようにして、
rubyコマンドで直接起動。

0 件のコメント:

コメントを投稿