症状
cabal install で、 dist/ ディレクトリを含むパッケージをインストール仕様とするとコケる。
(Issueがある https://github.com/haskell/cabal/issues/1698)
原因
cabal sdistコマンドを既にdistディレクトリがある状態で実行すると、それをtarballに含めてしまう。この状態で build を行うとうまく行かない場合があるので、現在のcabal installでは、
- dist/ を dist-tmp/ にリネーム
- dist/ を新しく作る
- dist-tmp を $distpref (パラメータ) にリネーム
という手順を踏んでから、buildを行っているようである。
しかし、 $distpref はデフォルトでは "dist" になっているため、結局同じ名前にリネームしているどころか、Windowsのディレクトリ操作APIではこれがPermission Deniedで失敗する。それゆえ、distディレクトリを含むパッケージのインストールが主にWindowsで上手くいかない。
(この操作にどういう意味があるのか僕にはよく分からなかったので、理解できた方教えてくださると助かります。)
対処方法
根本的な対策はソースコード中にTODOと書いてあることや、Issueがでていることから、近い将来には行われると思うが、ひとまずは、
$ cabal install happy --distpref=wdist
などと、 --distpref に "dist" 以外の(多分なんでも良い)名前を指定してやればうまくいく。