Erlang/OTPのソースビルドでHiPEが入らなかった時の対処法

この記事は[「fukuoka.ex(その2) Elixir Advent Calendar 2017」](https://adventar.org/calendars/2871)の21日目です．

昨日は，@kobatakoさんの「[Slack botで通知したい投稿日のものを通知する with Qiita API](https://qiita.com/kobatako/items/f4c3cb1b21c499f7614e)」でした．

# はじめに

どうもこんにちは．
[fukuoka.ex](https://fukuokaex.connpass.com/)という福岡のElixir/PhoenixコミュニティにてIoT芸を披露している者です．
巷を賑わせている新しめの関数型言語である**ElixirでIoTできるよ！？**と喧伝しております．

これまでの連載記事はこちら．
　|> [ElixirでIoT#0：IoTボードへのLinux環境の準備](https://qiita.com/takasehideki/items/9e3db412a40659233384)
　|> [ElixirでIoT#1：IoTボードへのElixir環境の構築とEEloTツールキットの紹介](https://qiita.com/takasehideki/items/fc570ae92a895caed213)
　|> [ElixirでIoT#2：いろいろ分かるベンチマークを整備してみる](https://qiita.com/takasehideki/items/e1dcb4058c7d0b51d554)
　|> [ElixirでIoT#3：IoTボードで動いた！Phoenixが立った！性能評価と考察](https://qiita.com/takasehideki/items/0aa644639f81c2ad0bbc)
　|> [ElixirでIoT#4：Nervesって何者？ラズパイでLチカできんの！？](https://qiita.com/takasehideki/items/94820516ec95b85bae32)

今回は小ネタです．
ラズパイやIoTボードにErlang/Elixir環境を構築した時にハマったことと，その対処法を共有したいと思います．

# 何にハマったのか？

連載記事では，下記4種類のIoTボード環境を用意しました．

- Raspberry Pi 3 Model B　/ Raspbian Stretch with Desktop 4.9
- Raspberry Pi 3 Model B　/ Ubuntu MATE 16.04
- ODROID-XU3 / ubuntu-16.04-mate-odroid-xu3-20170731
- ZYBO / Xillinux-2.0

Elixir/Erlang環境の構築は，**男は黙ってソースからビルド**ですよね？？
ソースからインストールすることで，導入するバージョンを自由に選べたり[HiPE(High Performance Erlang)](https://qiita.com/sile/items/d750019fcab961bbb0a7)を明示的に使えたりと，とっても有用でオススメです．
HiPEを使いたい場合は，configure時に`--enable-hipe`を付けてあげます．


ひとまず全部のインストール方法です．
`$ sudo apt install git`などでgitクライアントは入っている前提です．

```shell-session
$ wget http://erlang.org/download/otp_src_20.3.tar.gz
$ tar xzvf otp_src_20.3.tar.gz
$ cd otp_src_20.3/
$ ./configure --enable-hipe
$ make
$ sudo make install
$ cd ../
$ git clone https://github.com/elixir-lang/elixir.git
$ cd elixir/
$ git checkout v1.6.5
$ make clean test
$ sudo make install
```

全て成功したら`/usr/local/bin/`にElixir環境がインストールされます．

なんですが，，，インストール結果を確認してみたところ，，，

```shell-session
$ which elixir
/usr/local/bin/elixir

$ elixir --version
Erlang/OTP 20 [erts-9.3] [source] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]

Elixir 1.6.5 (compiled with OTP 20)
```

あれっ？？ `[hipe]` が入ってなくない！？？
Erlang単体で動かしてもやっぱりダメでした．

```shell-session
$ erl
Erlang/OTP 20 [erts-9.3] [source] [smp:4:4] [ds:4:4:10] [async-threads:10] [kernel-poll:false]

Eshell V9.3  (abort with ^G)
```

# 何が悪かったのか？

`--enable-hipe`をhiveにtypoったんかな？とか，パッケージインストールした環境が残っちゃってる？？とか，かなり悩みました．
しかもラズパイ3B/RaspianとODROID-XU3ではダメで，ラズパイ3B/UbuntuとZYBOにはちゃんとHiPEが入ってるんですよね．IoTボード間のElixir/Phoenix性能の比較評価をやっていたので，この辺りの環境が異なってくるのはフェアじゃなくて非常にマズい，，，

んでいろいろ調査してみたところ，原因を見つけました．
`./configure --enable-hipe`実行時のログにちゃんと表示されてました．

```shell-session
checking for m4... no
configure: HiPE disabled as no valid m4 is found in PATH
```

おうふっ，，，:laughing:

# 対処法

ということで`m4`をインストールしてあげてください．

```shell-session
$ sudo apt-get install m4
```

無事にラズパイ3B/RaspbianとODROID-XU3でも`hipe`を入れることができました．

```shell-session
$ elixir --version
Erlang/OTP 20 [erts-9.3] [source] [smp:2:2] [ds:2:2:10] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.6.5 (compiled with OTP 20)
```


# まとめ

- 男は黙ってソースビルド，でも**Erlang/OTPのビルド時に本当にHiPEが入っていますか？**
- `m4`のインストールをお忘れなく．
- やっぱり[EEloT](https://github.com/takasehideki/EEloT)はいいぞぅ！！
    - インストールスクリプト[`install.sh`](https://github.com/takasehideki/EEloT/blob/master/install.sh)も公開しています．もちろん`m4`のインストール付き！

明日のfukuoka.ex的な記事は@piacere_exさんの
「[関数型でデータサイエンス番外編：様々な日時文字列を扱えるようにする](https://qiita.com/piacere_ex/items/09d4dfab06c66f4faae4)」です．お楽しみに！



## お知らせ

:alarm_clock::alarm_clock::alarm_clock::alarm_clock:<b>　満員御礼！Elixir MeetUpを6月末に開催します　</b>:alarm_clock::alarm_clock::alarm_clock::alarm_clock:
<font color="red"><b>※応募多数により、増枠しました</b></font>
[<b>「fukuoka.ex#11：DB／データサイエンスにコネクトするElixir」</b>](https://fukuokaex.connpass.com/event/87241)を6/22(金) 19時に開催します．

私も**「ElixirでIoTやってみた」**芸を披露する予定です．
ラズパイとGrovePiを使って，環境データをセンシングしてさくっとWeb表示できたらおもろいかな？と思っています
（ちょっと準備に取り掛かったらトラブル発生しまくり！さて当日までに間に合うか！？？><;

[![image.png](https://connpass-tokyo.s3.amazonaws.com/thumbs/cb/13/cb130a03343bc310b07244c308b940db.png)](https://fukuokaex.connpass.com/event/87241)