wxruby2 のインストール

gem でインストールした wxruby-ruby19 は、Ruby 1.9.1-p129 では使えません。(dllMain@12が見つからないとダイアログが出る)
よってこれも自力でビルド。

参考:Unable to use wxruby-ruby19 in Ruby 1.9.1-p129 on Windows - wxRuby - Ruby-Forum

wxWidgets のビルド

今回使用するのは wxWidgets 2.8.10 です。
ソースを展開したら、include/msw/setup.h を開き、一箇所手で修正します。
OpenGL を表示する GLCanvas を使うため)

#define wxUSE_GLCANVAS       0

となっている行を探し、

#define wxUSE_GLCANVAS       1

0を1に変えます。

ビルド〜インストールの手順は以下のとおり。

cd /c/wxWidgets
mkdir mybuild # フォルダ名はてきとう
cd mybuild
../configure --with-msw --disable-shared --enable-monolithic --enable-unicode  --with-opengl --with-libjpeg=builtin --with-libpng=builtin --with-zlib=builtin --disable-graphics_ctx --disable-mediactrl
make
make install
cd /usr/local
ln -s wx-2.8/wx wx # /usr/local/wx にシンボリックリンクを張る


make におそろしく時間がかかるので、Core2Duo なら MAKEFLAGS='-j 2' などとして、並列makeにすると吉。
TEMP(TMP)をRAMディスクに置くのも効果ありそう。

configure してから、wx.h をプリコンパイルしておくと make が速くなるらしいですが、残念ながら実感なし。いちおうやり方残します。

cd ../include/wx
g++ $(../../mybuild/wx-config --cxxflags) wx.h

wxruby-2.0.0 のビルド

swig 1.3.37(以上でも以下でもなく)が必要。

rake/rakemingw.rb を開いて、

$cpp = "g++"
$ld  = "g++ -shared" # not ld directly

のあと、11行目に

$extra_ldflags = '-Wl,--enable-auto-import,--export-all'

この一行を追加します。
Ruby 1.9 の dll をリンクするため)

export WXWIN=/usr/local
rake rake_make WXRUBY_RELEASE=true
rake gem WXRUBY_VERSION=2.0.0
gem install wxruby-ruby19-2.0.0-x86-mingw32.gem

rake_make は、make に並列ビルドをさせるオプション。(ちゃんと時間計ってなかったので、どの程度早くなるかは不明)
インストールは、rake install でもできますが、ここでは rake gem でバイナリ版gem を作って、それをインストールしています。
(gemを作っておいた方が、別のPCにインストールするのが楽だから)

ruby1.8 用のバイナリgem では、lib/wxruby2.so のサイズは10MB切ったくらいですが、どういうわけかこの方法で作った wxruby2.so は 50MB もあります。
いろいろ試したんですが、sharedはMinGWじゃどうにも通らないし、あきらめました。

考えてみれば 1.8 版だって、MinGWコンパイルしてるなら shared 使ってないだろうし、一体どうしているんだろう?

サンプル実行

sample/opengl/cube.rb が、そのままでは動きませんでした。

 def initialize(title)
   super(nil, :title => title, :size => [ 400, 300 ])
   attrib = [Wx::GL_RGBA, Wx::GL_DOUBLEBUFFER, Wx::GL_DEPTH_SIZE, 24]
   @canvas = Wx::GLCanvas.new(self, -1, [-1, -1], [-1, -1],
                              Wx::FULL_REPAINT_ON_RESIZE, 'GLCanvas', attrib)

となっている、attrib= のところ(19行目)を、

   attrib = [GL_RGBA, GL_DOUBLEBUFFER, GL_DEPTH_BITS, 24]

と直すと動きます。(カーソルキーで立方体が回転します)