2015年1月15日木曜日

[haskell][cygwin] cygwinのシェル上でcabal install cabal-installが失敗する問題の対処方法

Windows7上でcabal install cabal-installがエラーになる問題に遭遇しました。その症状と解決方法をまとめておきます。

問題の症状

Windows7にHaskell Platform 2014.2.0.0をインストールしている環境でcabal install cabal-installを実行すると、以下のようなエラーとなりインストールに失敗してしまいます。cygwinは 1.7.33-2。
% cabal install cabal-install
Resolving dependencies...
Configuring Cabal-1.22.0.0...
Failed to install Cabal-1.22.0.0
Last 10 lines of the build log ( C:\Users\XXX\AppData\Roaming\cabal\logs\Cabal-1.22.0.0.log ):
[73 of 78] Compiling Distribution.Simple.UserHooks ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\UserHooks.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\UserHooks.o )
[74 of 78] Compiling Distribution.Simple.Bench ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\Bench.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\Bench.o )
[75 of 78] Compiling Distribution.Simple.Test.ExeV10 ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\Test\ExeV10.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\Test\ExeV10.o )
[76 of 78] Compiling Distribution.Simple.Test ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple\Test.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple\Test.o )
[77 of 78] Compiling Distribution.Simple ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Distribution\Simple.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Distribution\Simple.o )
[78 of 78] Compiling Main             ( C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\Setup.hs, C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\Main.o )Linking C:\Users\000011~1\AppData\Local\Temp\Cabal-1.22.0.0-10368\Cabal-1.22.0.0\dist\setup\setup.exe ...
Configuring Cabal-1.22.0.0...
setup.exe: fd:4: invalid argument
setup.exe: fd:4: hGetContents: invalid argument (invalid byte sequence)
cabal.exe: Error: some packages failed to install:
Cabal-1.22.0.0 failed during the configure step. The exception was:
ExitFailure 1
cabal-install-1.22.0.0 depends on Cabal-1.22.0.0 which failed to install.


調べてわかったこと

自分の環境では/bin/tcshをシェルに設定していますが、/bin/bashに変えても症状は改善せず。
cygwin上で自動的に先頭に登録されるパス(/usr/bin)と環境変数LANG=ja_JP.UTF-8が原因。

解決方法

PATHの設定で、mingwのバイナリが格納されたディレクトリ(C:\Program Files\Haskell Platform\2014.2.0.0\mingw\bin)をcygwinのディレクトリ(/usr/bin, /usr/local/bin)よりも前書いておく。
cygwinはシェル起動スクリプトで/usr/binと/usr/local/binを勝手にPATHの先頭に追加してしまします。ここの情報を参考に順番を整理してください。
この設定をした上で、以下の手順のどちらかを実行すれば問題を回避することができます。
  1. コマンドプロンプト上で実行する
  2. コマンドプロント(cmd.exe)を起動してcabal install cabal-installを実行すると、以下の通り正常にインストールすることができました。 なぜcygwin上だと失敗してしまうのか。ディレクトリセパレータの扱いがコマンドプロンプト上とcygwin上で変わっているのが原因ではないか、と疑ってはいますが正確なところは調べられていません・・・。
    C:\Windows\system32>cabal install cabal-install
    Resolving dependencies...
    Configuring Cabal-1.22.0.0...
    Building Cabal-1.22.0.0...
    Installed Cabal-1.22.0.0
    Configuring cabal-install-1.22.0.0...
    Building cabal-install-1.22.0.0...
    Installed cabal-install-1.22.0.0
    
  3. cygwin環境のLANG環境変数を削除する
  4. コマンドプロンプトではなく、cygwinのターミナル上発生する問題を回避するには、LANG環境変数を変更する必要があります。cabalに以下のaliasを設定しておけば、cabal実行時のみLANG環境変数を無効にできます。
    alias cabal env LANG= cabal
    

参考: 

0 件のコメント:

コメントを投稿