Update GHC on FreeBSD

昨日はGWの行楽で、白石さんの会に参加してきた。RHGの酒井さんや日下部さんの姿も 見えました。会場のミラクルリナックス・セミナールームを提供くださった森本さんに 感謝。

Haskellの現状と未来の話を白石さんが熱く語ってくれたわけですが、まとめは私が 出来ると思えない(入門者ゆえ)ので、 ときどきの雑記帖さんにお任せします。

質問タイムで、DebianのGHCが古いんですけど ... と言うのがあって、それはメンテナーにお願いして下さいって、簡単にいなされてました。そりゃそうだよな。メンテナーにメール一発じゃんと思いますよ。私が書いてあげようか? なんて言う冗談はさておき、我FreeBSDでも事情は同じ。

メール書くより、野良Buildしちゃった方が為になりまっせ。今の若い人はお膳立てが無いと自前では出来ないのだろうか? 会に参加した人の中で最も高齢者で私が、ほざいてみました。さて、やってみよう。

素直に コンパイル

Haskellをコンパイルするには、Haskellが必要です。はい、関数型言語だけあって、最初から再帰してますね。

(build-new new-sources old-haskell-bin)
  (build-old old-sources old-old-haskell-bin)
    (build-old-old  old-old-sources old-old-old-haskell-bin)
        :

属に言う、「鶏が先か卵が先か」である。生物学的には鶏が先だと思うんだけど、どうだろう。ああ、話がそれた。こういう話はいたる所に転がっていて、gccは、C言語をコンパイルするアプリだけど、これ自身がC言語で書かれている。はて、どうしたものかと? Gaucheも同様で、コンパイルするにはgaucheがいると言う。shiroさんが、2009/04/24付けの日記に興味深い事を書かれていた。

さて、肝心のHaskellのUpdateであるが、簡単に出来る。まずは、ここからソースを頂いてくる。 今回は、ghc-6.10.2-src-extralibs.tar.bz2 も含めて頂いた。

両者を展開して、中のREADMEを読む。私は、こうした。

./configure --prefix=/home/sakae/mine
gmake
gmake install

FreeBSDでコンパイルする時は、gmakeはお約束事項だ。makeに膨大な時間がかかる事は経験済なので、夜寝る前にコマンドを投入し、結果は朝確認するというのんびりムードが必要だ。

[sakae@fb ~]$ du -sh /home/sakae/mine
374M    /home/sakae/mine
[sakae@fb ~]$ ls mine
bin/    lib/    share/
[sakae@fb ~]$ ls -l mine/bin
total 1476
lrwxr-xr-x  1 sakae  kuma      10  5  5 07:15 ghc@ -> ghc-6.10.2
-rwxr-xr-x  1 sakae  kuma     115  5  5 07:15 ghc-6.10.2*
lrwxr-xr-x  1 sakae  kuma      14  5  5 07:15 ghc-pkg@ -> ghc-pkg-6.10.2
-rwxr-xr-x  1 sakae  kuma     145  5  5 07:11 ghc-pkg-6.10.2*
lrwxr-xr-x  1 sakae  kuma      11  5  5 07:16 ghci@ -> ghci-6.10.2
-rwxr-xr-x  1 sakae  kuma      71  5  5 07:15 ghci-6.10.2*
-rwxr-xr-x  1 sakae  kuma     138  5  5 07:12 haddock*
-rwxr-xr-x  1 sakae  kuma  479260  5  5 07:11 hasktags*
-rwxr-xr-x  1 sakae  kuma   39549  5  5 07:11 hp2ps*
-rwxr-xr-x  1 sakae  kuma  927616  5  5 07:11 hpc*
-rwxr-xr-x  1 sakae  kuma     452  5  5 07:12 hsc2hs*
-rwxr-xr-x  1 sakae  kuma      93  5  5 07:11 runghc*
lrwxr-xr-x  1 sakae  kuma       6  5  5 07:16 runhaskell@ -> runghc

hpcって、昨日も話題になったような。。。えっと、カバレッジツールだったかな。それでは、試運転してみます。

[sakae@fb ~]$ ghci
GHCi, version 6.8.3: http://www.haskell.org/ghc/  :? for help
Loading package base ... linking ... done.
Prelude> :q
Leaving GHCi.

昔のやつより、新しい方を先に見つけるようにして

