読者です 読者をやめる 読者になる 読者になる

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。mingwMakefile.mingwMakefile.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 はちゃんと動く。しかし csicygwin では動かない(ようにみえる。)これは 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