hdn
目的 / 前提条件
- windows(XP)上に、Haskell開発環境一式を構築する手順を記述する。
- 基本的には、win32ネイティブアプリを生成するのを目的とするが、可能な限り、非win32環境でも容易に構築できる状態を保持する。
- SDLを使う。
- hsSDLを使う。
- インストールする対象のバージョンを明記しておく。
- バージョンが上がった際に、本体とモジュールの組み合わせ等によって色々と不具合が出る事が多い為。
- 要は、「このバージョン以外での組み合わせは試してないのでちゃんと動くかどうかは不明」という意味。
古いghcの削除
既に古いghcがインストールされている場合は、予めアンインストールしておく。
これは不要かも知れないが、一応念の為に行っておく。
- windowsの左下の「スタート」→「設定」→「コントロールパネル」→「プログラムの追加と削除」→「GHC」→「削除」
- 「C:\Program Files\Haskell」等にHaskell用追加モジュールがインストールされているので、このディレクトリごと消しておく。
- このページの以前の手順でインストールした場合、「F:\ghc」等に*.dll等の外部ライブラリ類がインストールされているので、それも削除しておいても良い(再利用しても正常に動作はする筈)。
ベースシステム
ghc-6.8.2
Haskell用コンパイラ(兼インタプリタ(兼シェル))本体。
- http://www.haskell.org/ghc/ → Binary Packages → Windows をもらってくる。
- インストーラを実行して適当な場所にインストールする。
- path等も自動的に設定され、すぐに使える状態になる。
- 尚、本体をどこにインストールした場合であっても、この後にインストールする外部モジュールは「\\Program Files\Haskell\」にインストールされる事になる(configure時にprefixを変更しない限りは)。
darcs-1.0.9
Haskellで作られたリビジョン管理システム。
darcsでしか配布していないパッケージ等を取得したりする為にも使う。
- http://darcs.net/ から、「Download」→「Binaries and source of the latest stable release」と進む。
- 「Microsoft Windows」のところから、「without Cygwin」の方を貰ってくる(cygwinの入った環境であれば「with Cygwin」を選んでもok)。
- 貰ってきたアーカイブを展開し、適当に、設置したい場所に設置する。
- http://wiki.darcs.net/DarcsWiki/WindowsConfiguration を見ながら、環境設定を行う。
- さっき設置した「darcsdir-w32」にpathを通す。
- この配布物にはputtyが付属しているので、既にputtyをインストールしている人は、競合しないように工夫する事。
reimp.exe
モジュールをインストールする際に必要になる(事もある)、*.libファイルから*.defファイルを作成するユーティリティ。
- mingw-utilsのパッケージを貰ってくる。
- 展開する(lhaplus等の、tar.gzを展開できるユーティリティが必要)。
- 中に入っているreimp.exeを、適当に、pathの通った場所に放り込む(c:\windowsとか)。
モジュール
オプションについて
- 「-O」は最適化を有効にする。但し、インストールにかなり時間がかかってしまうようになる。
- このオプションはCabal-1.2以降でないと使えないようだ。
- 「--enable-split-objs」はオブジェクトを分割してサイズを小さくするオプション、らしい(詳細不明、これも時間かかるっぽい)。
Win32-2.1.0.0
windows.hバインディング。
- http://hackage.haskell.org/packages/archive/pkg-list.html → System → Win32
- Setup.hsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
...
*Main> :main install
SDL
マルチメディアライブラリ。
- 今回は、SDL本体は1.2.13を、SDLバインディングは0.5.1をインストールした。
- 前準備として、SDL本体をインストールするディレクトリを決める。
- このディレクトリ配下に「bin」「include」「lib」の三つのディレクトリを作成する。
- 「bin」には、「*.dll」等を入れる。
- 「include」には、「*.h」等を入れる。
- 「lib」には、「*.a」等を入れる。
- http://www.libsdl.org/ →「Download」→「SDL 1.2」→「Development Libraries」→「Win32」→「Mingw32」→ SDL-devel-*.*.*-mingw32.tar.gz
- 中に入っている「bin/SDL.dll」を、設置先の「bin」にコピーする。
- 中に入っている「include/SDL/」を、設置先の「include/SDL」になるようにコピーする。
- 中に入っている「lib/」内の全ファイルを、設置先の「lib」にコピーする。
- http://hackage.haskell.org/packages/archive/pkg-list.html → Graphics → SDL
- 同梱のWIN32ファイルに書かれている内容を参考にしつつ、SDL.cabalファイルとSDL.hファイルを書き換える。
Include-Dirs: F:\ghc\include\SDL
Extra-Lib-Dirs: F:\ghc\lib
Extra-Libraries: SDL.dll SDLmain
/* #include "SDL_main.h" */
- Setup.lhsを起動
*Main> :main configure -O --enable-split-objs
... (WIN32ファイルに記述してある通りエラーが出るが、続行してok)
*Main> :main build
...
*Main> :main install
SDL_gfx
ソフトウェアによる、汎用描画ライブラリ。
簡単な図形の描画、拡大縮小回転、初歩的なフレームレート操作、画像フィルタ、のそれぞれの機能が提供される。
ソフトウェア的に実現される為、あまり高速とは言えない(多分)。
- 今回は、本体は2.0.16を、モジュールは0.4.0を導入。
- http://www.ferzkopp.net/joomla/content/view/19/14/ → Downloads → Latest Version → *.tar.gz
- http://hackage.haskell.org/packages/archive/pkg-list.html → Graphics → SDL-gfx
- SDL_gfx(本体)の方に入っている*.hファイルを全部、SDL本体をインストールした「include/SDL」内にコピーする。
- コピーした*.hを一つずつエディタで開き、以下の部分を全部修正する(コピーする前に修正してもok)
#ifdef WIN32
#ifdef BUILD_DLL
#define DLLINTERFACE __declspec(dllexport)
#else
#define DLLINTERFACE __declspec(dllimport)
#endif
#else
#define DLLINTERFACE
#endif
↓
#define DLLINTERFACE
- SDL_gfx(本体)の方に入っている*.cファイルを全部、hackageから貰ってきたSDL-gfxの展開ディレクトリの中にコピーする。
- SDL-gfx.cabalに以下の行を修正する(pathは各環境に合わせて直す事)。
Include-Dirs: F:\ghc\include\SDL
Extra-Lib-Dirs: F:\ghc\lib
c-sources:
SDL_framerate.c,
SDL_gfxBlitFunc.c,
SDL_gfxPrimitives.c,
SDL_imageFilter.c,
SDL_rotozoom.c
- Setup.lhsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
...
*Main> :main install
SDL_image
各種の画像フォーマット(pngやjpg等)を扱う為のライブラリ。
標準のSDLだけではbmpしか扱えない。
- http://www.libsdl.org/projects/SDL_image/ Binary → Win32 → devel → SDL_image-devel-*.zip
- 配布物に入っている「include/SDL_image.h」を、インストール先の「include/SDL」内にコピーする。
- 配布物の「lib」に入っている「*.dll」を全部、インストール先の「bin」の中にコピーする。
- SDL_image.dllから、libSDL_image.dll.aを生成する。
- SDL_image.defを作成する。
- 更に、以下のコマンドを実行する。
f:\ghc\ghc-6.8.2\gcc-lib\dlltool -v -d SDL_image.def -D SDL_image.dll -l libSDL_image.dll.a
(path等は各自で修正する事)
- 生成されたlibSDL_image.dll.aを、インストール先の「lib」内にコピーする。
- http://hackage.haskell.org/packages/archive/pkg-list.html → Graphics → SDL-image から*.tar.gzを貰ってくる。
- SDL-image.cabalを編集し、以下を追記する。
Include-Dirs: F:\ghc\include\SDL
Extra-Lib-Dirs: F:\ghc\lib
Extra-Libraries: SDL_image.dll
- Setup.lhsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
...
*Main> :main install
SDL_mixer
BGM及び効果音マネージャ機能が提供される。
- http://www.libsdl.org/projects/SDL_mixer/ → Binary → Win32 → devel → SDL_mixer-devel-*.zip
- 配布物の「include/SDL_mixer.h」を、インストール先の「include/SDL」内にコピーする。
- 配布物の「lib」に入っている「*.dll」を全部、インストール先の「bin」の中にコピーする。
- SDL_mixer.dllから、libSDL_mixer.dll.aを生成する。
- SDL_mixer.defを作成する。
- 更に、以下のコマンドを実行する。
F:\ghc\ghc-6.8.2\gcc-lib\dlltool -v -d SDL_mixer.def -D SDL_mixer.dll -l libSDL_mixer.dll.a
(path等は各自で修正する事)
- 生成されたlibSDL_mixer.dll.aを、インストール先の「lib」内にコピーする。
- http://hackage.haskell.org/packages/archive/pkg-list.html → Graphics → SDL-mixer から*.tar.gzを貰ってくる。
- SDL-mixer.cabalを編集し、以下を追記する。
Include-Dirs: F:\ghc\include\SDL
Extra-Lib-Dirs: F:\ghc\lib
Extra-Libraries: SDL_mixer.dll
- Setup.lhsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
...
*Main> :main install
SDL_ttf
ttfフォントの描画機能が提供される。
- http://www.libsdl.org/projects/SDL_ttf/ → Binary → Win32 → devel → SDL_ttf-devel-l*.zip
- 配布物の「include/SDL_ttf.h」を、インストール先の「include/SDL」内にコピーする。
- 配布物の「lib」に入っている「*.dll」を全部、インストール先の「bin」の中にコピーする。
- SDL_ttf.dllから、libSDL_ttf.dll.aを生成する。
- SDL_ttf.defを作成する。
- 配布物の「lib」でコマンドライン(またはsh等)を開き、以下を実行する。
reimp -d -c SDL_ttf.lib
- 更に、以下のコマンドを実行する。
F:\ghc\ghc-6.8.2\gcc-lib\dlltool -v -d SDL_ttf.def -D SDL_ttf.dll -l libSDL_ttf.dll.a
(path等は各自で修正する事)
- 生成されたlibSDL_ttf.dll.aを、インストール先の「lib」内にコピーする。
- http://hackage.haskell.org/packages/archive/pkg-list.html → Graphics → SDL-ttf から*.tar.gzを貰ってくる。
- SDL-ttf.cabalを編集する。
Include-Dirs: .
↓
Include-Dirs: F:\ghc\include\SDL
Extra-Lib-Dirs: F:\ghc\lib
Extra-Libraries: SDL_ttf.dll
- インストール先の「include/SDL」内に、「Graphics\UI\SDL\TTF」ディレクトリを作り、その中に、配布物内の「Graphics/UI/SDL/TTF/Wrapper.h」をコピーする。
- これをしないと、「-O」オプションで最適化コンパイルする時にエラーが出る。
- Setup.lhsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
...
*Main> :main install
utf8-string
文字列をutf8として扱う為のモジュール。Haskell文字列をC文字列に変換する際には、このモジュールを通さないと正しく変換されない問題がある。
- http://hackage.haskell.org/packages/archive/pkg-list.html → Codec → utf8-string
- Setup.lhsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
...
*Main> :main install
iconv
エンコーディング変換機能が提供される
- 今回は本体1.10-20060516、モジュール0.4を導入。
- http://www.kaoriya.net/#LIBICONV から、最新っぽいlibiconvを貰う
- 展開する
- 展開には、lhaplus等の、tar.bz2形式に対応したアーカイバが必要になる。
- 配布物の「iconv.h」を、インストール先の「include」内にコピーする。
- 配布物の「iconv.dll」を、インストール先の「bin」の中にコピーする。
- iconv.defを作成する。
- 配布物のディレクトリ内でコマンドライン(またはsh等)を開き、以下を実行する。
reimp -d -c iconv.lib
- libiconv.dll.aを生成する。
- 生成されたlibiconv.dll.aを、インストール先の「lib」内にコピーする。
- http://hackage.haskell.org/packages/archive/pkg-list.html → Codec → iconv
- iconv.cabalに追記する。
Include-Dirs: F:\ghc\include
Extra-Lib-Dirs: F:\ghc\lib
Extra-Libraries: iconv.dll
- Setup.hsを起動
*Main> :main configure -O --enable-split-objs
...
*Main> :main build
... (大量にWarningが発生するが、一応生成は完了する。libiconvのバージョンが少し古いのが原因?)
*Main> :main install
問題点
- ghciから「:main」で実行できない
- hsSDLの仕様。詳細は、以下のurlに書いてある。バイナリ生成は問題なく出来るので、--makeでバイナリを生成してから実行すればよい。
- バイナリサイズが大きい
- Haskellの仕様。stripすれば半分程度にはなる。
- 6.8.2からはそこまで大きくならなくなった。大体700kぐらいですむ(おそらくHaskellのコアライブラリのサイズのみ)。
- コンソールが出る
- ghc --make時に「-optl-mwindows」オプションをつければ消せる。尚、Traceログ等はコンソールに出る為、リリース時以外はコンソールをつけておいた方が便利。
- SDL_mixerでBGMを再生したら、早送り/スロー再生になる
- 原因不明。とりあえず、再生させる周波数と各音源ファイルの周波数を同じに合わせれば、通常の速度で再生されるようにはなる。
- SDL全般で、日本語が表示されない
- utf8-stringモジュールを通してC文字列化してから、SDLに渡す事。
外部リンク
古いメモ
最終更新 : 2008/01/06 08:26:08 JST