エレクトロニクス・フィーバー

プログラミングと電子工作で共有しようと思ったことを載せていきます

Haskell Platform for Windows のインストール

意外と難しかったのでメモ。
Cabal-Install - HaskellWiki を参考にした。

まずは、 Haskell Platform for Windows から "Haskell Platform 2013.2.0.0 for Windows" (2014-07-21 現在の最新)をダウンロードして実行してインストールします(ここまでは簡単)。

cabal をアップデート

先に結論を言います。
再起動した後、管理者権限のコマンドプロンプトで "cabal install cabal-install --global" する。

コマンドプロンプトで、cabal update すると、こう言われます。

>cabal update
Config file path source is default config file.
Config file C:\Users\Yuki\AppData\Roaming\cabal\config not found.
Writing default configuration to C:\Users\Yuki\AppData\Roaming\cabal\config
Downloading the latest package list from hackage.haskell.org
Note: there is a new version of cabal-install available.
To upgrade, run: cabal install cabal-install

言われた通りに cabal install cabal-install します。

>cabal install cabal-install
Resolving dependencies...
Downloading Cabal-1.20.0.1...

C:\Users\Yuki\AppData\Local\Temp\Cabal-1.20.0.1-5532\Cabal-1.20.0.1\Distribution
\Compat\Environment.hs:0:4:
    lexical error (UTF-8 decoding error)
Failed to install Cabal-1.20.0.1
cabal: Error: some packages failed to install:
Cabal-1.20.0.1 failed during the configure step. The exception was:
ExitFailure 1
cabal-install-1.20.0.3 depends on Cabal-1.20.0.1 which failed to install.

は?? 言われた通りにやっただけなんですけど…
再起動してもう一回やると一応動きました。まあ、ここはご愛嬌です。
しかし、すぐに別のエラーが。

[76 of 76] Compiling Main             ( C:\Users\Yuki\AppData\Local\Temp\Cabal-1
.20.0.1-4308\Cabal-1.20.0.1\Setup.hs, C:\Users\Yuki\AppData\Local\Temp\Cabal-1.2
0.0.1-4308\Cabal-1.20.0.1\dist\setup\Main.o )
Linking C:\Users\Yuki\AppData\Local\Temp\Cabal-1.20.0.1-4308\Cabal-1.20.0.1\dist
\setup\setup.exe ...

setup.exe - アプリケーション エラー
アプリケーションを正しく起動できませんでした (0xc0000142)。[OK] をクリックしてアプリケーションを閉じてください。
OK

コマンドプロンプト自体がフリーズしてしまいました。
様子を見てみると、どうもウィルススキャンソフトの avast が悪さをしているようです(自分の意志でビルドしたプログラムをスキャンするのはやめて欲しいですね…)。
一旦スキャンを無効にし、もう一度実行します。

(略)
[78 of 78] Compiling Distribution.Simple ( Distribution\Simple.hs, dist\build\Di
stribution\Simple.o )
In-place registering Cabal-1.20.0.1...
Installing library in
C:\Users\Yuki\AppData\Roaming\cabal\i386-windows-ghc-7.6.3\Cabal-1.20.0.1
Registering Cabal-1.20.0.1...
Installed Cabal-1.20.0.1
(略)
[76 of 76] Compiling Main             ( Main.hs, dist\build\cabal\cabal-tmp\Main
.o )
Linking dist\build\cabal\cabal.exe ...
Installing executable(s) in C:\Users\Yuki\AppData\Roaming\cabal\bin
Installed cabal-install-1.20.0.3

今度はちゃんとインストール出来たようです。確認します。

>cabal --version
cabal-install version 1.16.0.2
using version 1.16.0 of the Cabal library

1.20 じゃない…。どうなってるの…。
ログをよく見ると、新しい cabal のインストール先が C:\Users\ユーザー名\AppData\Roaming\cabal\bin なのに対して、環境変数パスが C:\Program Files (x86)\Haskell Platform\2013.2.0.0\lib\extralibs\bin を優先しているため、更新されていないほうが実行されてしまうようです。
対策としては、

  1. C:\Program Files (x86)\Haskell Platform\2013.2.0.0\lib\extralibs\bin\cabal.exe を上書きする
  2. C:\Users\ユーザー名\AppData\Roaming\cabal\bin の方を優先パスにする
  3. C:\Program Files (x86)\Haskell Platform\2013.2.0.0\lib\extralibs\bin\cabal.exe が更新されるようにインストールする方法を探す

などあります。(1) は 01. 環境構築 - とりあえず雑記帳 で推奨(?)されていました。
しかし、根本解決にはならないため、(3) の方法を探します。

ユーザーフォルダの実行ファイルが更新されてしまうのは、おそらくグローバルの実行ファイルを上書きする権限が無いせいだと思われます。普通にコマンドプロンプトを起動した場合、ユーザー権限しか無いため、C:\Program Files (x86) を書き換えできません。
というわけで、コマンドプロンプトを右クリックして「管理者で実行」の状態で同じようにやってみます。

