ruby-build が Homebrew の openssl に依存しなくなった

Posted on

例年どおり、クリスマスに Ruby 2.7.0 がリリースされましたね。さっそく macOS 上に ruby-build でインストールしてみたのですが、明らかにいつもより時間がかかることに気がつきました。そのときは急いでいたので深掘りしませんでしたが、改めて調べてみると ruby-build が Homebrew の openssl に依存しなくなり、インストールのたびに openssl をコンパイルしているからでした。

理由として次の 3 点を挙げています。 openssl は他のソフトウェアから参照されることも多く、インストールする Ruby にあった正しいバージョンを選択するのはたしかに難しそうです。

ruby-build already does a lot of work to make sure that the version of ruby you're installing has the correct version of openssl also installed. Looking for any version of openssl installed by Homebrew is problematic for a few reasons:

  • The user may have an incompatible version installed.
  • The user may not know that a particular version of openssl has been installed by Homebrew.
  • The openssl version split now makes this logic more difficult to maintain for all versions of ruby that ruby-build can install.

これまで通り Homebrew の openssl を使うには RUBY_CONFIGURE_OPTS の環境変数にオプションを渡します。上が普通にインストールした場合、下が環境変数をセットして Homebrew の openssl を使ってインストールした場合です。インストールの時間に 2 倍以上の差がありました。

$ time rbenv install 2.7.0
Downloading openssl-1.1.1d.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/1e3a91bc1f9dfce01af26026f856e064eab4c8ee0a8f457b5ae30b40b8b711f2
Installing openssl-1.1.1d...
Installed openssl-1.1.1d to /Users/manabusakai/.rbenv/versions/2.7.0

Downloading ruby-2.7.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2
Installing ruby-2.7.0...
ruby-build: using readline from homebrew
Installed ruby-2.7.0 to /Users/manabusakai/.rbenv/versions/2.7.0

real    6m14.205s
user    8m26.413s
sys     1m45.899s
$ export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)"
$ echo $RUBY_CONFIGURE_OPTS
--with-openssl-dir=/usr/local/opt/openssl@1.1
$ time rbenv install 2.7.0
Downloading ruby-2.7.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.0.tar.bz2
Installing ruby-2.7.0...
ruby-build: using readline from homebrew
Installed ruby-2.7.0 to /Users/manabusakai/.rbenv/versions/2.7.0

real    2m57.095s
user    5m51.142s
sys     1m7.600s

~/.rbenv 以下にインストールされた openssl はアップグレードされることはないので、依存関係を自分で管理できる人は Homebrew の openssl を使うのが良さそうです。