Macで複数のErlangバージョンを使い分ける(OpenSSLバージョン問題の解決方法込)

Nov 1, 2017

要約

  • Macに標準で入っているOpenSSLはバージョンが古くて新しいErlangに対応していない
  • OpenSSLはHomebrewで1系、1.1系を入れることが可能
  • Erlangで使うOpenSSLのパスは、configureでオプション指定すれば変更可能
  • ローカルマシンでは複数のErlangのバージョンを使いたいので、anyenv, erlenvを使って管理することにした

MacのOpenSSL

今までOTP19をローカル環境で使っていたんだけど、OTP20でのアプリケーションの動作検証をすることになった。

が、自分のMacに最初から入っているOpenSSLのバージョンが、OTP20.1に対応していなかった。

*********************************************************************
**********************  APPLICATIONS DISABLED  **********************
*********************************************************************

crypto         : No usable OpenSSL found
odbc           : ODBC library - header check failed
ssh            : No usable OpenSSL found
ssl            : No usable OpenSSL found

$ /usr/bin/openssl version
OpenSSL 0.9.8zh 14 Jan 2016

Homebrewを使うと1系、1.1系のOpenSSLを入れることができるので、 Homebrewで入れたOpenSSLの場所を、Erlangをビルドするときに指定する。

HomebrewでOpenSSLをインストール

$ brew install openssl
$ brew info openssl
For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/openssl/lib
    CPPFLAGS: -I/usr/local/opt/openssl/include
For pkg-config to find this software you may need to set:
    PKG_CONFIG_PATH: /usr/local/opt/openssl/lib/pkgconfig

これで1系のopensslが /usr/local/opt/openssl 以下に入る。 新しいバージョンのErlangをインストールする際は、後述するconfigureのオプションにこのパスを指定する。

anyenvをインストール

複数のErlangのバージョンはanyenv, erlenvで管理することにした。

まずはanyenvをインストールする。

https://github.com/riywo/anyenv

anyenvでerlenvをインストールする。

anyenv install erlenv

erlenvで任意のErlangをインストール

https://github.com/talentdeficit/erlenv

erlenvにはリリースのビルド機能はないので、自分で$HOME/.anyenv/envs/erlenv/releases/以下に任意のバージョンでビルドしてインストールする必要がある。

HomebrewでインストールしたOpenSSLライブラリを指定してビルドする

前述したOpenSSLをconfigureにオプション指定してビルドする。

configure.inを見るとOpenSSLの場所を指定するオプションがある。(※ 以下のリンクは20.1のもの。他のバージョンだとconfigureのオプションが違うかもしれないので要確認)

https://github.com/erlang/otp/blob/OTP-20.1/configure.in#L262-L265

$ git clone https://github.com/erlang/otp.git
$ cd otp
$ git fetch --all --tags

# タグ等で任意のバージョンにチェックアウト
$ git checkout tags/OTP-20.1

$ ./otp_build autoconf

$ ./configure --prefix=$HOME/.anyenv/envs/erlenv/releases/OTP-20.1 --with-ssl=/usr/local/opt/openssl
$ make
$ make install

※ opensslのディレクトリは以下のコマンドで確認可能

$ openssl version -d

※:このとき、odbc, fopという依存ソフトウェアがインストールされていないときは、homebrewでインストールする。

*********************************************************************
**********************  APPLICATIONS DISABLED  **********************
*********************************************************************

odbc           : ODBC library - header check failed

*********************************************************************
*********************************************************************
**********************  DOCUMENTATION INFORMATION  ******************
*********************************************************************

documentation  :
                 fop is missing.
                 Using fakefop to generate placeholder PDF files.

*********************************************************************

$ brew install unixodbc fop

erlコマンドを使う

$ erlenv global OTP-20.1
$ erlenv rehash
$ which erl
/Users/user/.anyenv/envs/erlenv/shims/erl

参考

Mac OSXにanyenv/exenvでElixirをインストールする - Qiita

Retrun to top