[sakae@fb ~]$ PATH=/home/sakae/mine/bin:$PATH
[sakae@fb ~]$ ghci
GHCi, version 6.10.2: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> :q
Leaving GHCi.

さて、以前、青木さんのLasyLinesをghc-6.8.3でコンパイルした時、こんなエラーが出て いた。

[12 of 14] Compiling CGI              ( CGI.hs, CGI.o )

CGI.hs:69:17:
    Warning: Pattern match(es) are non-exhaustive
             In a case alternative:
                 Patterns not matched:
                     (_, (GHC.Base.C# #x) : _) with #x `notElem` ['=']
[13 of 14] Compiling LazyLines        ( LazyLines.hs, LazyLines.o )

LazyLines.hs:130:34:
    Couldn't match expected type `old-locale-1.0.0.0:System.Locale.TimeLocale'
           against inferred type `System.Locale.TimeLocale'
    In the first argument of `formatCalendarTime', namely
        `defaultTimeLocale'
    In the expression: formatCalendarTime defaultTimeLocale fmt
    In the definition of `strftime':
        strftime fmt = formatCalendarTime defaultTimeLocale fmt
gmake: *** [build-index.cgi] エラー 1

新しいghcでは、どうかな? これも試運転のうち

[12 of 14] Compiling Database         ( Database.hs, Database.o )
[13 of 14] Compiling LazyLines        ( LazyLines.hs, LazyLines.o )

LazyLines.hs:41:33: Warning: Defined but not used: `name'

LazyLines.hs:43:49: Warning: Defined but not used: `content'
[14 of 14] Compiling Main             ( CGIMain.hs, CGIMain.o )
Linking index.cgi ...
[sakae@fb ~/Desktop/lazylines]$ 

無事に出来上がっていましたよ。よかったよかった。

By darcs

次は、GHCの先端を追いかける、おっかけおじさんを演じてみましょう。READMEには こんな風に書かれていました。

  2. Get the source from darcs
  ----------------------------

  First get the GHC darcs repository:

    $ darcs get http://darcs.haskell.org/ghc/

  Then run the darcs-all script in that repository
  to get the other repositories:

     $ cd ghc
     $ chmod +x darcs-all
     $ ./darcs-all get

  This grabs the "boot" packages by default.  To get the full set of
  packages, instead say

     $ ./darcs-all --extra get

  This also downloads the libraries that are normally bundled in the
  "extralibs" package (see above).

仰せに従って、darcs とやらを入れてやろう。これって、Haskell風味のCVSですよね。 最近は、SVNとかgitとか、再発明が多くてこまっちゃう。で、cabal install darcsしたら、外部パッケージでcrulだかもいるけど、そんなの見つからんエラー発生。 標準の場所(って、どこよ?)にない時は、場所を指定してですって。--with-lib-path=/usr/local/libとか指定してあげて、無事にはいった。

けど、darcsなんて無いよと。おんどら、人をおちょくるでないよ。cabalは、ちゃんと入れたよと、のたまうし。。 まあ、こういう時は、勘を働かせてあげよう。

[sakae@fb ~]$ .cabal/bin/darcs get http://darcs.haskell.org/ghc/
This is the GHC darcs repository (HEAD branch)

For more information, visit the GHC developer wiki at
  http://hackage.haskell.org/trac/ghc
**********************
Coping patch 1233/20205

これが、また長い事しきりですよ。いつになったら終るんだい? 先は長いですよ。 その前に、GHCのコンパイル時間を短縮出来ないものかと、白石さんのページを、探してみたら、素敵なエントリーを発見。今度は、これでやってみますね。

piki を FreeBSD上で使う

先日書いたPageは、Windows上で作りました。幸い、utf8を吐き出してくれるエディターがあったので、助かりました。でも、行末コードがUnix風になっていないと、<pre>タグで囲った部分に、余計な改行が入ってしまいました。

ならば、FreeBSDでやろう。そうだ、そうだ、です。私のFreeBSDは、昔ながらのja_JP.eucJPなんです。そんな訳で、ちょいと、Makefileに細工しました。

all:
        nkf -w seed.euc > seed.utf8
        ../piki template.html seed.utf8 > `date "+%y%m%d.html"`
        rm -f seed.utf8

ソースは、nviを使って書いてますので、時おり

nvi seed.uec
  :
  :
:w
:!make

なんて事をして、出来具合を確認してます。