Home > 3月 25th, 2013

2013.03.25

HaskellのSystem.IO.EncodingをWindowsにインストールしようとしてハマった

色々遠回りしてるので、先に結論書いときます。

$ cabal install encoding -f-systemEncoding

これで行けます。

環境はこんな感じ

  • mingw32
  • ghc 7.4.2
  • cabal 1.14
  • encoding 0.6.7.2

以下試行錯誤の経過。

普通にcabalでインストールしようとしてみると怒られた。

$ cabal install encoding

<中略>
Configuring encoding-0.6.7.2…
setup.exe: Missing dependency on a foreign library:
* Missing (or bad) header file: system_encoding.h
This problem can usually be solved by installing the system package that
provides this library (you may need the “-dev” version). If the library is
already installed but in a non-standard location then you can use the flags
–extra-include-dirs= and –extra-lib-dirs= to specify where it is.
If the header file does exist, it may contain errors that are caught by the C
compiler at the preprocessing stage. In this case you can re-run configure
with the verbosity flag -v3 to see the error messages.
cabal.exe: Error: some packages failed to install:
encoding-0.6.7.2 failed during the configure step. The exception was:
ExitFailure 1

よくわからないので “-v3” を付けて再実行。

$ cabal install encoding -v3

<中略>
ExitFailure 1 with error message:
In file included from C:\DOCUME~1\hoge\LOCALS~1\Temp\1\23868.c:1:0:
./system_encoding.h:4:22: fatal error: langinfo.h: No such file or directory
compilation terminated.
setup.exe: Missing dependency on a foreign library:
* Missing (or bad) header file: system_encoding.h
This problem can usually be solved by installing the system package that
provides this library (you may need the “-dev” version). If the library is
already installed but in a non-standard location then you can use the flags
–extra-include-dirs= and –extra-lib-dirs= to specify where it is.
If the header file does exist, it may contain errors that are caught by the C
compiler at the preprocessing stage. In this case you can re-run configure
with the verbosity flag -v3 to see the error messages.
World file is already up to date.
cabal.exe: Error: some packages failed to install:
encoding-0.6.7.2 failed during the configure step. The exception was:
ExitFailure 1

langinfo.h が見つからないらしい。

GnuWinのLibGW32Cに入ってたのでこいつをインストール。
http://gnuwin32.sourceforge.net/packages/libgw32c.htm
※インストーラ付きはこっち -> http://gnuwin32.sourceforge.net/downlinks/libgw32c.php

headerファイルの場所を指定して再度インストール。

$ cabal install encoding –extra-include-dirs=”C:\Program Files\GnuWin32\include\glibc”

<中略>
Data\Encoding.hs:0:4: lexical error (UTF-8 decoding error)
cabal.exe: Error: some packages failed to install:
encoding-0.6.7.2 failed during the building phase. The exception was:
ExitFailure 1

文字コードがなんか駄目らしい。

応急処置。

$ export LANG=C

もいっかい実行。

$ cabal install encoding –extra-include-dirs=”C:\Program Files\GnuWin32\include\glibc”

<中略>
Registering encoding-0.6.7.2…
Installing library in C:\Documents and Settings\hoge\Application
Data\cabal\encoding-0.6.7.2\ghc-7.4.2
Registering encoding-0.6.7.2…

やっと通った。

しかしSystem.IO.Encodingを使うプログラムコンパイル時にリンクエラー。

$ ghc test.hs
[1 of 1] Compiling Main ( test.hs, test.o )
Linking test.exe …
C:\Documents and Settings\hoge\Application Data\cabal\encoding-0.6.7.2\ghc-7.
4.2/libHSencoding-0.6.7.2.a(system_encoding.o):system_encoding.c:(.text+0x22): u
ndefined reference to `nl_langinfo’
collect2: ld returned 1 exit status

あらためて色々確認。
http://hackage.haskell.org/packages/archive/encoding/0.6.7.2/doc/html/System-IO-Encoding.html
System.IO.Encodingのドキュメントを見ると…

Returns the encoding used on the current system. Currently only supported on Linux-alikes.

Linuxだけしかサポートしてないよ!

CHANGELOGファイルを見ると…
http://code.haskell.org/encoding/CHANGELOG

add -systemEncoding flag for Windows builds

Windows用にsystemEncodingを無効にするフラグが付いている!

ちゃんとドキュメント見てない僕が悪かったんや…

ということでWindowsでSystem.IO.Encodingを使いたい時は

$ cabal install encoding -f-systemEncoding

でした。

遠回りしすぎた…