GentooでHaskellする

GentooHaskellしましょう。この記事では以下の3つについて説明します。

Gentoo-haskell overlay

overlayはご存知ですか? ご存知でない方は http://www.gentoo.org/proj/ja/overlays/userguide.xml を読んでくださいね。 読むのが面倒な方のために簡単にまとめると、overlayとはPortageの追加パッケージツリーです。多くの場合、まだメインに入れる前の段階のテストをするためのツリーになっています。

これを管理するソフトとして "layman" というものがあります。 まだ、入れてない方は "emerge layman"でインストールしましょう。 そして echo "source /var/lib/layman/make.conf" >> /etc/make.conf してlaymanで追加したツリーが自動的にPortageに認識されるようにしておきます。これで準備はOKです。

Gentoo-Haskell overlayはGentooHaskellチームが開発用に使用しているoverlayでGitHubGitHub - gentoo-haskell/gentoo-haskell: official gentoo haskell overlayで開発されています。

# layman -a haskell

で、このhaskellのoverlayを追加しましょう。 (ツリーの更新は layman -Sで、できます)

ここのoverlayに入っているものは開発用という性質上 ~x86 とか ~amd64になっているので、適当にunmaskしてくださいね。たとえば

# emerge --autounmask-write =xmonad-0.10

haskell-updater

Haskellコンパイラ ghcを更新したりすると、haskellのパッケージは依存が壊れてしまったりして動かなくなってしまうことがあります。そんな時は haskell-updater コマンドを使いましょう。 Portageからghcをインストールしていれば入っているはずです。

# haskell-updater -c -u

自動的に壊れているパッケージを見つけだして全てリビルドをかけてくれます。

haskell-updaterでも直らん

(多分 haskell-updater -c -u で直ると思うんだけどね…。パッケージがあれば)

だいたいの場合、こんなエラーで死んでるはずです。

setup: The following installed packages are broken because other packages they
depend on are missing. These broken packages must be rebuilt before they can
be used.
package uniplate-1.6.2 is broken due to missing package
syb-0.3.2-e278273be80bad9026dffa9d239d59b5

この場合は uniplateが壊れているので、 uniplateをリビルドしましょう……で、またuniplateが同じようにこけて……という感じで追っていってみると上のエラー以外で死んでるやつが見つかるんじゃないかと思います。そいつが犯人です。

もっと簡単な見分け方は configure phase で死んでいるか、compile phase で死んでいるか、ですね。 haskell-updaterかけてエラーログ見て compile phaseで死んでるやつを見つけてください。そいつがルパンです。

hackport

さて、目当てのパッケージがなかったらどうしましょう…。そんな時は hackport を使ってパッケージを自動生成しましょう。

hackport は $PORTDIR_OVERLAYに指定されている最初のツリーにパッケージを作るので、 /etc/make.confを

source /var/lib/layman/make.conf
PORTDIR_OVERLAY="/home/naota/portage-overlay ${PORTDIR_OVERLAY}"

こんな感じにして、書きこみできるところにしておきます。 naotaはちゃんと自分のユーザ名などに変えてくださいね。

では、Hackageのデータベースを更新し、パッケージを生成します。

% hackport update
% hackport merge mecab
accepting dep(?): base >=4 && <5
accepting dep(?): bytestring >=0.9 && <0.10
accepting dep(?): text >=0.11 && <0.12
WARNING: This package depends on a C library we don't know the portage name for: mecab. Check the generated ebuild.
Saved to /usr/portage/distfiles/mecab-0.2.0.tar.gz
Recalculating digests...
>>> Creating Manifest for /home/naota/portage-overlay/dev-haskell/mecab

これで、できました………しかし、ちょっと待ってください「WARNING: This package depends on a C library we don't know the portage name for: mecab. Check the generated ebuild.」と警告が出ていますね。生成されたebuildを見てみましょう。

