Haskell インストールメモ

はじめに
========

このメモは，私が Haskell を Mac OS X にインストールしたときの作業メモです．全ての工程は haskell.org の Wiki ページ， <https://www.haskell.org/haskellwiki/Mac_OS_X> の手順に基づいています．作業時のバージョンは，

-   Mac OS X 10.8.5
-   Haskell Platform 2014.2.0.0 for Mac OS X, 64bit

でした．

インストール手順
================

Haskell Platform
----------------

Wiki ページのリンクから Haskell Platform をダウンロードしてインストールします．

環境変数 PATH
-------------

~PATH~ を設定してパスを通します．

-   `.zshenv`

    ``` bash
      export PATH=$HOME/Library/Haskell/bin:$PATH
    ```

-   `init.el`

    ``` commonlisp
      (add-to-list 'exec-path (expand-file-name "~/Library/Haskell/bin"))

    ```

clang で動くようにパッチを当てる
--------------------------------

Xcode 5 の gcc は clang で，そのままでは GHC が動きまん．https://gist.github.com/mzero/7245290 の指示に従ってパッチを当てます．

hugs98
------

Wiki ページには MacPorts を使ってインストールするよう書いてあったのですが省略．

cabal-homebrew
--------------

Wiki によると C ライブラリに依存する Haskell のライブラリがあって，その依存先 C ライブラリは MacPorts でインストールするのが良いと書いてあります．しかし，私は Homebrew 派なので `cabal-homebrew` というスクリプトを用意します．

-   ~/Library/Haskell/bin/cabal-homebrew

    ``` bash
      #!/bin/bash

      export CPPFLAGS=-I/opt/homebrew/include
      export LDFLAGS=-L/opt/homebrew/lib
      cabal $@ --extra-include-dirs=/opt/homebrew/

    ```

-   使いかた

    ``` bash
      $ cabal-macports install foobar

    ```

エディタの設定
--------------

あとにします．

mkbndl のインストール
---------------------

「Haskell で Mac OS X アプリをつくるには mkbndl を使えばよい」という趣旨の記述が Wiki ページにありますが， インストール方法が書かれていません．Wiki ページのリンクを辿ると mkbndl が Haskell パッケージらしいことが分かり， もう少し調べると，Haskell プラットホームインストール時に同時にインストールされる cabal でインストールできることがわかるので，インストールします．

``` bash
  $ cabal install mkbndl

  ,**********************************************************************

  === Configuration for cabal has been written to
      /Users/********/.cabal/config

  === Executables will be installed in:
      /Users/********/Library/Haskell/bin

      You may wish to place this on your PATH by adding the following
      line to your ~/.bash_profile:

      export PATH="$HOME/Library/Haskell/bin:$PATH"

  === When documentation is built, a master index to all documentation
      will be placed in:

      /Users/********/Library/Haskell/doc/index.html

      You may wish to bookmark that file once it gets built (after the
      first cabal install).

  ,**********************************************************************

  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: Can't parse
  "/Library/Frameworks/GHC.framework/Versions/7.8.3-x86_64/usr/lib/ghc-7.8.3/settings"

```

~cabal~ コマンド実行がはじめてのせいか，いろいろとメッセージが表示されます．あとでメッセージの指示に従っておきます．

-   設定ファイル
    -   `/Users/********/.cabal/config`
-   パスを通す
    -   `/Users/********/Library/Haskell/bin`
    -   既に通した
-   `cabal` をアップデート
    -   `cabal install cabal-install`

そして，一番最後に気になるメッセージが，

``` example
  cabal: Can't parse
  "/Library/Frameworks/GHC.framework/Versions/7.8.3-x86_64/usr/lib/ghc-7.8.3/settings"
```

さきほど，Xcode 5 の clang 対応のためにあてたパッチがファイルを壊しているようです．確認してみると，

