A HASKELL ADVENTURE IN WINDOWS(超訳)

Haskellでゲームを作るのは良いんだけど、Windowsでも動作するようにはしたいよなぁとは思っているので、その方法についてあちこち調べ回っていて、hackageのSDLのページからリンクをたどってたどり着いたANIMAL-MACHINE.COMというサイトのA HASKELL ADVENTURE IN WINDOWSという記事が解りやすかったので、和訳してみました。

キャプチャ画像とかは貼ってませんし、もとより翻訳とかマトモにやった事無い上に英語力がアレな感じなので、所々直訳過ぎて意味が伝わらないとか、意訳しすぎて元の文が死んでたりとか、ってゆーか意味が間違ってたりとかあるかもしれないので、英語読める人は原文へGOです。

多分、間違えまくりなので、得意な人はバシバシ突っ込んでください。
恥ずかしいので直します。

あ、あと、ここに書かれている事全部試したわけでは無いので、活用は自己責任でお願いします。



以前、私のブログHaskellを使った最近のプロジェクトーSDLを用いた戦略ゲームーについて投稿した事がある。

私は主要なOSとしてGNU/LinuxUbuntu10.4を使っているが、Windowsでも私のプロジェクトが実行できる事を確認したい。それは何故かというと、私の妻が使うからだ。
これを理解するのは、当初私が想定していたものよりとても難しいものになった、一般的に考えて、LinuxHaskellでコーディングするほうが簡単だと思われる。

VirtualBox 3.1.6 OSE上のWindows7 x64で私の使った新しいインストール方法*1をこの記事で紹介しよう。
あなたが使っているWindowsのバージョンによっては、この記事の有益度は変わってくるかもしれない。
Haskellのインストール方法、問題となるFFI bindingsのインストール方法、同様にgit toolsのインストールからソースコードリポジトリのクローン、ビルドの方法・・・この記事で全てまかなう予定だ。
大部分は私自身へのノートだが、おそらく他の誰かがここを見つけて役立てるだろう。

最初に考えるのは、基本的なフリーソフトウェアーー私が見つけたとても便利なーーをインストールする事だ。素敵なFirefoxウェブブラウザ、イカしたプログラミング用テキストエディタNotead++、最適なコマンドライン環境Console2、良い感じのアーカイブユーティリティは7-zipと呼ばれている。
これらのパッケージは後に欲しい機能を全て提供しているが、もしあなたがそための他のソフトウェアを活用しているなら、これらはまったく要求しない。

HaskellSDLSDL-image、SDL -ttf FFI bindingsのインストール

Haskell Platform for Windowsのインストールは簡単だ。あなたはここから最新のバージョンをダウンロードできる。私が使っているのはバージョン2010.1.0.0だ。
インストールはデフォルトのまま承認していけばしていけば良い。これによってGHCコンパイラとGHCiインタプリタがインストールされ、環境変数にPATHが追加される。

プラットフォームは、よく使うパッケージだけをインストールし、そしてSDLや関連するライブラリはカットされてしまっている。Windows上でのライブラリのインストールは、手動で編集しビルドファイルを作成する事で完了させなくてはいけない。

MinGW32向けSDL開発パッケージSDL-devel-1.2.14-mingw32.tar.gzSDL_image開発パッケージ SDL-devel-1.2.14-mingw32.tar.gzSDL_ttf開発パッケージSDL_ttf-devel-2.0.9-VC8.zip・・・をダウンロード。これら全てを、以下のスクリーンショットのようにC:\フォルダへ解凍しよう。

※原文ではここにC:\直下にSDL_image-1.2.10、SDL_1.2.10、SDL_ttf-2.0.9というフォルダが配置されたスクリーンショット

これらはHaskellFFI bindingから使いたいC言語のヘッダーとライブラリ提供する。
私たちがインストールする最初のbindingはSDLになる。hackage上のSDLのページへ移動し、下のほうのSDL-0.5.9.tar.gzアーカイブ*2をダウンロードする。このソフトウェアをあなたにとって手頃な場所ーーその具体的な場所は重要ではないーーに解凍しよう。

SDL-0.5.9フォルダ内のWIN32ファイルにWindows上のHaskellビルドの手順が書かれている。以下はその要約版だ。