% cat /home/naota/portage-overlay/dev-haskell/mecab/mecab-0.2.0.ebuild
...
RDEPEND="=dev-haskell/text-0.11*
        >=dev-lang/ghc-6.10.1
        unknown-c-lib/mecab"
DEPEND="${RDEPEND}
        >=dev-haskell/cabal-1.6"
...

"unknown-c-lib/mecab" という変な依存が書かれていますね。これはmecabのCライブラリへの依存です。これはとりあえずで書かれているので、探して適切なものに置き換えなくてはいけません。

% eix mecab
...
[I] app-text/mecab
     Available versions:  0.97-r1!t (~)0.98!t {unicode}
     Installed versions:  0.98!t(00時36分24秒 2011年11月15日)(unicode)
     Homepage:            http://mecab.sourceforge.net/
     Description:         Yet Another Part-of-Speech and Morphological Analyzer
...

おそらくこの app-text/mecab でしょうね。 書きかえて

RDEPEND="=dev-haskell/text-0.11*
        >=dev-lang/ghc-6.10.1
        app-text/mecab"

と、しました。ちゃんとManifestも更新しておきましょう。

% cd /home/naota/portage-overlay/dev-haskell/mecab
% repoman manifest
>>> Creating Manifest for /home/naota/portage-overlay/dev-haskell/mecab
||

これでemergeできるはずです。

>||
% emerge dev-haskell/mecab
...

うまくemergeできましたか?

gentoo-haskellにpull request

うまくemergeできたらせっかくなので gentoo-haskell overlayに入れてもらいましょう。

まず、初めにGithubgentoo-haskellをforkしましょう。自分のgithubgentoo-haskellリポジトリがforkされるはずです。

自分のリポジトリを手元にもってきて、gentoo-haskellをremoteに追加しておきます。

$ git clone git://github.com/naota/gentoo-haskell.git
$ git remote add upstream git://github.com/gentoo-haskell/gentoo-haskell.git
$ git remote update

こうやって gentoo-haskellを追加しておけば

$ git pull --rebase upstream master

とやって、gentoo-haskellの方の更新をとりこむことができます。

さて、ではさっきのmecabをcommitしてpull requestを出してみましょう。

$ mv ~/portage-overlay/dev-haskell/mecab dev-haskel
$ git add dev-haskell/mecab/mecab-0.2.0.ebuild dev-haskell/mecab/Manifest
$ git commit -m 'Add mecab-0.2.0 built with ghc-7.2.1'
$ git push -f origin master

これでGithubにpushされました。Githubの自分のGentoo-haskellリポジトリのページに行ってpull requestを出しましょう。こんな感じでpull requestがHaskellチームに伝わり、マージされるかと思います!
https://github.com/gentoo-haskell/gentoo-haskell/pull/61

(おまけ) eix-remote

layman便利だけど、どのoverlayにどのパッケージあるか知らなかったら意味なくない? そうですね。意味ないので eix-remoteを活用しましょう。

# eix-remote update

こうすると、全overlayのパッケージ情報をダウンロードしてきて検索できるようにしてくれます。あとはいつも通りにeixします。

# eix xmonad$
* x11-wm/xmonad
     Available versions:  0.9 0.9[1] 0.9[3] (~)0.9.2 (~)0.9.2[1] (~)0.9.2[3] (~)0.10[1] (~)0.10[3] [M](~)9999[1] **9999[2] [M](~)9999[3] {doc hoogle hscolour profile}
     Homepage:            http://xmonad.org
     Description:         A tiling window manager

[1] "gentoo-haskell" /home/naota/repo/git/gentoo-haskell
[2] "damex-overlay" layman/damex-overlay
[3] "gentoo-haskell" layman/haskell

Available versionsに[1]とか[3]とかついているものがありますね。たとえば"0.10[3]"だと下を見て、laymanのhaskell overlayに入っていることがわかります。こうやって、目的のoverlayを見つけたら layman -a で追加すればいいってわけですね。