いかにしてわたしは ghc を Gentoo/FreeBSD にいれたのか

Gentoo/FreeBSD には ghc がありません。 ebuild はありますが、 Gentoo/FreeBSD-6.* のものなので今の Gentoo/FreeBSD じゃあ動くものではありません。

ところで、最近 Haskell Platform が 6.12 対応しました。 6.11 からは移植がしっかりとサポートされるようになりました。さぁ時は来ましたね。Gentoo/FreeBSD に移植しましょう。

http://hackage.haskell.org/trac/ghc/wiki/Building/Porting

まずは、 Gentoo/FreeBSD 下に FreeBSD 環境を作ります。 /usr/local/fbsd に作りましょう。

ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/8.0-RELEASE/base/FreeBSD-8.0 の base system があります。とりあえず全部ダウンロードしてきます。

# mkdir /usr/local/fbsd
# wget -r ftp://ftp.FreeBSD.org/pub/FreeBSD/releases/i386/8.0-RELEASE/base/

ねんのために CHECKSUM を

# sha256 base.* install.sh > MY.SHA256
# cmp MY.SHA256 CHECKSUM.SHA256

確認できれば /usr/local/fbsd に展開していきましょう。

# DESTDIR=/usr/local/fbsd ./install.sh

chroot して環境をととのえます。

# chroot /usr/local/fbsd /bin/sh
# pkg_add -r zsh
# portsnap fetch extract
# pkg_add -r automake19 gmake help2man m4 ghc iconv
# cd /usr/ports/devel/autoconf262; make && make install

あとは基本的に http://hackage.haskell.org/trac/ghc/wiki/Building/Porting に従ってやっていきます。 HOST が chroot した FreeBSD 環境 TARGET が Gentoo/FreeBSD 環境になります。 plat は i386-unknown-freebsd です。また HOST での ./configure には --with-iconv-include=/usr/local/include --with-iconv-lib=/usr/local/lib が必要ですし、 mk/build.mk には "-lrt" なんかの後に "-liconv" を指定する必要があります。

そうするとめでたく inplace/bin/ghc-stage2 が手に入ります。これをもとに gmake install していきます。

まず gmake install には inplace/bin/ghc-cabal が必要です。 mk/build.mk をいじって以下のようにします。

GHC = /usr/local/src/ghc-6.12.1/inplace/bin/ghc-stage2
GHC_PKG_INPLACE = inplace/bin/ghc-pkg
GHC_CABAL_INPLACE = /usr/local/src/ghc-6.12.1/inplace/bin/ghc-cabal
DUMMY_GHC_INPLACE = inplace/bin/ghc-stage2

また mk/config.mk をいじって

GHC_PKG		        = /usr/local/src/ghc-6.12.1/inplace/bin/ghc-pkg

としておきます。

さらに、 ghc-pkg が動きだすまでに hsc2hs やら runghc の存在確認が行なわれるので、

touch utils/hsc2hs/dist-install/build/Main.o
touch utils/hsc2hs/dist-install/build/tmp/hsc2hs
touch utils/runghc/dist/build/Main.o
touch utils/runghc/dist/build/tmp/runghc

こんなことをして gmake をだまします。

libraries/* の下に *.o ができてないので for x in libraries/*;do cd $x; gmake; cd ../..; done して作ります。

そして、いよいよ gmake install すれば…多分 ghc が入ったり ghc-cabal が libraries やらをインストールして登録したりします。

正直、 Porting から gmake install まではあまり記録をとっていないので不完全かもです…

とりあえずできた ghc をもとに ghc=6.12.1 を emerge でいれます。

# CHOST=i386-unknown-freebsd emerge =ghc-6.12.1

おそらく /usr/local/lib/ghc-* のために haskell-updater の emerge がこけます。 /usr/local/bin/ の ghc 関連と /usr/local/lib/ghc-* をどけて haskell-updater を emerge すれば完成です。 cabal-install とかは emerge の依存あたりが面倒なので cabal でいれてもいいかもです。