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


この記事は「fukuoka.ex(その2) Elixir Advent Calendar 2017」の21日目です.

昨日は,@kobatakoさんの「Slack botで通知したい投稿日のものを通知する with Qiita API」でした.

はじめに

どうもこんにちは.
fukuoka.exという福岡のElixir/PhoenixコミュニティにてIoT芸を披露している者です.
巷を賑わせている新しめの関数型言語であるElixirでIoTできるよ!?と喧伝しております.

これまでの連載記事はこちら.
 |> ElixirでIoT#0:IoTボードへのLinux環境の準備
 |> ElixirでIoT#1:IoTボードへのElixir環境の構築とEEloTツールキットの紹介
 |> ElixirでIoT#2:いろいろ分かるベンチマークを整備してみる
 |> ElixirでIoT#3:IoTボードで動いた!Phoenixが立った!性能評価と考察
 |> ElixirでIoT#4:Nervesって何者?ラズパイでLチカできんの!?

今回は小ネタです.
ラズパイや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)を明示的に使えたりと,とっても有用でオススメです.
HiPEを使いたい場合は,configure時に--enable-hipeを付けてあげます.

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

$ 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環境がインストールされます.

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

$ 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単体で動かしてもやっぱりダメでした.

$ 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実行時のログにちゃんと表示されてました.

checking for m4... no
configure: HiPE disabled as no valid m4 is found in PATH

おうふっ,,,

対処法

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

$ sudo apt-get install m4

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

$ 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はいいぞぅ!!
    • インストールスクリプトinstall.shも公開しています.もちろんm4のインストール付き!

明日のfukuoka.ex的な記事は@piacere_exさんの
関数型でデータサイエンス番外編:様々な日時文字列を扱えるようにする」です.お楽しみに!

お知らせ

 満員御礼!Elixir MeetUpを6月末に開催します 
※応募多数により、増枠しました
「fukuoka.ex#11:DB/データサイエンスにコネクトするElixir」を6/22(金) 19時に開催します.

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