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からの応答はありませんと ゲイツ閣下に怒られてしまいました。