Develop with pleasure!

福岡でCloudとかBlockchainとか。

mswin32版Rubyをビルドしてみた。

RubyのスクリプトからICMPプロトコルを使用したPingを発行しようと

require 'net/ping'
include Net

Ping::ICMP.new("hoge.co.jp").ping?

といったコードを書いて、実行するとRubyのプロセス自体が落ちた…。

使ってるRubyのバージョンはmswin32版の1.8.7-p72。
原因はRubyのバグで、レポートも出され、Fixしてる。

Bug #714: Socket bug in Ruby-mswin32 - Ruby 1.8 - Ruby Issue Tracking System

が、mswin32版でこの修正が含まれているのは1.9かららしく、1.8.6、1.8.7には含まれていない…。パッチレベル上げれば良いのかと思い、p160を適用したけどダメ。さらにp160だと何故かRailsが凄く遅くなる…。ハーン何で?

しょうがないので↑のチケットに記載されてたパッチを自分であてることに。

からまず、1.8.7-p72のRubyのソースをGet。

展開したフォルダ内にあるwin32\win32.cの2645行目付近の

...
  out = WSASocket(af, type, protocol, &(proto_buffers[i]), 0, 0);
  break;
}
...


のコードを

...
  out = WSASocket(af, type, protocol, &(proto_buffers[i]), 0, 0);
  break;
}
if(out==INVALID_SOCKET)
  out = WSASocket(af, type, protocol, NULL, 0, 0);
...


といった風に2行追加する。修正自体はこれだけ。後は、mswin32版のビルド。

まず、必要となるVisual C++ 2008 Express Editionを↓からGet。
Microsoft Visual Studio Express

インストールし、Visual Studio 2008 コマンドプロンプトを利用して、

rubyビルドガイド

↑のVC++の記事を参考にビルド。意外とあっさり終わる。
早速、必要なgemを入れようとするとzlib.dllがロードできなくてエラーが発生する。

指定されたプロシージャが見つかりません。 - Init_zlib


そう、rubygemsの実行に必要なzlibをRubyから利用できるように拡張ライブラリをビルドする必要があると。

2009-03-13 - Kazzzの日記

↑のBlogを参考にさせてもらって何とか、rubygemsも動作するようになった。

ホット一安心してRailsを動作させようとすると

`gem_original_require': no such file to load -- iconv (LoadError)

はい。続いてはiconv。iconvはバイナリを
http://www.meadowy.org/meadow/dists/snapshot/old/iconv-1.8.win32.zip

から入手。rubyのソースディレクトリのext\iconvに移動し、

ruby extconf.rb --with-iconv-dir="入手したiconv-1.8.win32.zipを展開したフォルダ"
nmake
nmake install

お次は、openssl。opensslの場合、nmakeするとコンパイルエラーが多発する。そのため、

Ruby-1.8.7_p160 openssl編 その4 - Kazzzの日記

↑を参考に、ruby extconf.rb時に生成されたextconf.hに

#define WIN32_LEAN_AND_MEAN


を追記し、nmakeすることで解消する。

今更ながら、All in oneで提供されてる有難さを実感する。

これでOKかと思い、Railsを起動すると

.../mysql-2.7.3-x86-mswin32/ext/mysql.so: [BUG] Segmentation fault


今度はMySQLのgemですか。てかSegmentation faultじゃ原因が分からん…。

道のりは遠い…。