HGL(2)
この間、見かけた燕の子供達がいつの間にか居なくなっていた。巣はもぬけの空である。 今頃、どこの空の下で餌をついばんでいるのやら。ともあれ、あの4羽の子供達に幸あれと。
HGL りべンジ(1)
昨日は、WindowsXP上のHaskellに、HGL(低レベルなグラフィクライブラリー)を入れようと して、ちから尽きてしまった。今日は、方針をちょっと変えてやってみる。
そもそも、cabalでエラーになったのは、同名のdirがあったからではなかろうか。だったら 新しく入れるHGLをMYGraphicsにしちゃうのは、どうだろう? これなら、名前の衝突は避けられる よね。トップにある Graphics dir名は、手動で変更するとして、ソース中に書かれて名前は 自動で変更したいよね。unix風スクリプトを走らせたよ。普通は、WindowsShell とかを 使うんだろうけど、良く知らないので。。。
foreach f *.hs sed -e 's/Graphics/MYGraphics/' %f% >ZZZ mv ZZZ %f% end
こうやって、ソースを変更してから、runghc Setup.hs (configure | build) するも、 コンパイル中にエラーが多発して収拾が付かなくなった。あえなく敗退。
HGL リベンジ(2)
ならば、次の手。元々入っている、Graphcis.Win32 を優先させる方法は無いか? Setup.hs は、何をやっているか覗いてみた。すると、Distribution.Simple を呼び出しているだけ。 しょうがないので、GHCのライブラリーを同名で検索してみた。すると、buildの変わりに Makefileを作る事が出来るようだ。早速やってみたよ。
c:\>cd sakae\HGL-3.2.0.0\ c:\sakae\HGL-3.2.0.0>runghc Setup.hs configure Configuring HGL-3.2.0.0... c:\sakae\HGL-3.2.0.0>runghc Setup.hs makefile Preprocessing library HGL-3.2.0.0... Generating Makefile HGL-3.2.0.0... c:\sakae\HGL-3.2.0.0>ls Graphics/ HGL.cabal LICENSE Makefile Setup.hs dist/
おお、出来てる出来てる。闇に包まれて、裏でこそこそやられたって、ちっとも嬉しく無い。 だから、gemとかも嫌いさ。で、じっくりMakefileを覗いてみて、packageオプションで、 標準配布物 Win32-2.2.0.0 を、陽に指定してみた。(下記は、Makefileの一部)
odir = dist/build package = HGL-3.2.0.0 GHC_OPTS = -package-name HGL-3.2.0.0 -hide-all-packages -no-user-package-conf -i -idist/build -i. -idist/build/autogen -Idist/build/autogen -Idist/build -optP-DX_DISPLAY_MISSING -optP-include -optPdist/build/autogen/cabal_macros.h -odir dist/build -hidir dist/build -stubdir dist/build -package array-0.2.0.0 -package Win32-2.2.0.0 -package base-4.1.0.0 -O -XCPP MAKEFILE = Makefile C_SRCS = GHC_CC_OPTS = -package array-0.2.0.0 -package Win32-2.2.0.0 -package base-4.1.0.0 -optc-O2 -odir dist/build GHCI_LIB = dist/build/HSHGL-3.2.0.0.o soext = dll LIB_LD_OPTS = -package-name HGL-3.2.0.0 -package array-0.2.0.0 -package Win32-2.2.0.0 -package base-4.1.0.0 AR = C:/ghc/ghc-6.10.3/bin/ar.exe LD = C:/ghc/ghc-6.10.3/gcc-lib/ld.exe -x
こうして、gmakeすると、(BCC付属のmakeは、役立たずなので、MinSYSから取ってきた、makeを gmakeに改名した)
c:\sakae\HGL-3.2.0.0>gmake C:/ghc/ghc-6.10.3/bin/ghc.exe -package-name HGL-3.2.0.0 -hide-all-packages -no-user-package-conf -i -idist/build -i. -idist/build/autogen -Idist/build/autogen -Idist/build -optP-DX_DISPLAY_MISSING -optP-include -optPdist/build/autogen/cabal_macros.h -odir dist/build -hidir dist/build -stubdir dist/build -package array-0.2.0.0 -package Win32-2.2.0.0 -package base-4.1.0.0 -O -XCPP -idist/build -c Graphics/HGL/Internals/Utilities.hs -o dist/build/Graphics/HGL/Internals/Utilities.o -ohi dist/build/Graphics/HGL/Internals/Utilities.hi Graphics\HGL\Internals\Utilities.hs:33:30: Class `E.Exception' used as a type In the type `E.Exception' In the type `Either E.Exception a' In the type `IO (Either E.Exception a)' gmake: *** [dist/build/Graphics/HGL/Internals/Utilities.o] Error 1
ありゃりゃ、エラーだよ。エラーの意味は? 白石さんの解説記事 を読んで理解した。E.Exception じゃなくて E.SomeException が正解? 関係する所を 修正したら、先に進んだよ。
C:/ghc/ghc-6.10.3/bin/ghc.exe -package-name HGL-3.2.0.0 -hide-all-packages -no-user-package-conf -i -idist/build -i. -idist/build/autogen -Idist/build/autogen -Idist/build -optP-DX_DISPLAY_MISSING -optP-include -optPdist/build/autogen/cabal_macros.h -odir dist/build -hidir dist/build -stubdir dist/build -package array-0.2.0.0 -package Win32-2.2.0.0 -package base-4.1.0.0 -O -XCPP -idist/build -c Graphics/HGL/Win32/WND.hs -o dist/build/Graphics/HGL/Win32/WND.o -ohi dist/build/Graphics/HGL/Win32/WND.hi Graphics\HGL\Win32\WND.hs:15:49: Module `Graphics.HGL.Internals.Utilities' does not export `Exception' gmake: *** [dist/build/Graphics/HGL/Win32/WND.o] Error 1
このエラーも、先のエラーに関連してたので、同様に修正。やっとコンパイルが通ったので インストールしようとしたら、そんなターゲットは、ありませんでエラー。 インストールは、runghcに戻って行った。
c:\sakae\HGL-3.2.0.0>gmake install gmake: *** No rule to make target `install'. Stop. c:\sakae\HGL-3.2.0.0>runghc Setup.hs install Installing library in C:\Program Files\Haskell\HGL-3.2.0.0\ghc-6.10.3 Registering HGL-3.2.0.0... Reading package info from "dist\\installed-pkg-config" ... done. Writing new package config file... done. c:\sakae\HGL-3.2.0.0>
ふう、やっとインストール出来たよ。コンパイルが通れば、Bugは無いそうなので、早速 サンプルを動かしてみよー。
試運転
c:\sakae\HS>ghc -package HGL ball.hs ..... C:\Program Files\Haskell\HGL-3.2.0.0\ghc-6.10.3/libHSHGL-3.2.0.0.a(Font.o):fake:(.data+0x10): undefined reference to `Win32zm2zi2zi0zi0_GraphicsziWin32ziGDIziHDC_zdwa4_closure' C:\Program Files\Haskell\HGL-3.2.0.0\ghc-6.10.3/libHSHGL-3.2.0.0.a(Font.o):fake:(.data+0x28): undefined reference to `Win32zm2zi2zi0zi0_GraphicsziWin32ziGDIziFont_createFont_closure' collect2: ld returned 1 exit status
見事にエラーが出てますよ。こうなったら、もうお手上げですね。悔し紛れに、ghci上から 起動してみると、それなりのWindowは出てきますが、そのWindowからの応答はありませんと ゲイツ閣下に怒られてしまいました。