Pixel Pedals of Tomakomai

北海道苫小牧市出身の初老の日常

MSYS2でHDBC-sqlite3をコンパイル

当然のことながら、msys2のshellではなくmingw64のshellから操作する。

まず、 sqlite3 を入れる。

pacman -S mingw64/mingw-w64-x86_64-sqlite3

後はビルドするだけなんだけど、2点注意がいる。

  • --extra-include-dirs--extra-lib-dirs にmingw64関連のディレクトリを明示する
  • --skip-msys を指定する

--skip-msysここ とか ここ 読めばわかるけど、指定しなければwin環境のGHCがデフォルトで内部に持ってるmsys2のPATHを見てしまうのを、抑制して見ないようにしてくれる。

stack build --skip-msys --extra-include-dirs=/c/msys64/mingw64/include/  --extra-lib-dirs=/c/msys64/mingw64/lib/ HDBC-sqlite3

余談

--extra-* の指定が必要な理由はよくわからない。明示しなくてもmingw64のshellを使ってるのだから勝手に見て欲しいもの。

依存ライブラリのチェックはcabal側でやってて 、ここで使うgccがどれなのかがまず重要である。ここに関しては一応 stack 側で --with-gcc=/c/msys64/mingw64/bin/gcc のような指定は可能で、これを指定するとライブラリのチェックでは落ちなくなる。しかし、結局buildの部分で落ちる。

2017-01-29 10:45:52.197846: [debug] Run process: C:\stack_root\setup-exe-cache\x86_64-windows\Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.1.exe --builddir=.stack-work\dist\ca59d0ab build --ghc-options " -ddump-hi -ddump-to-file"
@(System\Process\Read.hs:340:3)

--  While building package HDBC-sqlite3-2.3.3.1 using:
      C:\stack_root\setup-exe-cache\x86_64-windows\Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.1.exe --builddir=.stack-work\dist\ca59d0ab build --ghc-options " -ddump-hi -ddump-to-file"
    Process exited with code: ExitFailure 1

...略...

    [7 of 7] Compiling Database.HDBC.Sqlite3 ( Database\HDBC\Sqlite3.hs, .stack-work\dist\ca59d0ab\build\Database\HDBC\Sqlite3.o )

    C:\tools\msys64\tmp\stack12828\HDBC-sqlite3-2.3.3.1\hdbc-sqlite3-helper.c:1:21: error:
         fatal error: sqlite3.h: No such file or directory
    compilation terminated.
    `gcc.exe' failed in phase `C Compiler'. (Exit code: 1)

ここで setup.exe 呼ぶのにも --with-gcc が必要な気がするのだけど、 stack がそれを指定していないように見える。が、面倒なのでこれ以上は追いかけてない。