こんな状態 なので今すぐには無理って見解が出てるんだけど、cabalを捨て去らずに頑張ればなんとかなるかもね。誰かのヒントになるかもしれないのでやったことをメモ。
1. stackを普通に使う
stack は普通に使いたいので、普通に使う。システムのghcが入っているか、またそれを使うかで多少ややこしくなるけど、今回はシステムに ghc が入っていてある程度使っていて、そこでさらに stack 経由で ghc-7.8.4 を入れたパターン。と言っても、この手順だとシステムのghcで使ってた環境は壊れてそうな気がする。
最低でも stack build を一度は実行して、 *.cabal ファイルの依存は解決しておく必要がある。
2. ghc-modの調達
stack install ghc-mod で ~/.local/bin へ投入。ただ、 ghc-mod はghcやCabalと密結合してるので、 ~/.local/bin だと環境ごとの切り替えができなくてだいぶ不安。システムのghcやstackで入れた複数バージョンのghcを切り替えて使う事態になると死を覚悟した方がいい。
そういう意味では .stack-work 以下に入れておくのもありかもしれないし、今回の方法とはすごく相性いい気がしてきたけど、残念ながら試してないので誰か。
3. cabalの調達
stack install cabal-install で。前述の ghc-mod と同じビルドプランにならないとCabalのバージョン違いで死を見るので注意。
これも .stack-work でやるともっといいかも。
4. cabal configureの実行
ghc-mod のために必要。sandboxは使わないしbuildもしない。
普通に ghc-mod を叩いてみると怒られる。
% stack exec -- ghc-mod root
launching operating system process `cabal configure` failed: cabal configure (exit 1)
.. snip ..
ghc-mod 側で cabal confugire の実行をしないという方針がうまくいくかは調べてないけど、今回は言われた通り素直に cabal configure を実行することにした。
stack exec -- cabal configure が通ればきれいなのだけど、世の中そう上手くできてない。以下のように怒られる。
% stack exec -- cabal configure
cabal: Use of GHC's environment variable GHC_PACKAGE_PATH is incompatible with
Cabal. Use the flag --package-db to specify a package database (it can be used
multiple times).
以下のような cabal.config を *.cabal と同じディレクトリにおいた。あるいは --package-db 引数でもいいと思う。
% cat cabal.config
package-db: (ホームディレクトリ)/.stack/snapshots/x86_64-osx/lts-2.15/7.8.4/pkgdb
package-db: (プロジェクトのルート)/.stack-work/install/x86_64-osx/lts-2.15/7.8.4/pkgdb
これで cabal config を実行すればいいのだけど、他のghc環境が見えるとうまくない(たぶん ghc-pgk が足をひっぱってる)ので、PATH指定した。対象としているghcのバイナリが最初に見えるようにするのが重要。
% PATH=~/.stack/programs/x86_64-osx/ghc-7.8.4/bin:~/.local/bin:$PATH cabal configure
Resolving dependencies...
.. snip ..
現状、*.cabal を弄る度に stack build とこの作業を手でやってるけど、ghc.el をいじった方がいいかも? そこは深く追ってない。
5. ghc.el を改変
ここが一番イケてないとこだけど、 こんな感じ で ghc-mod の実行を stack exec -- 経由にすると、うまく ghc-mod を騙して適切なパッケージDBを参照させられる。
.emacs.d 以下の対象ファイル見つけて編集してバイトコンパイルすれば十分だけど、当然その辺は自己責任で。
他、 ghc.el が cabal config を呼んでいる箇所もありそうなので、そっちも直した方が幸せになるのかも。
終わり
ここまでで ghc-mod が動いてくれるようになったよ。荒削りなのでもっといい方法は作れそう。