MinGW を使ったChicken Scheme を cygwin にインストールする

問題

度忘れてしまうので、自分用にメモします。


Chicken Schemecygwin にインストールしたい。


guile や clisp と違って、chicken は cygwin の setup.exe からインストールできないので、
chicken のサイトからソースをダウンロードして、make することになります。


chicken のサイトはこちら。


CHICKEN Scheme
http://call-cc.org/


ファイルを解凍したあと、ディレクトリに入って、

$ make PLATFORM=cygwin

するとコンパイルできます。

chicken は configure; make というよくあるやり方ではなく、make のコマンドラインから PLATFORM 変数を定義することで環境別のビルドを行うようです。


cygwin 用にインストールするには、 PLATFORM=cygwin を指定すると。


ただ、こうしてできたバイナリは、cygwin1.dll に依存していて、csc で生成した実行バイナリも cygwin1.dll に依存してしまいます。

$ ldd ./csi
	ntdll.dll => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x773d0000)
	kernel32.dll => /cygdrive/c/Windows/syswow64/kernel32.dll (0x74c40000)
	KERNELBASE.dll => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x74f90000)
	cygchicken-0.dll => /home/hiroya/tools/chicken-4.8.0/cygchicken-0.dll (0x6a800000)
	cygwin1.dll => /usr/bin/cygwin1.dll (0x61000000)
	??? => ??? (0x5d0000)

chicken で作ったものを配布するとき、依存するファイル、添付する dll はなるべく減らしたいです。


そこで、 cygwin1.dll に依存しない chicken のバイナリを生成したいです。
ただし cygwin で使えるもので。


長い前置きでしたね。

対応

Windows で使える gcc には cygwin のものの他に、mingw のものがあります。


なので、MinGW と msys をインストールして、msys 上で chicken を make するという手段はあります。


しかし、chicken を使うときは msys、w3m を使うときは cygwin と渡り歩いていくのはちょっと面倒です。Cygwin Terminal をダブルクリックして、そのままずっとそこでいたい。


setup.exe の Devel カテゴリから、mingw-gcc をインストールすれば、mingw の、cygwin1.dll に依存しない gcc をインストールできます。


ということは、chicken を make する際、コンパイラmingwgcc を使って、と指示することができればよいわけです。


で、こうやって make したらできました。

$ make PLATFORM=mingw-msys \
       C_COMPILER=i686-pc-mingw32-gcc.exe \
       PREFIX=C:/cygwin/usr/local

一番の問題は PREFIX の指定のしかたで、これを

PREFIX=C:\\cygwin\\usr\\local

などと書いてはいけないのです。'\\' ではなく '/' を使えとは README にもちゃんと書いてあるのですが、私はいつもこれを忘れてしまいます。


PLATFORM は cygwin にインストールした mingw (の include, lib) 環境を使ってくれという指示。
C_COMPILER は cygwin のではなく、mingwgcc を使ってくれ、という指示になります。


こうして作ったバイナリを ldd で見てみると、

$ ldd ./csi
	ntdll.dll => /cygdrive/c/Windows/SysWOW64/ntdll.dll (0x773d0000)
	kernel32.dll => /cygdrive/c/Windows/syswow64/kernel32.dll (0x74c40000)
	KERNELBASE.dll => /cygdrive/c/Windows/syswow64/KERNELBASE.dll (0x74f90000)
	libchicken.dll => /usr/local/bin/libchicken.dll (0x62980000)
	ADVAPI32.DLL => /cygdrive/c/Windows/syswow64/ADVAPI32.DLL (0x763c0000)
	msvcrt.dll => /cygdrive/c/Windows/syswow64/msvcrt.dll (0x76660000)
	sechost.dll => /cygdrive/c/Windows/SysWOW64/sechost.dll (0x75380000)
	RPCRT4.dll => /cygdrive/c/Windows/syswow64/RPCRT4.dll (0x74d80000)
	SspiCli.dll => /cygdrive/c/Windows/syswow64/SspiCli.dll (0x74ab0000)
	CRYPTBASE.dll => /cygdrive/c/Windows/syswow64/CRYPTBASE.dll (0x74aa0000)
	USER32.dll => /cygdrive/c/Windows/syswow64/USER32.dll (0x75540000)
	GDI32.dll => /cygdrive/c/Windows/syswow64/GDI32.dll (0x765b0000)
	LPK.dll => /cygdrive/c/Windows/syswow64/LPK.dll (0x76b00000)
	USP10.dll => /cygdrive/c/Windows/syswow64/USP10.dll (0x74b10000)
	WS2_32.dll => /cygdrive/c/Windows/syswow64/WS2_32.dll (0x75040000)
	NSI.dll => /cygdrive/c/Windows/syswow64/NSI.dll (0x773a0000)
	IMM32.DLL => /cygdrive/c/Windows/system32/IMM32.DLL (0x75160000)
	MSCTF.dll => /cygdrive/c/Windows/syswow64/MSCTF.dll (0x75080000)

ちょっと長いですが、

  • libchicken.dll 以外は C:\Windows の dll であること
  • cygwin1.dll には依存していないこと

が見てとれると思います。


そして、

$ make PLATFORM=mingw-msys install

してあげれば、めでたく /usr/local 以下にインストール完了、問題解決となります。