C:\Windows\system32>cabal update
Downloading the latest package list from hackage.haskell.org
Note: there is a new version of cabal-install available.
To upgrade, run: cabal install cabal-install

C:\Windows\system32>cabal install cabal-install
Resolving dependencies...
Configuring cabal-install-1.20.0.3...
Building cabal-install-1.20.0.3...
Preprocessing executable 'cabal' for cabal-install-1.20.0.3...
[ 1 of 76] Compiling Distribution.Client.Dependency.Modular.Version ( Distributi
on\Client\Dependency\Modular\Version.hs, dist\build\cabal\cabal-tmp\Distribution
\Client\Dependency\Modular\Version.o )
(略)
[76 of 76] Compiling Main             ( Main.hs, dist\build\cabal\cabal-tmp\Main
.o )
Linking dist\build\cabal\cabal.exe ...
Installing executable(s) in C:\Users\Yuki\AppData\Roaming\cabal\bin
Installed cabal-install-1.20.0.3

失敗でした。明示的にグローバルに指定しないといけないようです。
cabal --help を見ても何も手がかりがないので、ググってみると、"--global" オプションを付けると共通の場所にインストールできるらしいという情報を得たのでやってみます。

C:\Windows\system32>cabal install cabal-install --global
Resolving dependencies...
[ 1 of 76] Compiling Distribution.GetOpt ( C:\Users\Yuki\AppData\Local\Temp\Caba
l-1.20.0.1-3360\Cabal-1.20.0.1\Distribution\GetOpt.hs, C:\Users\Yuki\AppData\Loc
al\Temp\Cabal-1.20.0.1-3360\Cabal-1.20.0.1\dist\setup\Distribution\GetOpt.o )
(略)
[76 of 76] Compiling Main             ( C:\Users\Yuki\AppData\Local\Temp\Cabal-1
.20.0.1-3360\Cabal-1.20.0.1\Setup.hs, C:\Users\Yuki\AppData\Local\Temp\Cabal-1.2
0.0.1-3360\Cabal-1.20.0.1\dist\setup\Main.o )
Linking C:\Users\Yuki\AppData\Local\Temp\Cabal-1.20.0.1-3360\Cabal-1.20.0.1\dist
\setup\setup.exe ...
Configuring Cabal-1.20.0.1...
Building Cabal-1.20.0.1...
Preprocessing library Cabal-1.20.0.1...
[ 1 of 78] Compiling Paths_Cabal      ( dist\build\autogen\Paths_Cabal.hs, dist\
build\Paths_Cabal.o )
(略)
[78 of 78] Compiling Distribution.Simple ( Distribution\Simple.hs, dist\build\Di
stribution\Simple.o )
In-place registering Cabal-1.20.0.1...
Installing library in C:\Program Files
(x86)\Haskell\i386-windows-ghc-7.6.3\Cabal-1.20.0.1
Registering Cabal-1.20.0.1...
Installed Cabal-1.20.0.1
Configuring cabal-install-1.20.0.3...
Building cabal-install-1.20.0.3...
Preprocessing executable 'cabal' for cabal-install-1.20.0.3...
[ 1 of 76] Compiling Distribution.Client.Dependency.Modular.Version ( Distributi
on\Client\Dependency\Modular\Version.hs, dist\build\cabal\cabal-tmp\Distribution
\Client\Dependency\Modular\Version.o )
(略)
[44 of 76] Compiling Distribution.Client.Dependency.Modular.Preference ( Distrib
ution\Client\Dependency\Modular\Preference.hs, dist\build\cabal\cabal-tmp\Distri
bution\Client\Dependency\Modular\Preference.o )
(ここで固まった)

途中で止まってしまいました。もう一度です。

C:\Windows\system32>cabal install cabal-install --global
Resolving dependencies...
Configuring cabal-install-1.20.0.3...
Building cabal-install-1.20.0.3...
Preprocessing executable 'cabal' for cabal-install-1.20.0.3...
[ 1 of 76] Compiling Distribution.Client.Dependency.Modular.Version ( Distributi
on\Client\Dependency\Modular\Version.hs, dist\build\cabal\cabal-tmp\Distribution
\Client\Dependency\Modular\Version.o )
(略)
[76 of 76] Compiling Main             ( Main.hs, dist\build\cabal\cabal-tmp\Main
.o )
Linking dist\build\cabal\cabal.exe ...
Installing executable(s) in C:\Program Files (x86)\Haskell\bin
Installed cabal-install-1.20.0.3

C:\Windows\system32>cabal --version
cabal-install version 1.20.0.3
using version 1.20.0.1 of the Cabal library

やっと出来ました…。ここまでで1時間です。
しかし、C:\Program Files (x86)\Haskell Platform\2013.2.0.0\lib\extralibs\bin ではなく、C:\Program Files (x86)\Haskell\bin にインストールされたようです。予想と違いましたが、そっちもパスに入っているので問題無いです。
ちなみに、--global でインストールされるディレクトリは C:\Users\(ユーザー名)\AppData\Roaming\cabal\config の install-dirs global で指定されているようです。