1.お好みのエディタでSDL-0.5.9/SDL.cabalを開く

2."Extra-Libraries: SDL"と書かれている行をExtra-Libraries: SDL.dll SDLmain”に変更する

3.変更した行の下に、以下の二行を追加する(元のバージョンから正確に)

Include-Dirs: C:\SDL-1.2.14\include\SDL
Extra-Lib-Dirs: C:\SDL-1.2.14\lib

4.cmd.exeまたはConsole2どちらか*3コマンドラインウィンドウを開く。私はこれを管理者として実行する、何故なら、このコマンドラインを使って最終的にデフォルトのC:\Program Files (x64)へ、Haskellパッケージをインストールするからだ。

5.以下のコマンドを実行する

runghc Setup.lhs configure

configureスクリプトに関するエラーメッセージが表示されるが、無視する。

※原文ではここに警告文が表示されているスクリーンショット

6.次の2つのコマンドを実行する。最後の一つは権限を要求し、C:\Program Files\Haskellフォルダに書き込みを行う。

runghc Setup.lhs build
runghc Setup.lhs install

※原文ではここに警告文が表示されているスクリーンショット

主となるSDLのビルドが終わったら、SDL-image bindingのビルドを行う。多くのステップは私たちが丁度SDLのために行ったのと同様になる。
hackage上のSDL-imageのページへ移動し、SDL-image-0.5.2.tar.gzファイルをダウンロードし、何処か手頃な場所ーー私はデスクトップに配置しているーーに解凍する。

1.お好みのエディタでSDL-image-0.5.2\SDL-image.cabalを開き、ファイルの最後に以下の行を追加する。

Include-Dirs: C:\SDL_image-1.2.10\include

2.SDL-image-0.5.2\Graphics\UI\SDL\Image\Version.hscファイルを開き、#include “SDL_image.h”の下に追加。

#include "SDL.h"
#ifdef main
#undef main
#endif

この処置はここで見つけた。

3.以下のコマンドを実行し、configureスクリプトに関して文句言ってくるのは無視する。

runghc Setup.lhs configure
runghc Setup.lhs build
runghc Setup.lhs install

これも同じようにインストールできる事の証明がこちら。*4

※ここに上記3つのコマンドを実行した画面のスクリーンショット

最後の必要なbindingはSDL_ttfだ。手順は既にあなたの見慣れたものになっているはず。hackageのSDL-ttfのページからSDL-ttf-0.5.5.tar.gzをダウンロードし、何処かにこれを解凍しよう。

1.お好みのエディタでSDL-ttf-0.5.5\SDL-ttf.cabalを開き、ファイルの最後に以下の行を追加。

Include-Dirs: C:\SDL_ttf-2.0.9\include

2.SDL-ttf-0.5.5\Graphics\UI\SDL\TTF\Version.hscを開いて#include “SDL_ttf.h”の下に追加。

#include "SDL.h"
#ifdef main
#undef main
#endif

3.以下のコマンドを実行し、configureスクリプトについて文句言ってくるのは無視。

runghc Setup.lhs configure
runghc Setup.lhs build
runghc Setup.lhs install

ターミナルのスクリーンショットのスペースは節約しよう。

gitのインストール、そしてソースコードのクローン

Pro Git本によって、私の使っているmsysgitはgitの基本的な機能を提供している。

“InstallMSysGit” wiki pageに従ってはいけない、何故ならこれはあなたを間違った道*5に導いてしまうからだ。
gitの十分なフルインストーラ(Git-1.7.0.2-preview20100309.exe) をダウンロードし、これをインストールしよう。私はPATH variableについて考えた他は、全てデフォルトの設定を使った。ーー私は"GitをWindowsコマンドプロンプトから使う(Run Git from the Windows Command Prompt)"を選択している。

そして他の良いビューを手に入れよう。私はKDiff3パッケージをインストールした。これは次に私のインストールするツールと上手く調和している。KDiff3インストーラをダウンロードし、これをインストールしよう。

