RMagick2.3.0

ActiveScriptRuby用にVC++6.0でRMagickをメイクする。
gemを使えばRMagick、そのままインストールできるんだが、自力でメイクする場合はちょっと注意が要る。
ActiveScriptRubyと開発用のヘッダーファイルなどのインストールは終わって、拡張ライブラリを作成できる状態になっているとする。
ActiveScriptRubyは1.8.6.7を使っている。

1. ファイルのダウンロード

[RubyForge: RMagick: ファイルリスト]から、
"RMagick-2.3.0.tar.bz2"
をダウンロードする。
[ImageMagick: Install from Binary Distribution]から、
"ImageMagick-6.4.0-3-Q16-windows-dll.exe"
をダウンロードする。

2. ImageMagickのインストール。

"ImageMagick-6.4.0-3-Q16-windows-dll.exe"をインストールする。
インストール時のオプション選択で、ヘッダーファイルがインストールされるようにする。
インストール先はデフォルトのものを使う。

3. RMagickの展開

"RMagick-2.3.0.tar.bz2"を展開する。

4. "extconf.rb"の修正

"ext/RMagick/extconf.rb"
を修正する。vc++6.0では/LINKオプションに/LIBPATH:"C:\Program Files"というふうに渡すと、"C:\Program"と"Files"に別れてしまう。*1
"/LIBPATH:\"C:\Program Files\""が渡されるようにする。
"extconf.rb"が"Makefile"を生成するので、"ext/RMagick/extconf.rb"を次のように修正してやる。
また、ImageMagickのインストールフォルダーには"Q16"とか"Q8"とかいう文字列が入っているが、その部分は"extconf.rb"が解決してくれない。オリジナルの"extconf.rb"では、"ImageMagick-6.4.0-2-Q8-windows-dll.exe"がインストールされることを想定しているので"Q8"になっている。"Q16"に置換してやる。

  $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"}

  $CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q16\\include"}

(変更箇所:"Q8"->"Q16")

  $LDFLAGS = %Q{/link /LIBPATH:"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib" /LIBPATH:"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib" /LIBPATH:"C:\\ruby\\lib"}

  $LDFLAGS = %Q{/link "/LIBPATH:\\"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib\\"" "/LIBPATH:\\"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib\\"" "/LIBPATH:\\"C:\\ruby\\lib\\""}

(変更箇所:"Q8"->"Q16"、/LIBPATHとダブルクォーテーション)

これで、"setup.rb"でライブラリがメイクできる。

余談

僕の環境ではImageMagick Displayがおかしな挙動をしてくれて、画像ファイルを開いて、別名で保存(Save As...)とかするとファイルサイズ0のファイルを作るだけで、きちんと保存されない。RMagickを介して、画像ファイルを開いて保存すると、ちゃんと保存される。これは、ImageMagick Displayの問題だろうか? 僕の環境がなんかおかしいのか? よくわからん。RMagickが使えたらいいかと、あまり深く調べていない(どう調べりゃいいんだ?ってのもある)。

*1:簡単に試した感じ、VC++8.0では、この問題は解決されているように見える。VC++7.0, VC++7.1は試してないので知らない。