AArch64 で Haskell Stack

前の PC の具合が悪くなった等で新しい環境が AArch64 Gentoo になった。新しい環境でも Haskell および Stack を使いたいけれど、記事作成時点では AMD64 のようには整っていなかったのである程度自前でやった。そのときのメモ。

自前の GHC ビルド

GHC には AArch64 Debian のバイナリディストリビューションがあって、Gentoo でのそのまま動くのだけれど、libtinfo 絡みのなにかの警告メッセージがうるさいので自前で GHC をビルドする。

まずは普通に GHC と Cabal をインストール。GHC のバージョンは 8.10.7, インストール先は ~/.cabal とした。Cabal でインストールしたコードを含めてあとでまとめて消せるため。ダウンロード元と手順:

$ tar xf ghc-8.10.7-aarch64-deb10-linux.tar.xz
$ cd ghc-8.10.7
$ ./configure --prefix=$HOME/.cabal
$ make install
$ tar xf cabal-install-3.6.0.0-aarch64-linux-deb10.tar.xz -C $HOME/.cabal/bin
$ export PATH=$HOME/.cabal/bin:$PATH

GHC は何のひねりもなくビルドできた。普通の Gentoo インストールから追加で sys-process/numactl を emerge する必要があった程度。以下では C コンパイラに Clang を使っているが、GCC でも問題ない。今回この環境では Clang を使っているので合わせただけ。

$ rm -rf ghc-8.10.7 # 前のバイナリディストリビューション
$ tar xf ghc-8.10.7-src.tar.xz
$ cd ghc-8.10.7
$ CC=clang ./configure
$ make -j4
$ make binary-dist

ここでできあがった GHC が今後 Stack で使うことになるもの。ghc-8.10.7-aarch64-unknown-linux.tar.xz を適当なディレクトリ (自分は ~/ghc にした) に置いておく。

Stack の準備

Stack は記事作成時点では AArch64 のビルドが提供されていないので、自前でコンパイルする必要がある。ただ、既に GHC/Cabal があるのでそれで問題なくできる。一点だけ、Pantry モジュールのバージョンを指定する必要があった (https://github.com/commercialhaskell/pantry/issues/43)。

$ cabal update
$ cabal install --constraint='pantry < 0.5.3' stack

これで ~/.cabal 以下に (暫定の) Stack が入る。早速使ってみようとするとコンパイラが見つからないというエラーになる。

$ stack setup
Writing implicit global project config file to: /home/dr/.stack/global-project/stack.yaml
Note: You can change the snapshot via the resolver field there.
Using latest snapshot resolver: lts-18.19
Unable to find installation URLs for OS key: linux-aarch64-tinfo6

Stack のみならず適切な GHC のバージョンも提供されていない。ということで先ほど作った GHC を使うように設定する。

# ~/.stack/config.yaml
setup-info:
  ghc:
    linux-aarch64-tinfo6:
      8.10.7:
        url: "/home/dr/ghc/ghc-8.10.7-aarch64-unknown-linux.tar.xz"

ここまで来ればもう使える。まずは Stack を。

$ stack --resolver lts-18.19 setup
$ stack install stack

これで ~/.local/bin に Stack が入る。~/.cabal への依存はもうないので丸ごと消しても良し。普通の使用感で Stack が使える。バージョンを増やしたいときにはそれぞれの GHC バージョンをビルドして binary-dist を ~/.stack/config.yaml から参照すれば ok.

参考