Haskellでfps。カコイイ。
ソースをみてみると、md3形式のオブジェクトが読めるっぽいので、
Quakeのキャラクタとかがそのまま動きそう。
さっそくコンパイルしてみようとしたんだけど、
ghcがHOpenGLを有効にしてビルドされてなかった(OpenBSDのportは--enable-hopenglされてないのね)。うーむ。
なんとかghciがOpenBSD上で動くようになった。
どのようにすればghciが動くかといった話は、
http://www.ruby-talk.org/cgi-bin/vframe.rb/haskell/haskell-jp/627?599-748
にあったのだが、実際の作業が面倒。
$ objdump -r /usr/local/lib/ghc-6.2.2/*.o
を見ながらリストの作成。
とりあえず上のパッチを当てれば、デフォルトのpackage.confに入っている分が動作可能に。
ghc/rts/Linker.cのコード自体がad-hoc過ぎて涙がでる。
しかもこれのやりかたでは、
Cで書かれた新しいパッケージを追加すればとたんに動かなくなるような気がするのだが。
真面目にHaskellを勉強しようと思ったので、ghciを起動。
$ ghci
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.2.2, for Haskell 98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base ... linking ... /usr/local/lib/ghc-6.2.2/HSbase_cbits.o: unknown symbol `__errno'
ghc-6.2.2: unable to load package `base'
$
うえーん。ghcのビルド時間1時間30分を返せー(いま測った)。
てか変だね。これ。ghcの方はきちんと動いてるからdlfcnまわりの問題かなあ。
OpenBSD-cvs:src/sys/sys/errno.hの
#ifndef _KERNEL
extern int errno; /* global error number */
#if !defined(errno) && !defined(_STANDALONE)
#include <sys/cdefs.h>
__BEGIN_DECLS
int *__errno(void);
int *___errno(void);
__END_DECLS
#define errno (*__errno())
#endif /* errno */
#endif /* _KERNEL */
あたりがあやしいのだが、どうすっかね。
ghc-6.2.2/libraries/base/include/HsBase.hの
/* Ultra-ugly: OpenBSD uses broken macros for sigemptyset and sigfillset (missing casts) */
#if __OpenBSD__
#undef sigemptyset
#undef sigfillset
#endif
が気になるので、
OpenBSD-cvs:src/include/signal.hを読む。
sigemptyset, sigfillset, sigaddset, sigdelset, sigismemberがぜんぶインライン関数になってる。
とりあえず、HsBase.hに
#undef sigaddset
#undef sigdelset
#undef sigismember
を追加してビルドしてみるか。
ううむ。違うか。