MinGW を使ったChicken Scheme を cygwin にインストールする
問題
毎度忘れてしまうので、自分用にメモします。
Chicken Scheme を cygwin にインストールしたい。
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 する際、コンパイラは mingw の gcc を使って、と指示することができればよいわけです。
で、こうやって 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 のではなく、mingw の gcc を使ってくれ、という指示になります。
こうして作ったバイナリを 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 以下にインストール完了、問題解決となります。