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 の何処かに、書いておけって事かな。

まだまだ、旅は続きます。