言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

cygwin で squeak VM をコンパイルする。

色々やる事が多くて忘れてしまいそうなので、とりあえず書きます。cygwinsqueak VMコンパイルする方法。その前に但し書きですが、本来ならばもうちょっと纏めてパッチとして投稿するとかすべきだとは思います。1) まだ再現性のある形ではない。2) cygwinmingw 共用できる Makefile が書けそうで書けてない。という事でメモだけです。

cygwinコンパイルするとはどういうことでしょうか? 本来、cygwinWindows 上のunix エミュレータのように使います。パス名の書き方も強引に unix 風にしてしまいますし、バイナリの実行には gnu ライセンスのランタイムが必要になります。これでは配布できる VMコンパイルで出来ないので、cygwin 上で独立したバイナリを生成するように mingw という別のプロジェクトの成果物をリンク時に利用します。純粋な mingw というシステムがあるのですが、利点を比較すると、cygwin でやったほうが大島さんのコメントにあるように他の cygwin ツールと共用しやすい点があります。

で、理想としては、cygwin 上で mingw ライブラリをリンクするための --mno-cygwin というオプションを付けるだけで良いという物ですが、以下の引っ掛けがありました。

  • より前にインクルードする必要がある。

これは全くもって意味不明ですが、後にインクルードしてしまうと、必要な定数の幾つか(それも5つほどだけ)が未定義になってしまいます。

これは、逆になんで現状のままで mingwコンパイル出来ているのか分かりませんが、文字列を続けるときにはちゃんと行末を \ で終端させて、ニーモニックの最後にはセミコロンを書かないといけません。

  • float.h はフルパスで指定しないといけない。

これも全くもって意味不明ですが、 のように指定すると、どういうわけか通常の cygwin のヘッダファイルを参照してしまうので、"/usr/include/mingw/float.h" のようにフルパスで指定する必要があります。

  • #define VM_PROXY_MINOR 5

この定数の意味が良く分からないのですが、6だとコンパイル出来ませんでした。

今ちょっと問題なのは、cygwin 時に定義される __CYGWIN__ が、-mno-cygwin モードで定義されないという事がありまして、だからどうやったら cygwinmingw で共用できる Makefile (とソース) が書けるのか見当つきません。誰か知らない?