Raspberry Pi 4でHaskellプログラムをビルドしたりDockerを使ったりする

共立プロダクツのRaspberry Pi 4スターターセットを買って試してみた。Micro SDカードにはRaspbian Buster (10.3)がプリインストールされている。

Haskellプログラムをビルドする

Raspberry Pi 4でHaskellを使うことについては以下の記事がある。

上記記事だと普通にstackをインストールできるみたいだが、先日試したら

$ curl -sSL https://get.haskellstack.org/ | sh
Detected Linux distribution: raspbian

Sorry, currently only 64-bit (x86_64) Linux binary is available.

インストールできなかった(´・ω・`)

ということで、system GHCとcabal-installでビルドする。

$ sudo apt install ghc cabal-install
$ cabal update

ghcをインストールするとllvm-6.0-devもインストールされるようだ。

Raspbian Busterのレポジトリからインストールできるのはghc-8.4.4とCabal-2.2。

ghc-8.4.4に対応するstackage LTSはlts-12.26(執筆時点の最新LTS)。このLTSのパッケージセットを使うために以下のテクニックを使う。

Haskellプロジェクトの.cabalファイルがあるところで、LTSのconstraintsファイルをダウンロードして設置する。

$ curl 'https://www.stackage.org/lts-12.26/cabal.config' > cabal.config

で、cabal sandboxでビルドする。

$ cabal sandbox init
$ cabal install --only-dependencies --disable-tests --disable-benchmarks --disable-documentation
$ cabal build

あと、この環境でRTSオプションとして-Nを指定したらエラーになった。どうやらこのGHCではサポートしていないらしい。下記issueのせいだろうか。

Dockerを使う

DockerはRaspbian on Raspberry Pi 4でも普通にインストールできる。下記のインストールスクリプトでインストールする。

また、docker-composeは普通にpipでインストールする。

$ pip install docker-compose

しかし、いざ使ってみたらNo module named ssl_match_hostnameというエラーとNo module named shutil_get_terminal_sizeというエラーが出た。これが関係あるんだろうか?

とりあえず、

$ sudo apt install python-backports.ssl-match-hostname python-backports-shutil-get-terminal-size

をインストールしたらエラーが消えてdocker-composeを使えるようになった。

ま、いいか。