最近、関数型言語に関してちょっと思うところがあって、いろいろ勉強中。
といっても、モナドとかではなく、並列性に関して。
それについてはまた別の機会に書くとして、今日はそれに関係してErlangをMacに入れてみたので、それについて。
全体の流れ
最初に断っておくと、普通ならMacPortsとかHomebrewを使えば、簡単なはず。
ただ、自分はそのいずれも使ったことがない(^^;
似たようなものがいくつもあるので、いまだにどれを使うべきなのかがよく分かっていなくて。
ということで、基本的にはtarボールもしくはGitHubからソースを取得して、ビルドしていった。
そして、全体の流れは、以下のとおり:
- autoconfのビルド、インストール
- Erlang/OTPのソースのダウンロード
- パッチのダウンロードと適用
- Erlang/OTPのビルド、インストール
- 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> $
ちゃんと動いていることが分かると思う。
ちなみに、今読んでる本は、コレ。
- 作者: Fred Hebert,山口能迪
- 出版社/メーカー: オーム社
- 発売日: 2014/07/04
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (10件) を見る
まだ全然最初の方だけど、Haskellとはまた全然違って興味深いw
動的型付けで副作用もあるので、あんまり関数型っぽくない感じ。
ちょっと(かなり?)構文にクセのある、オブジェクト指向のない、昔ながらのプログラミングを見てる気分(^^;
今日はここまで!