Windows で Haskell iconv をビルドする

GHC 8.0 以前についてはこちらを参考に。

teratail.com

GHC 8.2 以降で stack を使う場合をここではとりあげる。

確信はないのだが、GHC 8.2 から GHC 自体が iconv に依存しなくなったのか、$(stack path --programs)\ghc-8.0.2\mingw\lib から libiconv.alibiconv.dll.a がなくなっているため GHC 8.0 以前のようにビルドができなくなっている。

なので、まず libiconv を取得する。

stack exec -- pacman -S libiconv-devel

インストールされる場所は stack がデフォルトでは見に行ってくれないので明示してやる。MSYS バージョンは将来的に変わることもあるだろう。

stack build --extra-include-dirs="$(stack path --programs)\msys2-20180531\usr\include" --extra-lib-dirs="$(stack path --programs)\msys2-20180531\usr\lib"

これでコンパイルはできるがリンクに失敗する。

`libiconv_open' に対する定義されていない参照です

iconv パッケージの cabal ファイルを編集してやる。

--- a/iconv.cabal
+++ b/iconv.cabal
@@ -26,7 +26,7 @@ library
   includes:        hsiconv.h
   include-dirs:    cbits
   c-sources:       cbits/hsiconv.c
-  if os(darwin) || os(freebsd)
+  if os(darwin) || os(freebsd) || os(windows)
     -- on many systems the iconv api is part of the standard C library
     -- but on some others we have to link to an external libiconv:
     extra-libraries: iconv

iconv を利用するプロジェクトの stack.yaml で、編集後のリポジトリーを extra-deps に指定して stack build するとビルドできる。