このエントリはHaskell Advent Calendar 2015 の $N$ 日目の記事ではありません。
24 days of Hackage, 2015: day 2 をSurface Pro 3上で試したいと思って一日潰してしまったので、うまくいった状況だけメモっておく。元エントリは pcre-heavy
の Template Haskell と stack runghc
で LL ライクにカジュアルに正規表現使ったスクリプト書けるよっていう興味深い話なんだけど、今書いてるこのエントリはWindows環境でのダークサイドであって面白味はない。きちんと「> I would feel sad if I picked a library that is problematic for Windows users.」って言及されてるし。
さて、手元の Surface Pro 3 は MSYS2 をインストールして、以下のように pcre
を導入済の状態。
$ pacman -Sy
$ pacman -S mingw64/mingw-w64-x86_64-pcre
元エントリのように stack runghc
経由で実行すると、以下のエラーとなった。
$ ./PCREHeavyExampleMain.hs
Run from outside a project, using implicit global project config
Setting codepage to UTF-8 (65001) to ensure correct output from GHC
GHC runtime linker: fatal error: I found a duplicate definition for symbol
.refptr._pcre_OP_lengths
whilst processing object file
C:/msys64/mingw64/lib\libpcre.a
This could be caused by:
* Loading two different object files which export the same symbol
* Specifying the same object file twice on the GHCi command line
* An incorrect `package.conf' entry, causing some object to be
loaded twice.
ghc: panic! (the 'impossible' happened)
(GHC version 7.10.2 for x86_64-unknown-mingw32):
loadArchive "C:/msys64/mingw64/lib\\libpcre.a": failed
Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug
で割といろいろと何やってもだめだったのだけど、 stackoverflowの回答 で 7.10.3 なら簡単だぜーみたいなこと書いてあったんで、そっちで試したら少なくとも pcre-light
のインストールについてはうまくいった。
今日現在のresolverはghc-7.10.3に対応してないので、 FPCompleteで書かれているように stack setup 7.10.3
した上で stack.yamlにて compiler-check: newer-minor
を指定。元エントリの runghc
でカジュアルにスクリプト書けるぜ~って話は完全無視して stack new
してプロジェクト作って普通に依存に pcre-heavy
入れた。
でもって、 pcre-light
のインストールも含めてビルドするために stack --skip-msys build
したわけなんだけど、こいつがなぜか落ちる。落ちるんだけど、3~4回くらい叩くとこれまたなぜかビルドが完了して、実行ファイルを実行してみるときちんと動いた。(落ちた時のエラーメモっておけばよかったんだけど、気力が尽きててメモってない・・・)
ちなむと --skip-msys
がないと stack は MSYS2 をローカルにダウンロードしてきて、そこで pcre ライブラリのビルドとかをするような構成を作る。この場合、 stack exec -- pacman -S mingw64/mingw-w64-x86_64-pcre
みたいな叩き方ができて、これでもうまく動かせそうな気がするのだけど、こっちは検証してない(というか、少なくともghc-7.10.2でごちゃごちゃ動かしたときはうまくいってなくて、 ghc-7.10.3 ではまともには検証してない)。MSYS2の環境は手元に持っていてもうこれ以上要らないってときは --skip-msys
を指定した方がよさげ。
後、本編と関係ない問題として MSYS2上でctrl-c効かない問題 も踏んだ。ghciだけならともかく 「> it affects any GHC-compiled program that wants to catch console events」って影響でかいわ。