mingw port status

gc-7.2alpha2を使うことで、より少ないオプションでビルドできるようになった。まだ十分に検証されていないので注意。
MinGWCygwinは(mosh concurrent)とFFIを使ってSDLが動くことを確認した。
MinGWは単にLoadLibraryAに置き換えるだけで、

void* FFI::open(const char* name)
{
#ifdef _WIN32
    return (void *)LoadLibraryA(name);
#else
    return dlopen(name, RTLD_LAZY | RTLD_GLOBAL);
#endif
}
...
    return (void *)GetProcAddress((HMODULE)handle,symbol);
...
    return FreeLibrary((HMODULE)handle);
...

のようになる(他にFFIProcedures.cppでFFI_SUPPORTEDが定義されるように修正する必要もある)。もちろん、いわゆる2byte文字を含むパスにあるDLL*1はロードできなくなる。これはVista以降では重要な問題ではないが、XPでは%APPDATA%がユーザ名をパスに含むので問題になりうる。schemeコード側でエンコードしてしまうのが早いと考えられる。
GCヒープに置いてあるデータをWin32 APIに安全に渡せるかどうかは実装による。今のところ何も検証していないので今後問題が起こるかも知れない。
一応必要な道具は揃ったので、moshの標準機能だけでグラフィカルなプログラムを書く素地ができたことになる。もっとも、callbackが無いのと、Cygwin/MinGWで作ったスレッドからSDLを呼ぶことは出来ない*2のでイベントはすべてpollingで処理することになる。通常のシチュエーションではpollingでもそれなりの速度で動作する。
SDLやgstreamerのようなライブラリは機能の設定を環境変数で行うが、mosh側にはgetenvが有ってもsetenvが無い。
細かいことはこっちにメモ : http://wiki.monaos.org/index.php?.mjt%2Fmosh%2Ftips

  • MSVC版

VC版をコマンドラインでビルドするには :

devenv mosh.sln /build Release

のようにする。r1955の段階では、何故かgmp.libにmpz_importやexportが無いのでビルドに失敗する。

devenv mosh.sln /Clean Release

でclean。
devenvコマンドを使うためには、スタートメニューの"VisualStudio 2008コマンドプロンプト"から実行する必要がある。またSP1が必須

*1:より正確には、LoadLibraryに渡す文字列に2byte文字を含む場合。

*2:基本的に同期関数以外のSDLの関数はmainスレッド(SDL_Initしたスレッド)以外からは呼ばない。いくつかの環境では描画関数を他のスレッドから呼んでも機能するが、スレッドセーフには出来ていない。