2007年03月05日
_ Windows上でのRuby/SDLのコンパイル
ここではWindows上でいかにしてRuby/SDLをコンパイルできたかについて メモしておきます。
MinGW, MSYSのインストール
まずはMinGWとMSYS をこの順にインストールします。 mingwのダウンロードページ から新しいものを取ってきてインストールします。 上のページにはいろいろなアーカイブが置いてありますが MinGW-x.y.z.exe というのと MSYS-u.v.w.exe というのを使えば良いでしょう。
Rubyのコンパイル
次にこれを用いてRubyをコンパイルします。Rubyはコンパイル済みのものを 使ってもかまわないのですが、自分でコンパイルしておいたほうが いろいろ融通がききます。
詳しくは、青木さんの解説 の MinGW + MSYS の項を見てください。
SDL
SDLのダウンロードページ にmingw用のバイナリがあるのでこれを使います。 ライブラリファイル(.aファイル)とヘッダファイル(.hファイル)を 適切な所にコピーします。 MinGWをインストールした所の lib というディレクトリに .a ファイルを、 include に .h ファイルを置けば良いでしょう。
そして、このアーカイブに含まれる i386-mingw32msvc-sdl-config という ファイルを sdl-config という名前に変更し、内容を編集します。
prefix=/usr/local/cross-tools/i386-mingw32msvc
という行を
prefix=c:/mingw
に変更してください。 最後にMinGWをインストールしたディレクトリの bin 以下に置きます。
SDL_mixer、SDL_image、SDL_ttf
以下のページから「Wind32のVisual C++用のDevelopment Libraries」を 取ってきて、中の .lib ファイル(VC++用ライブラリファイル) を MinGW の reimp というツールを使って .a ファイル(MinGW用のライブラリファイル) に変換します。 そして作った.aファイルとヘッダファイルを適切な場所にコピーします。
また、上で説明したSDLのアーカイブに含まれるSDL.dllやこれら のアーカイブに含まれるDLLも必要となるので、一箇所に まとめておくと良いでしょう。
SGE
SGEのダウンロードページ からソースをダウンロードして MSYS 上でコンパイルします。
sge_bm_text.cppの267行目の「#ifdef __WIN32__」という行を「#if 0」に変更します。 sge_textpp.cppの376行目、sge_surface.cppの147行目、sge_tt_text.cppの1373行目も 同様の変更をします。これらはWindow用のクロスコンパイラの問題を避けるための workaroundらしいのですが、ここではそれが悪さをしているようです。
そしてMakefile.confを編集して「#USE_FT=n」の行のコメントを外して有効にし、 「make dll」でコンパイルできるはずです。 生成された libSGE.a と *.h を上と同じところにコピーします。
バイナリは内容が古くなっているため使わないほうが良いでしょう。
smpeg
このファイルを reimp すればOK、だと思います。
Ruby/SDL
最後に Ruby/SDL をコンパイルします。
ruby extconf --with-sdl-config="c:/msys/1.0/bin/sh c:/mingw/bin/sdl-config" make
でコンパイルできると思います。
OpenGL
<URL:http://www2.giganet.net/~yoshi/> から OpenGL Interface for ruby を取ってきて、extconf.rbの
if (/cygwin/ =~ PLATFORM)
という行を
if (/cygwin|mingw/ =~ PLATFORM)
に変更して
make opengl.so
でコンパイルできるはずです。
注記、FAQ
MinGWってなに?
GCCを中心としたWindows用の開発ツール群。GUI等はなく、 コマンドラインから使う。
MSYSって何?
MinGWを使うときに configure を通すためのツール類。 MinGWにはsh等が含まれていないし、Windowsのディレクトリ構成はUnixの標準的な 構成とはまったく異なる。そのため configure を動かすことができない。 そこで /bin/sh、sed、gzip、bzip2、tarといったものが含まれている。
MSYSの注意点
MSYSではUnix的なディレクトリ(/binや/usr/bin)を実現するため、 仮想的なディレクトリを作る機構が存在する。 この機構はMSYSやMinGWの内部でしか通用しないものとなっている。 例えば、MinGWでコンパイルしたRubyはもはやこの仮想ディレクトリを解釈しない。 この点には注意すべきである。 ちなみに仮想ディレクトリ構造については、 mount というコマンドを使えば どうなっているかがわかる。
MinGW、MSYSの注意点(2)
MinGW、MSYSの各ツールは C:/foo/bar という形式のパスを認識します。 --prefixを指定する場合などはこちらを使ったほうが良いかもしれません。
(追記) Windows における Ruby のバイナリ互換性について
ビルド環境として MinGW、 VC++6、VC++7、VC++8を考えます。 で、ちゃんと検証したわけではありませんが、おそらく以下が成立するはずです。
- MinGWで作ったRubyとVC++6で作った拡張ライブラリは一緒に使える。逆も可。
- MinGWで作ったRubyとVC++7で作った拡張ライブラリは一緒に使えない。逆も不可。
- MinGWで作ったRubyとVC++8で作った拡張ライブラリは一緒に使えない。逆も不可。
- VC++6で作ったRubyとVC++7で作った拡張ライブラリは一緒に使えない。逆も不可。
- VC++6で作ったRubyとVC++8で作った拡張ライブラリは一緒に使えない。逆も不可。
これは利用されるC Runtime libraryの種類が問題になっています。 一応Windowsには異なるビルド環境で作ったオブジェクトファイルを混ぜても 「だいたい」問題なく動作させるための機構があるらしいのですが、Rubyの場合 問題が起こる部分を使っている、ということらしいです。 最近のRubyでは、ビルド時に異なるビルド環境を使おうとしても できないような対策が施されています。
そこで、バイナリ配布されているrubyの処理系は大半がVC++6かMinGW でビルドされているため、 人に配布するためのバイナリを作るのであればこのどちらかを使うべき、ということ になります。
ただまあRuby/SDLに限って言えば問題になりそうな点をつっついていないので なんとなく動いてしまったりはするようです(1.2.0はそんなふうです)。 これもいつ妙なエラーが出るかわかりませんけど。