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
なんて事をして、出来具合を確認してます。