FTGL on GHC on Windows


http://hackage.haskell.org/package/FTGL これをWindowsで使いたいという話。泣きそうなほど苦労したのでここに書いとく。

GHCのインストール

まずは、GHCのインストールです。WindowsだとHaskell Platform(http://hackage.haskell.org/platform/)を入れるのが楽。cabal-installが入ってパスもとおってうれしい。

MinGWのインストール

いきなりcabal installしても、ftglがなくて入るはずがないので、まずそっちを何とかする。そもそもWindowsで外部ライブラリの必要なcabalパッケージってどうやってインストールするのかよく知らない。調べたところ、cygwinMinGWがあればいいらしい。cygwinの場合、cygwinをインストールして、その上にftglをインストールしてそこでcabal installすると結構簡単にインストール自体は成功したのだが、いざ動かそうとすると、cygwinGHCMinGWの食い合わせが悪いのか、うまく動かない(CPU100%食って固まる)。なので、cygwinは没となった。

まずはMinGWをインストールする。http://sourceforge.net/projects/mingw/files/ から、Automated MinGW Installerと、MSYS Base Systemをインストールする。msysのインストールの際にmingwの場所を教えて、msysのシェルからMinGWが参照できるようにする。

ftglのインストール

http://sourceforge.net/projects/ftgl/files/ から 2.1.3~rc5をダウンロードして、MinGWにインストールする。./configure; make; make install でいいのだが、./configureが、FreeType2が見つけられないと言ってこけるはずである。

FreeType2のインストール

http://ftp.twaren.net/Unix/NonGNU/freetype/ ここから、一番新しそうなのをダウンロードしてMinGWにインストールする。これはすんなり入ってくれるはず。

再びftglのインストール

freetypeをインストールして再度ftglの./configrueを実行すると、今度はGL libraryが見つからないとかでこける。GL libraryって何ぞ?という話だが、どうやら-lGLのことらしい。MinGWにはあらかじめopenglとGLUのライブラリがインストールされているので、見つけられないのはスクリプトがおかしいから。--with-gl-libでライブラリの場所を指定せよとのエラーメッセージが出てきているが、そもそもMinGWでのopenglのライブラリの名前は-lGLじゃなくて-lopengl32なので指定してもどうやっても見つからない。幸いm4ファイルが同梱されているので、これを書き換えることにする。m4/gl.m4というファイルがあって、これでopenglライブラリのチェックをしているので、これを書き換える。LIBSの-lGLとなっているところを書き換えればいいと思いきや、MinGW環境ではOpenGLに対するAC_LANG_CALLマクロがそもそもうまく動かないので(AC_LANG_CALLはmainの中に指定した関数を呼び出すコードを生成してコンパイルを試みるようだが、MinGWでのopenglの呼び出しはcdeclではないようなので、リンクがどうやっても成功しない)これを成功させることはあきらめ、失敗したときのコードを、無理やり成功したことにさせる。72行目付近:

if test "x$HAVE_GL" = xyes ; then
    AC_MSG_RESULT([yes])
    GL_LIBS=$LIBS
else
#    AC_MSG_RESULT([no])
#    AC_MSG_ERROR([GL library could not be found, please specify its location with --with-gl-lib.  If this still fails, please contact henryj@paradise.net.nz, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.])
    AC_MSG_RESULT([yes])
    GL_LIBS="-lopengl32"
fi

また、同様の理由で-lGLUの検出もこけるので、そこも書き換えておく。116行目付近:

if test "x$HAVE_GLU" = xyes ; then
    AC_MSG_RESULT([yes])
    GL_LIBS="$LIBS"
else
#    AC_MSG_RESULT([no])
#    AC_MSG_ERROR([GLU library could not be found, please specify its location with --with-gl-lib.  If this still fails, please contact henryj@paradise.net.nz, include the string FTGL somewhere in the subject line and provide a copy of the config.log file that was left behind.])
    AC_MSG_RESULT([yes])
    GL_LIBS="-lglu32 $GL_LIBS"
fi

autotoolsのインストール

m4/gl.m4を書き換えた後に、./autogen.shを実行しなければならないが、このときにautotoolsが必要になる。http://sourceforge.net/projects/mingw/files/ から、MSYS Supplementary ToolsのmsysDTK-1.0.1をインストールする。

msysDTKに入っているautoconfのバージョンは2.56だが、ftglが2.58以上を要求するので、http://ftp.gnu.org/gnu/autoconf/ ここからautoconfの新しいのを持ってきてインストールする。

さらにlibtoolもバージョンが古いといわれるので、1.4.2以上のを http://ftp.gnu.org/gnu/libtool/ ここから拾ってきて入れる。

三度ftglのインストール

./autogen.shを実行すると今度は成功するはずなので、続いて./configureする。これもようやくうまくいくはずである。make; make installでftglのインストール完了。

FTGL(Haskellのほう)のインストール

ようやくFTGLパッケージをインストールできる準備がととのったので、インストールする。

cabal install FTGL --user --extra-include-dirs=/usr/local/include --extra-lib-dirs=/usr/local/lib

http://blog.mestan.fr/2009/09/24/3d-text-rendering-in-haskell-with-ftgl/ ここにいいサンプルがあるので、実行してみる。すると、大量のリンクエラーメッセージが出るはずである。FTGLが使っているfreetypeとlibstdc++の関数がどうやらリンクできていないらしい。ghcコマンドラインに--optl-lstdc++とかやってもうまくコンパイルできない(順序が大切?)。きっとftglかFTGLかのどちらかを書き換えないといけないのだろう。個人的に書き換えやすいFTGLのほうを書き換えることにする。

http://hackage.haskell.org/package/FTGL ここからアーカイブを取ってきて、FTGL.cabalの最後のほうのを

Library
   Build-Depends: OpenGL, base
   Exposed-Modules:
      Graphics.Rendering.FTGL
   extra-libraries: ftgl

から

Library
   Build-Depends: OpenGL, base
   Exposed-Modules:
      Graphics.Rendering.FTGL
   extra-libraries: ftgl stdc++ freetype

に変える。それから、

$ cabal configure --user --extra-include-dirs=/usr/local/include --extra-lib-dirs=/usr/local/lib
$ cabal build
$ cabal install --user --extra-include-dirs=/usr/local/include --extra-lib-dirs=/usr/local/lib

で、インストール。

テスト

再度先ほどのサンプルプログラムをコンパイルすると今度はリンクに成功する。実行するとglut32.dllがないといわれるので、http://jp.dll-download-system.com/dlls-download-g-/glut32.dll.html この辺から適当に拾ってきて同じディレクトリに入れる。

実行してみると、、、

動いたー

utf8-stringのencodeStringすれば日本語も出たー