GHC の追っかけ
昨日は、GHC を Update して、6.10.2 にしてみたけど、やっぱり先端にしてみたいよ ねと、言う事で、おじさんは、追っかけます。 おばさんは、韓国の某を追っかけるのと、同じ原理だったり、するのかな?
無理矢理、通しちゃえ
と、言う事は、何らかのトラブルに見回れたと言う事なんですが、それはさておき 今朝から、HEADが動いていますよ。 以下、その証拠。
[sakae@fb ~/mine/bin]$ ls -l total 8364 lrwxr-xr-x 1 sakae kuma 17 5 6 07:08 ghc@ -> ghc-6.11.20090504 -rwxr-xr-x 1 sakae kuma 209 5 6 07:08 ghc-6.11.20090504* lrwxr-xr-x 1 sakae kuma 21 5 6 07:08 ghc-pkg@ -> ghc-pkg-6.11.20090504 -rwxr-xr-x 1 sakae kuma 243 5 6 07:08 ghc-pkg-6.11.20090504* lrwxr-xr-x 1 sakae kuma 18 5 6 07:08 ghci@ -> ghci-6.11.20090504 -rwxr-xr-x 1 sakae kuma 69 5 6 07:08 ghci-6.11.20090504* -rwxr-xr-x 1 sakae kuma 211 5 6 07:08 haddock* -rwxr-xr-x 1 sakae kuma 2993591 5 6 07:11 hasktags* -rwxr-xr-x 1 sakae kuma 342000 5 6 07:11 hp2ps* -rwxr-xr-x 1 sakae kuma 5147875 5 6 07:11 hpc* -rwxr-xr-x 1 sakae kuma 505 5 6 07:08 hsc2hs* -rwxr-xr-x 1 sakae kuma 203 5 6 07:08 runghc* lrwxr-xr-x 1 sakae kuma 6 5 6 07:08 runhaskell@ -> runghc [sakae@fb ~/mine/bin]$ ./ghci GHCi, version 6.11.20090504: http://www.haskell.org/ghc/ :? for help Loading package ghc-prim ... linking ... done. Loading package integer ... linking ... done. Loading package base ... linking ... done. Loading package ffi-1.0 ... linking ... done. Prelude> :q Leaving GHCi. [sakae@fb ~/mine/bin]$ cat ghci-6.11.20090504 #!/bin/sh exec /home/sakae/mine/bin/ghc-6.11.20090504 --interactive [sakae@fb ~/mine/bin]$ cat ghc-6.11.20090504 #!/bin/sh executablename=/home/sakae/mine/lib/ghc-6.11.20090504/ghc-stage2 datadir=/home/sakae/mine/lib/ghc-6.11.20090504 bindir=/home/sakae/mine/bin exec $executablename -B$datadir -dynload wrapped ${1+"$@"} [sakae@fb ~/mine/bin]$ ./ghc-pkg list /home/sakae/mine/lib/ghc-6.11.20090504/package.conf: Cabal-1.7.0, array-0.2.0.1, base-3.0.3.0, base-4.0.0.0, bytestring-0.9.1.4, containers-0.2.0.1, directory-1.0.0.2, extensible-exceptions-0.1.1.0, ffi-1.0, filepath-1.1.0.1, (ghc-6.11.20090504), ghc-prim-0.1.0.0, haskeline-0.6.1.5, haskell98-1.0.1.0, hpc-0.5.0.2, integer-0.1.0.0, mtl-1.1.0.2, old-locale-1.0.0.1, old-time-1.0.0.1, packedstring-0.1.0.1, pretty-1.0.1.0, process-1.0.1.1, random-1.0.0.1, rts-1.0, syb-0.1.0.0, template-haskell-2.3.0.0, terminfo-0.3.1, unix-2.3.1.0, utf8-string-0.3.4
今年の秋に安定版 6.12 へ向けての、開発版と言う位置付けでしょうか。utf8-stringが デフォで入ってくる予定とは、世の趨勢なんですね。 こうなると、rubyの異端さが、ますます光ってきます。 頑張れ、rubyチーム。
後は、見なれないものが、ありますねぇ。はい、haskeline なんてのが、それです。 そう、この人のおかげ、寄り道をさせて頂きましたよ。
我、かく戦いし
はい、haskeline を、コンパイルしようとした時に、エラーストップしちゃうんです。 最初は、これって便利機能でしょ(ghciで、readline が使えても便利は便利なんだけど、既にemacs上から使っている私は、無くてもいいかなと)、取り敢えず無視無視。
ghc.mk で、PACKAGES += haskeline を、edit & continue したんですが、stage2の所で、再びエラー発生。ええい、めんどい事だなあと、強引に gmake -k で、続行。さて、インストールしようと思って、gmake -k install に、持ち込んだんですが、門前払いですよ。> そりゃそうでしょ。
ETC割引で、甘い汁を吸っていても、将来、10倍返しを迫られるのと一緒です。この国で育つと、問題の先延ばしがしっかりと身につきましたよ。
重い腰を、よっこらしょと上げます。
[sakae@fb /home/src/ghc]$ cd libraries/haskeline/ [sakae@fb /home/src/ghc/libraries/haskeline]$ ls GNUmakefile a.out* ghc.mk LICENSE cbits/ haskeline.buildinfo Setup.hs configure haskeline.cabal System/ dist-install/ includes/ _darcs/ examples/
これを見ると、どうやら、cabalで installすろのと同じ構成っぽい。と言う事は、Setup.hsをホジホジすればいいんだな。
maybeSetLibiconv flags bi lbi = do : putStr "checking whether to use -liconv... " hFlush stdout worksWithout <- tryCompile iconv_prog bi lbi verb if worksWithout then do putStrLn "not needed." writeBuildInfo "" return bi else do worksWith <- tryCompile iconv_prog biWithIconv lbi verb if worksWith then do putStrLn "using -liconv." writeBuildInfo "iconv" return biWithIconv else error "Unable to link against the iconv library." :
はい、"Unable to link against the iconv library." は、お目にかかったエラーでしたよ。iconvが要るから、そやつが入っているかチェックしてるんだな、ぐらいな事は、読見とれますよ。そんじゃ、どうやって、iconvの存在をチェックしてるんさ?
iconv_prog = unlines $ [ "#include <iconv.h>" , "int main(void) {" , " iconv_t t = iconv_open(\"UTF-8\", \"UTF-8\");" , " return 0;" , "}" ]
なるほど、haskellでは、C言語のソースを、[String] で、表現するのね。いやぁ、勉強になるなあ。どなたかが、ある言語を勉強する時、その言語のライブラリィーのソースを読めと、言ってましたが、至極うなずけますだ。
FeeeBSDでは、iconvをユーザーランド扱いにしてるんで、portsから入れて /usr/localの下に鎮座してるんざんす。だから見つからないと言われるのね。
このソースの近辺を読んでみると、
args = concat [ ccOptions bi , cppOptions bi , ldOptions bi -- --extra-include-dirs and --extra-lib-dirs are included -- in the below fields. -- Also sometimes a dependency like rts points to a nonstandard -- include/lib directory where iconv can be found. , map ("-I" ++) (includeDirs bi ++ concatMap Installed.include Dirs deps) , map ("-L" ++) (extraLibDirs bi ++ concatMap Installed.librar yDirs deps) , map ("-l" ++) (extraLibs bi) ]
なんて、書かれている。作者さんは、一応抜け穴を用意してくれているけど、コンパイルチェーンの中で、どう指定したらいいものやら?
取り敢えずの逃げとして、iconv関係を、/usr側からリンクしちゃうと言う、暴挙(と言う、先送りがここでも出現)に出たのでした。これも、事故責任ですから、自己管理って事で、許してくだせぇー、FreeBSDの偉い人!
TODO
所詮、追っかけは、一夜の夢よ。動いた事を確認したら、先ほど張ったリンクを忘れないうちに削除しちゃいましょう。(おお、あんたは偉い。自己抑制が効いてるね)
で、上記の解決方法を探っていきます。cabalからhaskeline を、単独でインストールしてみる事にします。
[sakae@fb ~]$ cabal install haskeline Resolving dependencies... [1 of 1] Compiling Main ( /tmp/haskeline-0.6.1.320097/haskeline-0.6.1.3/Setup.hs, /tmp/haskeline-0.6.1.320097/haskeline-0.6.1.3/dist/setup/Main.o ) Linking /tmp/haskeline-0.6.1.320097/haskeline-0.6.1.3/dist/setup/setup ... Configuring haskeline-0.6.1.3... checking whether to use -liconv... setup: Unable to link against the iconv library. cabal: Error: some packages failed to install: haskeline-0.6.1.3 failed during the configure step. The exception was: exit: ExitFailure 1
はい、iconvの所で、予定通りエラーが出現してますね。
[sakae@fb ~]$ cabal install haskeline --extra-include-dirs=/usr/local/include --extra-lib-dirs=/usr/local/lib Resolving dependencies... [1 of 1] Compiling Main ( /tmp/haskeline-0.6.1.320132/haskeline-0.6.1.3/Setup.hs, /tmp/haskeline-0.6.1.320132/haskeline-0.6.1.3/dist/setup/Main.o ) Linking /tmp/haskeline-0.6.1.320132/haskeline-0.6.1.3/dist/setup/setup ... Configuring haskeline-0.6.1.3... checking whether to use -liconv... using -liconv. Preprocessing library haskeline-0.6.1.3... Building haskeline-0.6.1.3... [ 1 of 24] Compiling System.Console.Haskeline.Backend.IConv ( dist/build/System/Console/Haskeline/Backend/IConv.hs, dist/build/System/Console/Haskeline/Backend/IConv.o ) : Installing library in /home/sakae/.cabal/lib/haskeline-0.6.1.3/ghc-6.8.3 Registering haskeline-0.6.1.3... Reading package info from "dist/installed-pkg-config" ... done. Saving old package config file... done. Writing new package config file... done.
単独では旨くいきました。後はどうやってコンパイルチェーンに組み込むかですね。教えて、偉い人。
一応、自己努力(って、程でもないですが) configure --prefix=.. --extra-include-dirs=... とかも、やってみたんですが、configure 自体のエラーになっています。 libraries/haskeline の何処かに、書いておけって事かな。
まだまだ、旅は続きます。