isEOL(@Angelworm_)

this method describes @Angelworm_ is End Of Life

Mac OS 10.9上でのHaskellゲーム開発環境を整えるまで

そんなこんなでゲームを書く事になって、free-gameのようなライブラリも有るとの事なのでHasellでゲームを作ろうとして環境構築に時間がかかった話。

普通にプロジェクトを立ち上げてライブラリを整備する

まずはお約束の呪文

git init

今時はどの言語もグローバル環境(/usr/libとか)に言語のライブラリを配置する事が少なくなりましたね。
Haskellではcabal sandboxを使うとよいそうです。*1

cabal sandbox init

で、この上でcabal installをすればプロジェクトローカルな場所にインストールしてくれるそうです。

cabal install free-game

あとはどっかのプロジェクトから.cabalファイルをパクって自分のプロジェクト仕様にしましょう。

何が起きた

で、幸せになれたなら世界は平和なのですが、道を外れた人に厳しいのはどの世界も同じな様で。いくつかの問題が出ました。

  1. cabalが古いのでsandbox機能が無い
  2. iconvが無いそうだ
  3. そもそもfree-gameのインストールに失敗した

直すのにやたら時間がかかったのでメモ

cabalが古い?

cabal update
cabal install cabal-update

で十分かと思ったらghcも古い。macportshaskell-platformがずいぶん古い。仕方無いので直接haskell-platformを入れようとした。

sudo port uninstall  --follow-dependencies haskell-platform

で、Macports版のHaskell-Platformを消し去る*2。後はもう一回cabal updateで幸せ。

iconvが無い

_iconvという関数がないとldさんから怒られる問題が有りまして。

Macportsを使ってインストールされるlibiconvと元々のlibiconvとは名前が変わっているそうだ。*3

この場合は/usr/libの方のiconvを読んでもらえば良いので、常にそっちがパスにくるように設定する。正確には、~/.cabal/configに以下の様に書き加える。

program-default-options
  ghc-options: -L/usr/lib

ライブラリ入らんやん

どうも入っているOpenGLRawが1.5.0.0で必要なのが1.4.0.0らしい。バージョン名を指定しながらインストール出来るのは良い時代ですね。プロジェクトローカルにcabal install。

[ 3 of 200] Compiling Graphics.Rendering.OpenGL.Raw.EXT.SceneMarker ( src/Graphics/Rendering/OpenGL/Raw/EXT/SceneMarker.hs, dist/build/Graphics/Rendering/OpenGL/Raw/EXT/SceneMarker.o )

src/Graphics/Rendering/OpenGL/Raw/EXT/SceneMarker.hs:30:44:
parse error on input `glBeginScene'

なんとC言語っぽいところでコンパイルエラー。この問題はとうの昔に報告されていて、Macgccが内部的にはclang(!)で有る事に由来する問題だそうです。*4

解決法も示されていて、Macportsとかでインストールしたgccプリプロセッサに使うようにghcを書き換えてしまえば良いそうです。

すなわち、/Library/Frameworks/GHC.framework/Versions/Current/usr/lib/ghc-7.8.3/settingsにある(バージョン次第)設定ファイルを

("C compiler command","/usr/bin/gcc")                                                                                                                                                          
("Haskell CPP command","/usr/bin/gcc")                                                                                                                                                         

から

("C compiler command","/opt/local/bin/gcc")                                                                                                                                                          
("Haskell CPP command","/opt/local/bin/gcc")                                                                                                                                                         

に書き換えてやれば良い事になります。(Macportsgccを入れたなら)

私の環境ではこれでやっとこ入りました。