次はGitExtentionsパッケージ。これはgitを扱うナイスなGUIだ。ここから完璧なインストーラをかっぱらおう。私はこれを全てデフォルトの設定でインストールする。初回実行時、これはあなたのシステムを調べて、使用するのに必要なソフトウェアを検索する。もしあなたが上の通りgitとkdiff3をセットアップしているなら、自動的に検出するはずだ。そしてGitExtentionsのセットアップが終わったら、SettingsウィンドウのGlobal settingsタブに切り替え、ユーザー名とメールアドレスを入力する。Checklistタブに戻って"Save and rescan"ボタンをクリックし、"Ok"ボタンでセットアップは終わりだ。

※原文ではここにGitExtensionsのスクリーンショット

"Clone repository"ボタンをクリックし、http://github.com/tbogdala/ExitStrategy.gitのようなリポジトリをクローンする。私は出力先(destination)に私の標準であるC:\Projectsフォルダを設定した。"Clone"をクリックで、ソースファイルのコピーがダウンロードされる。

※原文ではここにClone操作中の画面のスクリーンショット

gitに関する追加情報、Pro Git本*6はチェックしとこう。The Seeker's Quillによるgitに関する良い記事がある。そしてさらに私が見付け出したlostechiesというブログが助けになる。

ゲームをビルドする

今、これで私たちは前もって必要なソフトウェアをインストールし、プロジェクトのソースコードをコピーした、これで準備は万端・・・

えーと、ちょっと待って。もしあなたの環境で直ちに、cabal configureし、プロジェクトをビルドしようとすると、SDL-imageとSDL-ttfのポイントでどっさりとリンクエラーを得る。Undefined reference to ‘IMG_Load_RW’, undefined reference to ‘IMG_Load’・・・ みたいにね。

※原文ではここで実際にエラーが出ているスクリーンショット

1.exitstrategy.cabalファイルを開き、これらの2行を最後に追加する。

Extra-Lib-Dirs:    C:\SDL_image-1.2.10\lib, C:\SDL_ttf-2.0.9\lib
  Extra-Libraries:   SDL_image, SDL_ttf

2.C:\SDL_image\libフォルダーへ移動し、SDL_image.dllのコピーを作成し、 libSDL_image.dll.a (lib*.a)を呼ぶ

3.step2と同じように、C:\SDL_ttf-2.0.9\libフォルダへ移動し、SDL_ttf.dllのコピーを作成し、libSDL_ttf.dll.aを呼ぶ。

そして、プロジェクトをビルドする。

※原文ではここでビルドに成功しているコマンドラインスクリーンショット

最後のステップは以下のファイルのコピーを作成し、これらをC:\Projects\ExitStrategy\dist\build\exitstrategy-editorに配置することだ。

  • C:\SDL-1.2.14\bin\SDL.dll
  • C:\SDL_image-1.2.10\lib\jpeg.dll
  • C:\SDL_image-1.2.10\lib\libpng12-0.dll
  • C:\SDL_image-1.2.10\lib\libtiff-3.dll
  • C:\SDL_image-1.2.10\lib\SDL_image.dll
  • C:\SDL_image-1.2.10\lib\zlib1.dll
  • C:\SDL_ttf-2.0.9\lib\libfreetype-6.dll
  • C:\SDL_ttf-2.0.9\lib\SDL_ttf.dll

最後に、コマンドラインでC:\Projects\ExitStrategyから“dist\build\exitstrategy-editor\exitstrategy-editor.exe”を実行すると、成功だ!

※原文ではここにゲーム画面が起動しているスクリーンショット

しかし今、exitstrategy-editor.exeをダブルクリックしても実行されない。何故ならこれはart/64×74配下に何も探しに行かないからだ。(あなたがさらに、このフォルダからビルドディレクトリに全てのdllをコピーすれば話は別だが)。これは未来のバージョンで修正するつもりだ。



この文章はANIMAL-MACHINE.COMのA HASKELL ADVENTURE IN WINDOWSを2012/12/15にブログ主が意訳したものです

*1:訳注:fresh installation

*2:訳注:今確認しに行ったらSDL-0.6.4.tar.gzになっていました。

*3:訳注:powershellもあるよっ!

*4:訳注:上手く訳せなかったけど、SDL-imageもSDLと同様にしてインストールできた・・・という意味だと思われる

*5:訳注:pathはファイル名の意味か、それともpath(小道)とpath(ファイルパス)を引っ掛けてるのか・・・

*6:訳注:【日本語版】http://snipurl.com/progit-pdf-ja