``` example
  diff -U 2 /Library/Frameworks/GHC.framework/Versions/7.8.3-x86_64/usr/lib/ghc-7.8.3/settings.bak /Library/Frameworks/GHC.framework/Versions/7.8.3-x86_64/usr/lib/ghc-7.8.3/settings
  --- /Library/Frameworks/GHC.framework/Versions/7.8.3-x86_64/usr/lib/ghc-7.8.3/settings.bak ...
  +++ /Library/Frameworks/GHC.framework/Versions/7.8.3-x86_64/usr/lib/ghc-7.8.3/settings ...
  @@ -1,4 +1,4 @@
   [ ("GCC extra via C opts"," -fwrapv")
  -, ("C compiler command","/usr/bin/gcc")
  +, ("C compiler command"/usr/bin/ghc-clang-wrapper")
   , ("C compiler flags"," -m64 -fno-stack-protector")
   , ("C compiler link flags"," -m64")

  Diff finished.  Mon Nov 17 08:19:50 2014
```

地味に壊していたようなので直しておきます．

直したら cabal-install です．

``` example
  $ cabal install cabal-install
  ...

  $ cabal install mkbndl
  ...

  Preprocessing executable 'mkbndl' for mkbndl-0.2.1...

  Main.hs:1:1:
      Ambiguous module name ‘Prelude’:
        it was found in multiple packages: base haskell98-2.0.0.3
  cabal: Error: some packages failed to install:
  mkbndl-0.2.1 failed during the building phase. The exception was:
  ExitFailure 1

```

mkbndl はあきらめることにします．

Emacs/ghc-mod 環境構築
======================

Emacs で Haskell を書けるように ghc-mod の環境をつくります．

ghc-mod インストール
--------------------

<http://www.mew.org/~kazu/proj/ghc-mod/en/install.html> の手順に従います．

``` example
  $ cabal update

  $ cabal install ghc-mod

```

かなり時間かかります．

haskell-mode のインストール
---------------------------

-   `\~/.emacs.d/Cask` に `(depends-on "ghc")` を追加
-   `cask` コマンドを実行してインストール
-   `init.el` に追加:

    ``` commonlisp
      (require 'haskell-mode)
      (add-hook 'haskell-mode-hook 'turn-on-haskell-unicode-input-method)
      (add-hook 'haskell-mode-hook 'turn-on-haskell-indentation)
      (eval-after-load "haskell-mode"
        '(progn
           (define-key haskell-mode-map (kbd "C-,") 'haskell-move-nested-left)
           (define-key haskell-mode-map (kbd "C-.") 'haskell-move-nested-right)))
      (add-hook 'haskell-mode-hook 'turn-on-haskell-decl-scan)
      (eval-after-load "which-func"
        '(add-to-list 'which-func-modes 'haskell-mode))
      (eval-after-load "haskell-mode"
          '(define-key haskell-mode-map (kbd "C-c C-c") 'haskell-compile))
      (eval-after-load "haskell-cabal"
          '(define-key haskell-cabal-mode-map (kbd "C-c C-c") 'haskell-compile))
      (eval-after-load "haskell-mode"
        '(progn
          (define-key haskell-mode-map (kbd "C-x C-d") nil)
          (define-key haskell-mode-map (kbd "C-c C-z") 'haskell-interactive-switch)
          (define-key haskell-mode-map (kbd "C-c C-l") 'haskell-process-load-file)
          (define-key haskell-mode-map (kbd "C-c C-b") 'haskell-interactive-switch)
          (define-key haskell-mode-map (kbd "C-c C-t") 'haskell-process-do-type)
          (define-key haskell-mode-map (kbd "C-c C-i") 'haskell-process-do-info)
          (define-key haskell-mode-map (kbd "C-c M-.") nil)
          (define-key haskell-mode-map (kbd "C-c C-d") nil)))

    ```

ghc (Emacs) インストール
------------------------

上に示した公式サイトの手順では

> Please use **stable** MELPA to download Emacs front-end.

となっていたのですが，私の Cask 設定はそうなっていないので，普通の MELPA を使います．

-   `\~/.emacs.d/Cask` に `(depends-on "ghc")` を追加
-   `cask` コマンドを実行してインストール
-   `init.el` に追加:

    ``` commonlisp
      (require 'ghc)
      (autoload 'ghc-init "ghc" nil t)
      (autoload 'ghc-debug "ghc" nil t)
      (add-hook 'haskell-mode-hook 'ghc-init)

    ```

おわりに
=================

つらい