Debianのmingw32-ocamlをDarwin上でビルドしてみた

Debianにはyumというパッケージシステムがありまして、これがmingw32をターゲットにしたクロスコンパイラを取り揃えているのです。すごい。binutilsgccは元々クロス開発ができるように作られていますので、各自でクロスコンパイラを野良ビルドするのも楽勝*1です、が、yumはmingw32-ocamlなんてパッケージまで持ってます。ocamlのビルドプロセスはクロスコンパイルなんて想定されてないわけで、これはすごい。
というわけで(最近ようやくLeopardからバージョンアップして環境再構築中の)Snow Leopard上でビルドしてみましたらなんかできたっぽいのでアップロードしてみます。yumのパッチをそのまま使って、yumがやっているであろうことを手動でちまちまコマンド打って、エラーが出たらちまちま直して、あとディレクトリ構成は好みに合わせて弄りました。

http://panathenaia.halfmoon.jp/alang/darwin/ のmingw32-ocaml.dmgに置いてますので試したい方はどうぞ。
今、ビルドできたやったー、でこれ書いてますので、本当に動くかろくに試してません。動かなかったら教えていただければ幸いです。

インストール先は/usr/localになります。

  1. mingw32クロスコンパイル環境の作り方(復習)
    1. gccに必要なのでgmp、mpfr、mpcをインストール。これはMacPortsやHomebrewを使ってOK。
    2. MinGW-w64のWIN32 Downloadsから適当なビルド済みアーカイブを取ってきて、/usr/local/i686-w64-mingw32/includeと/usr/local/i686-w64-mingw32/libに配置。
    3. bintuilsをconfigure --target=i686-w64-mingw32してインストール。
    4. gccをconfigure --target=i686-w64-mingw32してインストール。
  2. mingw32-ocamlのビルド
    1. yumのディレクトリからmingw32-ocaml_3.12.0+debian3.tar.gzをダウンロード。
    2. 最新の3.12.1を使いたいので本家からocaml-3.12.1.tar.bz2をダウンロード。
    3. mingw32-ocaml.dmgの中のinstall.txtに書いてあるコマンドを上から順に実行していってください。
    4. または、(私の環境とほぼ同じって自信?のある人は)mingw32-ocaml.dmgにあるビルド済みのファイルを使ってみてください。

とりあえずi686-w64-mingw32-ocamloptを動かすのに最低限必要なものは↓だけみたいですので、/usr/localを汚したくない人は↓だけシンボリックリンクでもOKです。全部他に置きたいって人は同梱してあるパッチから更に書き換えてくださいませ。

/usr/local/
  i686-w64-mingw32/
    bin/
      ocamlrun
      flexlink
    lib/
      flexdll/
        flexdll_mingw.o
      ocaml/
        OCamlのランタイムライブラリ

特にDebianならではやDarwinならではって部分はありませんでしたので、ホストがPOSIXでさえあれば同じ手順でクロスコンパイラが作れそう。(最近流行りらしいARMターゲットのOCamlロスコンパイラは全く見てません)

ところで、どうせwine入れるならWindows用のocamlopt.exeを動かしたほうがよっぽど楽ですねそうですね。

*1:ただしホストがWindowsの場合を除く。もちろんターゲットがWindowsでホストがWindows以外なのは楽勝。