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]
と直すと動きます。(カーソルキーで立方体が回転します)