chicken を cygwin で mingw 用にコンパイル
結果としてできたのは mingw 用のもの。cygwin とは残念ながら親和性がない。cygwin 用のは別途書きます。
よくまとまった blog があった。
2013-01-22 - へびやんず・でぃすとうてぃど・だいありぃ
chicken-4.9.0.1 を解凍して make する。
おっとそのまえに TEMP を設定しておく。
setenv TEMP c:/cygwin64/tmp
のちの checken-install で temp がないとおこられるから。
http://wiki.call-cc.org/man/4/Unit%20files#file-copy
cygwin の TEMP とかとバッティングしないか心配。TEMP は unix 系では使わないからいいのか?
chicken-4.9.0.1> make PLATFORM=mingw-msys C_COMPILER=x86_64-w64-mingw32-gcc.exe PREFIX=c:/cygwin64/usr/local
しかし本当は chicken の設計としては HOST と TARGET で別れるべき。しかも総設計されている。なので C_COMPILER にプレフィックスまで入れるのは編。あと、パスも結局 cygwin とは関係ない世界で作る必要があるので /mingw の どっかにすべき。が、とりあえずこれですすめるとうまくコンパイルはできる。
makefile は GNUMakefile から PLATFORM の名前の付いた Makefileがよばれる。この場合は Makefile.mingw-msys。mingw は Makefile.mingw と Makefile.mingw-msys がある。前者が Dos 系のコマンド(たとえば del) を使う。後者が Unix 系のコマンド(rmとか)を使う。
ARCH は mingw のときは無視される。cygwin では ARCH をちゃんとつけないと 64bit ではコンパイルできない。ARCH=x86-64 が正しいらしい。これでただしい S ファイルが選択される。しかし、私の cygwin では gcc でエラー。どうもアセンブラの体系が違うらしい。_ を削って、.type を削るとコンパイルできることはできる。
インストールすると
copy "C:\cygwin64\tmp\tempe346.35500\modules.db" "c:\cygwin64\usr\local\lib\chicken\7\modules.db" 1 ??t@C s[オワオスB
と出て何事かと思うが、utf-8 にしてみると、
loading import libraries ... generating database srfi-69 srfi-4 srfi-18 setup-download srfi-14 tcp setup-api srfi-13 srfi-1 utils posix ports lolevel irregex foreign files extras data-structures csi chicken r5rs-null r4rs-null scheme r4rs copy "C:\cygwin64\tmp\tempf68c.34672\modules.db" "c:\cygwin64\usr\local\lib\chicken\7\modules.db" 1 個のファイルをコピーしました。
で大丈夫なことがわかった。
コンパイルに失敗すると chicken-config.h chicken-defaults.h がみょうちくりんなのができて、以後コンパイルができなくなる。はまりました。この場合は、最初から展開してやりなおしましょう。clean じゃ h ファイルが消えない。
ついでにかくと、git から clone すると、library.c などが入っていない。これは chicken で生成されるファイル。つまり、chicken を作るために chicken が必要!!卵が先か?鶏が先か?この場合は chicken が先。
できた csc はちゃんと動く。しかし csi は cygwin では動かない(ようにみえる。)これは mingw でつくってしまったから。cmd.exe 経由では動く。
本当にやりたかったこと(なのかどうかも不明になってきた) は host が cygwin で target が mingw。上の C_COMPILER は gcc などを指定する。TARGETSYSTEM=x86_64-w64-mingw32 で TARGET_PREFIX=PREFIX=c:/chicken だけを指定して、あとは cygwin の環境にすべき。一応、それでも作れる(コツが必要だが)が意味がないからやめることにした。
chicken-4.9.0.1> make PLATFORM=mingw-msys TARGETSYSTEM=x86_64-w64-mingw32 TARGET_PREFIX=c:/cygwin64/usr/local ARCH=x86-64 PREFIX=c:/cygwin64/usr/local