LoginSignup
3
3

More than 5 years have passed since last update.

MSYS2環境でpcre-lightをビルドする

Posted at

このエントリは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」って影響でかいわ。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3