いものやま。

雑多な知識の寄せ集め

MacにErlangをインストールしてみた。

最近、関数型言語に関してちょっと思うところがあって、いろいろ勉強中。
といっても、モナドとかではなく、並列性に関して。

それについてはまた別の機会に書くとして、今日はそれに関係してErlangMacに入れてみたので、それについて。

全体の流れ

最初に断っておくと、普通ならMacPortsとかHomebrewを使えば、簡単なはず。
ただ、自分はそのいずれも使ったことがない(^^;
似たようなものがいくつもあるので、いまだにどれを使うべきなのかがよく分かっていなくて。

ということで、基本的にはtarボールもしくはGitHubからソースを取得して、ビルドしていった。

そして、全体の流れは、以下のとおり:

  1. autoconfのビルド、インストール
  2. Erlang/OTPのソースのダウンロード
  3. パッチのダウンロードと適用
  4. Erlang/OTPのビルド、インストール
  5. Erlang/OTPのドキュメントのビルド、インストール

ちなみに、自分の環境は以下のとおり:

Mac OS X: 10.11.6 (El Capitan)
Xcode: 8.0
Clang: 8.0.0
autoconf: (インストールなし)

autoconfのビルド、インストール

まず最初に必要なのが、autoconfのビルドとインストール。

というのも、Erlang/OTPのソースをGitHubからダウンロードした場合、configureスクリプトが入っていないので、otp_buildを使ってconfigureスクリプトを作る必要があるから。
このとき、autoconfの2.59以降が必要になってくる。

自分の環境の場合、autoconf自体が入っていなかったので、まずはautoconfをビルドしてインストールする必要があった。
もし、autoconfの2.59以降が入っているのなら、この手順は不要。

さて、autoconfのビルドとインストールなんだけど、autoconfのソース自体は、GitHubからダウンロードできるようになっている。
けど、autoconf自体が入っていない場合には、GitHubからダウンロードするのではダメ。
なぜかというと、autoconfをビルドするためのconfigureスクリプトGitHubのソースには入っていないからw
GitHubのソースからautoconfをビルドしたい場合、ブートストラップーーすなわち、すでに入っているautoconfを使ってconfigureスクリプトを作ってやる必要がある。
鶏が先か、卵が先かw

幸い、tarボールにはconfigureスクリプトが入っているので、tarボールをダウンロードしてきて使えば問題ない。
http://ftp.gnu.org/gnu/autoconf/から適当なものをダウンロードしてくる。
自分はautoconf-2.69.tar.gzをダウンロードしてきた。

ダウンロードしてきたら、展開して、お決まりの手順でビルド&インストール。

$ tar zxvf autoconf-2.69.tar.gz
$ cd autoconf-2.69/
$ ./configure
$ make
$ sudo make install

特に問題はないはず。

Erlang/OTPのソースのダウンロード

次は、Erlang/OTPのソースをGitHubからダウンロード。

といっても、cloneするだけ。

$ git clone https://github.com/erlang/otp.git
$ cd otp/

そして、今後使うので、環境変数ERL_TOPを設定しておく。

$ export ERL_TOP=`pwd`

パッチのダウンロードと適用

さて、これで普通にビルドできればいいんだけど、どうやらバグがあるらしく、普通に手順を進めていくと、エラーになってビルドに失敗する(^^;

=== Entering application hipe
 VSN    hipe.hrl
 ERLC   ../ebin/hipe_rtl.beam
dyld: lazy symbol binding failed: Symbol not found: _clock_getres
  Referenced from: /Users/yasufumi/Development/erlang/otp/bin/x86_64-apple-darwin15.6.0/beam.smp (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

dyld: Symbol not found: _clock_getres
  Referenced from: /Users/yasufumi/Development/erlang/otp/bin/x86_64-apple-darwin15.6.0/beam.smp (which was built for Mac OS X 10.12)
  Expected in: /usr/lib/libSystem.B.dylib

/bin/sh: line 1: 46066 Trace/BPT trap: 5       erlc -W +debug_info -Werror +inline +warn_unused_import +warn_export_vars -o../ebin hipe_rtl.erl
make[3]: *** [../ebin/hipe_rtl.beam] Error 133
make[2]: *** [opt] Error 2
make[1]: *** [opt] Error 2
make: *** [secondary_bootstrap_build] Error 2

幸い、pull requestでこの問題の修正が投げられていて、特に問題もないようなので、このパッチを取り込んであげれば大丈夫だった。

自分がビルドした時点ではまだmaintブランチに取り込まれていなかったけど、おそらくしばらくしたら取り込まれるはず。
取り込まれていたら、以下の手順は不要。

まず、pull requestの変更を取り込むために、フォークされたリポジトリをリモートリポジトリに追加して、フェッチ。

$ git remote add rickard-green https://github.com/rickard-green/otp
$ git fetch rickard-green

そして、適当なブランチを用意して、変更をマージ。

$ git checkout -b quick_patch
$ git merge rickard-green/rickard/macosx-config-mess/OTP-13904

さらに、以下の環境変数を設定しておく。

$ export MACOSX_DEPLOYMENT_TARGET=10.11.6

これでOK。

Erlang/OTPのビルド、インストール

パッチのダウンロードと適用ができたら、いよいよビルドとインストール。

まずはconfigureスクリプトを作らないといけないので、otp_buildを実行する。

$ ./otp_build autoconf

これでconfigureスクリプトを作ってくれる。
最後にいろいろメッセージが出ると思うので、必要ならconfigureスクリプトに渡すオプションを変えること。

そして、お決まりの手順。

$ ./configure
$ make
$ sudo make install

ちなみに、make installを行う前に、make release_testsを実行すると、テストをしてくれるみたい。

これで何もエラーが出なければ、Erlang/OTPのインストールは完了!

Erlang/OTPのドキュメントのビルド、インストール

さて、これでErlang/OTP自体のインストールは終わりなんだけど、ドキュメントもビルドしてインストールしておいた方がよさそう。

ドキュメントをビルドするには、まず、PATH環境変数を追加する必要がある。

$ export PATH=$ERL_TOP/bin:$PATH

そして、ビルド&インストール。

$ make docs
$ sudo make install-docs

これでドキュメントもインストールされる。

動作確認

最後に、ちょっとした動作確認。

とりあえずErlangシェルを使ってみる。

$ erl
Erlang/OTP 19 [erts-8.1] [source-9e29e8f] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V8.1  (abort with ^G)
1> 1 + 2.
3
2> io:format("Hello, world!~n").
Hello, world!
ok
3> q().
ok
4> 
$ 

ちゃんと動いていることが分かると思う。


ちなみに、今読んでる本は、コレ。

すごいErlangゆかいに学ぼう!

すごいErlangゆかいに学ぼう!

まだ全然最初の方だけど、Haskellとはまた全然違って興味深いw
動的型付けで副作用もあるので、あんまり関数型っぽくない感じ。
ちょっと(かなり?)構文にクセのある、オブジェクト指向のない、昔ながらのプログラミングを見てる気分(^^;

今日はここまで!