GentooでHaskellする
GentooでHaskellしましょう。この記事では以下の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はGentooのHaskellチームが開発用に使用しているoverlayでGitHubのGitHub - 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に入れてもらいましょう。
まず、初めにGithubでgentoo-haskellをforkしましょう。自分のgithubにgentoo-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
$ 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 で追加すればいいってわけですね。