Haskell Platform や パッケージ管理システムを使わずに GHC と Cabal をインストールする – Debian 8 (Jessie) 編

[モチベーション]

Haskell のコンパイラのデファクトスタンダードである GHC は、わりと頻繁に新しいバージョンがリリースされている。

開発が活発なのは利用者としてはうれしいことだが、Haskell Platform や 各ディストリビューションのパッケージ管理システムを使って環境を構築していると、各バージョンのGHCを切り替えて使うことが難しく、それが作業の妨げになることがある。

GHCのバイナリパッケージを自分でインストールしてPATHの設定も自分で行っておくと各バージョンの切り替えが可能となる。

自前構築は面倒なイメージがあるが、ポイントを押さえれば意外と簡単なのでここで共有する。

今回は “Debian 8 (Jessie) 編”だ。amd64版が最小構成でインストールされていると仮定する。

Haskell Platform や パッケージ管理システムを使わずに GHC と Cabal をインストールする – CentOS 7 編

[概要]

下記を行うための手順を示す。

1. GHCのバイナリパッケージのインストール

GHCのバイナリパッケージを /usr/local/apps/ にインストールする。
下記のように複数バージョンを保持する前提。

/usr/local/apps/ghc-7.6.3
/usr/local/apps/ghc-7.8.4
/usr/local/apps/ghc-7.10.1
/usr/local/apps/ghc-7.10.2

2. cabalコマンドのビルド

公式サイトから落としてきた cabal コマンドを使用して自前のcabalコマンドをビルドする。

[1. GHCのバイナリパッケージのインストール]

GHCのバイナリパッケージは下記のサイトで公開されている。
https://www.haskell.org/ghc/

Debian 7 (wheezy) でビルドされたものが jessie でも使える。
https://www.haskell.org/ghc/download_ghc_7_10_2#x86_64linux

gcc と make が必要なのでインストールしておく。
libgmp-dev は ghci の実行時に必要となるので一緒に入れておく。

$ sudo apt-get install gcc make libgmp-dev

バイナリパッケージをダウンロードする。

$ wget http://downloads.haskell.org/~ghc/7.10.2/ghc-7.10.2-x86_64-unknown-linux-deb7.tar.bz2

tar ボールを解凍して、解凍先に cd する。

$ tar jxf ghc-7.10.2-x86_64-unknown-linux-deb7.tar.bz2
$ cd ghc-7.10.2/

インストール先を指定して configure する。
gcc や make がないと、このときエラーになる。

$ ./configure --prefix=/usr/local/apps/ghc-7.10.2

管理者権限で make install

$ sudo make install

下記のように、PATHを追加する。

$ cat ~/.bash_profile
PATH=$PATH:/usr/local/apps/ghc-7.10.2/bin

export PATH

PATHの追加を反映。(ログインしなおしてもよい)

$ source ~/.bash_profile

ghci を起動して下記のように動作すれば成功。

$ ghci
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help
Prelude> 1 + 2 + 3
6
Prelude> :q
Leaving GHCi.

[2. cabalコマンドのビルド]

パッケージ名としてはCabalのライブラリがcabal、cabalコマンドがcabal-installとなっている。

cabal-installのバイナリビルドは下記のサイトで公開されているが、Linux版は32bit版のみの為、64bit環境で動作させるには、少し工夫が必要になる。
https://www.haskell.org/cabal/download.html

32bitアーキテクチャを dpkg の対象に追加してからaptを更新する。
libc6:i386、zlib1g:i386、libgmp10:i386 は32bit版のcabalの動作に必要なパッケージ。
zlib1g-dev は自前の64bit版のcabalをビルドするときに必要なのでここで入れておく。

$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install libc6:i386 zlib1g:i386 libgmp10:i386 zlib1g-dev

32bitバイナリの動作についての詳細はこちらを参照。
http://askubuntu.com/questions/454253/how-to-run-32-bit-app-in-ubuntu-64-bit

バイナリビルドをダウンロードする。

$ wget https://www.haskell.org/cabal/release/cabal-install-1.22.0.0/cabal-1.22.0.0-i386-unknown-linux.tar.gz

tar ボールを解凍すると cabal という名前のファイルが生成される。これが32bit版 cabalコマンド。

$ tar zxf cabal-1.22.0.0-i386-unknown-linux.tar.gz

cabal のパッケージ情報を更新(ダウンロード)する。

$ ./cabal update

自分の cabal コマンドをビルドする。~/.cabal/bin にインストールされる。

$ ./cabal install cabal-install

下記のように、PATHを追加する。

$ cat ~/.bash_profile

PATH=$PATH:/usr/local/apps/ghc-7.10.2/bin
PATH=$PATH:~/.cabal/bin

export PATH

PATHの追加を反映。(ログインしなおしてもよい)

$ source ~/.bash_profile

自分の cabal が参照されれば成功。

$ which cabal
/home/administrator/.cabal/bin/cabal