2008-01-02

MinGWでBigloo 3.0c-4をコンパイルする

MinGWBiglooをコンパイルする際の手順。

  1. アーカイブをMinGWtarで展開する
  2. tarがシンボリックリンクの処理に失敗したファイルを手動で処理する
  3. configure
  4. make
  5. make test
  6. make install
  7. make compile-bee
  8. make install-bee

まず、BiglooのアーカイブをMinGWのtarで展開。ここで、WindowsのアーカイバやCygwinのtarを使ってはいけない。理由は、Cygwin環境へのBiglooのインストールにおける注意点でも触れているけど、アーカイブ内のシンボリックリンク。Windowsのアーカイバで展開すると、シンボリックリンクはまず処理されない。Cygwinで展開すると、シンボリックリンクをWindowsのショートカットで代用するけど、シンボリックリンクの処理に別のアプローチを取っているMinGWでは、ショートカットをシンボリックリンクと認識しない。

次に、MinGWのtarがシンボリックリンクの処理に失敗したファイルを、手動で処理する。MinGWのシンボリックリンクの処理は非常に明快で、リンクする対象をコピーするだけという、富豪的なアプローチを取っている。同期に関してだけは使う側が注意する必要があるものの、MinGWの目的を考えると現実的な落とし所だと思う。しかし、今回はこれが仇となっている。アーカイブの中で、リンクする対象よりもシンボリックリンクが前に格納されている場合、コピーしようにも元のファイルがまだ無いので、エラーになってしまう。Bigloo 3.0c-4の時点では、

  • bde/jas/as.scm
  • bde/jas/classfile.scm
  • bde/jas/lib.scm
  • bde/jas/peep.scm
  • bde/jas/produce.scm
  • bde/jas/profile.scm
  • bde/jas/stack.scm
  • bde/jas/wide.scm

がエラーになるので、comptime/Jas/以下の各ファイルに対して、

$ cd bde/jas
$ ln -s ../../comptime/Jas/as.scm .

といった感じにMinGWのlnでシンボリックリンクの処理をしてやれば大丈夫。

configureについて。標準だと/usr/local以下へのインストールが想定されているので、これを変更する。Cygwinと違って、MinGWでコンパイルされたバイナリは、マイクロソフトのCランタイムライブラリをそのまま使っていて、特殊なパス表記を解釈できるようなエミュレーションレイヤが無い。/usr/localや、MinGW特有の/c/Bigloo、Cygwin特有の/cygdrive/c/Biglooといった表記は全て解釈されないので注意する。C:/Biglooとかなら大丈夫。INSTALLにMinGW向けの情報が載っているので参考にすること。また、BEEという開発環境が付属しているので、インストールするなら、Emacsのパスも同時に指定する。

$ ./configure --prefix=C:/Bigloo --emacs=C:/Emacs/22.1/bin/emacs.exe

といった風に指定すれば良い。

あとは、特に問題無くコンパイルできるはず。GCC 3.Xを使う場合は--cflags=-fno-reorder-blocksを指定するのを忘れない、CygwinではなくMSYSを使う、Cygwinのツールを混ぜない、といった基本的なことを守れば普通に成功する。

追加で注意事項。Biglooではスレッドがサポートされているけど、MinGWでコンパイルする場合、3.0c-4時点では強制的にスレッドサポートが無効にされる。これは、Biglooが採用しているBohem GCが、MinGWでコンパイルしたとき、マルチスレッド下できちんと動作しないからで、一時的なことだと、Biglooの作者のManuel SerranoさんがChangeLogに書いてる。スレッドを使いたい場合、user-levelの物を使うか、BiglooをCygwinでコンパイルすること。

0 件のコメント: