Elm19.0をARM 64bit プロセッサでソースからビルドする

# 概要
ElmというHaskellライクな純粋関数型AltJSが話題になってたので、手持ちのRock64というSBC(Single Board Computer)にインストールしようとしてあれこれ苦労した。

* npm install だと `Error: No binaries are available for your platform: linux-arm64`と出て異常終了する。
* ソースからビルドしようと思ってHaskellのビルドツールStackを入れようとするが、そちらもエラー終了する

最終的にはStackとは別にCabalをインストールし、ビルド成功した。

# 環境
## ハードウェア
Rock64。ラズパイっぽいやつ。ギガビットイーサやUSB3.0を乗っけており、RAMも4GBある。
さすがにUSB給電(5V0.5A)では厳しいのか、5V3AのACアダプタが必要になる点はx。そのせいでラズパイ用ケースが完全には適合しない(http://denor.daa.jp/rock64をraspberry-piのケースに入れるには )。

また、ラズパイは64bitのARMプロセッサを載せているが、32bit互換モードで動作している。しかし、Rock64は64bitモードで動いている。
このためOSから見たCPUアーキテクチャがラズパイとは異なり、ラズパイで動くソフトウェアが動かないということがざらにある。
Rock64の情報はラズパイに比べてかなり限られているので、自分で苦労するハメになる。。。

```
rock64@rock64:/usr/local/bin$ uname -m
aarch64
```
ちなみにラズパイのアーキについては(https://blog.treedown.net/entry/2016/09/06/010000 )。

## OS
Rock64の開発元がいろいろなOSのインストールイメージを公開している(https://github.com/pine64dev/PINE64-Installer/blob/master/README.md )。

![PINEインストーラ.PNG](https://qiita-image-store.s3.amazonaws.com/0/265569/52256f99-5022-dd02-b7a1-add42274ff99.png)

私は使い慣れたUbuntuにした。とりあえずパフォーマンスとかは今のところ気になっていない。
※余談だが上のキャプチャは2018/10/19に撮ったもの。自分がインストールしたとき（6月ごろ）よりUbuntu18.04のイメージが増えて、16.04のイメージが減っている気がする。。。

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
```

# ビルド・インストール手順
## GHCとCabalのインストール
ElmはHaskellで実装されているらしく、ビルドにはHaskellのコンパイラであるGHCとビルドツールCabalが必要になる。
私はまずStackでなんとかしようと頑張ったが、Stack自体のインストールに躓いて精神力を消耗した（そしておそらくStackを入れたとしても解決していなかった）。
GHCとCabalは `apt-get install`で簡単にインストールできる。

```
$ sudo apt-get install ghc
$ sudo apt-get install cabal-install
```
ただし、Ubuntuが最新でない(Bionicではない)ためか、やや古いバージョンが入る(ghc: 7.10.3-7, cabal-install: 1.22.6.0-2)。とりあえずうまく行ったので今回はこれで進める。

## ソースのダウンロード
以前はElm-platformというリポジトリをダウンロードしていたと思うのだが、`elm/compiler`というリポジトリに移ったらしい。

https://github.com/elm-lang/elm-platform/blob/master/README.md#build-from-source

なのでそちらをクローンする。

```
$ git clone https://github.com/elm/compiler.git
$ ls compiler/
builder  compiler  ContributorAgreement.pdf  docs  elm.cabal  installers  LICENSE  README.md  ui  upgrade-docs
```

## ビルド

`compiler/`直下に`elm.cabal`がある。これにビルド設定が書かれているはずなので、`compiler/`配下に移動して `cabal install`コマンドを実行する。

```
$ cd compiler
$ cabal install
```
正確に測っていないので不明だが、1時間以上はかかる。
寝て待とう。

ビルドが完了すると、新たに `compiler/dist`というディレクトリが生成されている。

```
$ ls
builder  compiler  ContributorAgreement.pdf  dist  docs  elm.cabal  installers  LICENSE  README.md  ui  upgrade-docs
```

## パスを通す
果たしてこのやり方で本当に正しいのかよくわからないが、実行ファイルのシンボリックリンクをPATHが通ったディレクトリに作成する。環境変数PATHに実行ファイルのパスを通すやり方でもいいと思う。

```
$ cd /usr/local/bin/
$ sudo ln -s /home/rock64/Elm-Platform/compiler/dist/build/elm/elm elm
```

## 実行

```
$ elm
Hi, thank you for trying out Elm 0.19.0. I hope you like it!

-------------------------------------------------------------------------------
I highly recommend working through <https://guide.elm-lang.org> to get started.
It teaches many important concepts, including how to use `elm` in the terminal.
-------------------------------------------------------------------------------

The most common commands are:

    elm repl
        Open up an interactive programming session. Type in Elm expressions like
        (2 + 2) or (String.length "test") and see if they equal four!

    elm init
        Start an Elm project. It creates a starter elm.json file and provides a
        link explaining what to do from there.

    elm reactor
        Compile code with a click. It opens a file viewer in your browser, and
        when you click on an Elm file, it compiles and you see the result.

There are a bunch of other commands as well though. Here is a full list:

    elm repl    --help
    elm init    --help
    elm reactor --help
    elm make    --help
    elm install --help
    elm bump    --help
    elm diff    --help
    elm publish --help

Adding the --help flag gives a bunch of additional details about each one.

Be sure to ask on the Elm slack if you run into trouble! Folks are friendly and
happy to help out. They hang out there because it is fun, so be kind to get the
best results!
```

ｷﾀ━━━━(ﾟ∀ﾟ)━━━━!!
長かった。。。

# 所感

そもそもCabalでビルドしろと書いているのにStackを入れようとしていたのが愚かだが、そのあたりのツールの関連を理解していなかったのが問題だったような気がする。
普段パッケージマネージャに頼りきりだとこういう時に知識不足が露呈しますね。
精進せねば。

# 参考リンク
※本文中に書いたものもまとめておく

* [Rock64公式](https://www.pine64.org/?page_id=7147)
* [PINEインストーラ](https://github.com/pine64dev/PINE64-Installer/blob/master/README.md)
* http://denor.daa.jp/rock64をraspberry-piのケースに入れるには
* [RaspberryPi3は64ビットCPUで32ビットOSを動かす](https://blog.treedown.net/entry/2016/09/06/010000)
* [Elmソースリポジトリ](https://github.com/elm/compiler)
* [Elm入門ハンズオン 文法編](https://gitpitch.com/ababup1192/elm-handson1)
* [Elm入門ハンズオン The Elm Architecture編](https://gitpitch.com/ababup1192/elm-handson2)