こんな状態 なので今すぐには無理って見解が出てるんだけど、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
が動いてくれるようになったよ。荒削りなのでもっといい方法は作れそう。