Windowsで Haskellの persistent-postgresqlモジュールをインストールする方法

Haskellの Persistentで PostgreSQLを使ってみようと思ったのですが、モジュールをインストールのに色々とハマったので手順をメモしておきます。

インストールする環境は以下の通り。現時点での最新のHaskell Platform を使用しています。

素の状態で、以下のコマンドを実行して「persistent-postgresql」をインストールしようとすると、

$ cabal-dev install persistent-postgresql

こんなエラーメッセージが出てインストールに失敗します。

Configuring postgresql-libpq-0.8.2.1...
setup.exe: The program pgconfig is required but it could not be found.
(中略)
persistent-postgresql-1.0.3 depends on postgresql-libpq-0.8.2.1 which failed to install.

persistent-postgresqlが依存している、postgresql-libpq をインストールする際に、PostgreSQLのファイルが必要になります。
その他いくつか必要なファイルがあるため、それぞれインストールして行きます。

PostgreSQLのインストール

PostgreSQLWindows版のインストーラが用意されているので、それを使ってインストールすればOKです。ただし、Haskell Platformは 32bit版しか用意されていないのでインストールするPostgreSQLも 32bit版にする必要があります。
PostgreSQL Download | EnterpriseDB このページの「Win x86-32」をクリックすればインストーラがDownloadできます。それをインストールしてしまいましょう(デフォルトでは『C:\Program Files (x86)\PostgreSQL\9.2』にインストールされるので、そこにインストールしたことにします)。

インストール後に、モジュールのインストール時に必要になるファイルは、Haskell Platformのbuild時にPATHが通った場所に置く必要があります。そのため、以下のコマンドを実行して必要なファイルをコピーしておきます。

$ cd /c/Program\ Files\ (x86)/PostgreSQL/9.2
$ cp bin/pg_config.exe /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin
$ cp lib/libpq.dll /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin
$ cp lib/libpq.dll lib/pq.dll

その他必要なファイルの入手

インストール時に、Haskell Platformのmingw環境でbuildが走るため、PostgreSQLの依存DLLを別途入手する必要があります。今回は GNUWin32プロジェクトから必要なDLLをDownloadすることにします*1

libintl.dll

LibIntl for Windows より、Binaries をDownloadします。解凍した binフォルダの中に libintl3.dll があるので、以下のコマンドで Haskell Platformへコピーします。

$ cp bin/libintl3.dll /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin
$ cp bin/libintl3.dll /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin/libintl.dll
ssleay32.dll

OpenSSL for Windows より、Binaries をDownloadします。解凍した binフォルダの中にあるdllを同様に、以下のコマンドで Haskell Platformへコピーします。

$ cp bin/*.dll /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin
$ cp bin/libssl32.dll /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin/ssleay32.dll

モジュールのインストール

これで必要なファイルが揃ったはずです。後は以下のコマンドでインストールが完了するはずです。

$ cabal-dev install persistent-postgresql --extra-include-dirs=/c/Program\ Files\ \(x86\)/PostgreSQL/9.2/include --extra-lib-dirs=/c/Program\ Files\ \(x86\)/PostgreSQL/9.2/lib

しかし、これではまだ安心できません。最後にexeをbuildしておきましょう。

$ cabal-dev install

以上で、完了です。お疲れ様でした。

それでもまだエラーが出る場合

実行時に、DLLが足りないというエラーがでる場合があります。その場合には上記の GNUWin32プロジェクトから、指定されたDLLを /c/Program\ Files\ (x86)/Haskell\ Platform/2012.4.0.0/mingw/bin に入れてあげる必要があります。また、DLL名が多少違っていたりする場合には、元のファイルをコピーして名前を変えると動いたりします。

*1:自分でbuildすることも可能ですが茨の道です。。。