Ubuntu 22.10 に rbenv を使わずに Ruby をインストールする

Ruby 3.1.3 / 3.0.5 / 2.7.7 が出たので普段使いの Ubuntu 22.10 にインストールした。 rbenv とかを使えばいいんだけど、自分は普段から rbenv は使ってないので。

Ruby 3.1.3

特別なことは何もしていない。

% tar xf ruby-3.1.3.tar.xz
% cd ruby-3.1.3
% ./configure --prefix=$HOME/ruby31 --with-ext=openssl,zlib,psych,dbm,gdbm,+
% make -j
% make install

Ruby 3.0.5

OpenSSL 3.0 に対応してないので openssl ライブラリはコンパイルできない。

% tar xf ruby-3.0.5.tar.xz
% cd ruby-3.0.5
% ./configure --prefix=$HOME/ruby30 --with-ext=openssl,zlib,psych,dbm,gdbm,+
% make -j
...
*** Following extensions are not compiled:
openssl:
        Could not be configured. It will not be installed.
        /tmp/ruby-3.0.5/ext/openssl/extconf.rb:113: OpenSSL >= 1.0.1, < 3.0.0 or LibreSSL >= 2.5.0 is required
        Check ext/openssl/mkmf.log for more details.
*** Fix the problems, then remove these directories and try again if you want.
make[1]: *** [exts.mk:2234: note] エラー 1
make[1]: ディレクトリ '/tmp/ruby-3.0.5' から出ます
make: *** [uncommon.mk:301: build-ext] エラー 2

一旦 --with-ext から openssl を外してインストールする。

% ./configure --prefix=$HOME/ruby30 --with-ext=zlib,psych,dbm,gdbm,+
% make -j
% make install

最新の openssl gem は OpenSSL 3.0 に対応しているので、それをインストールする。 ただし https://rubygems.org に接続するのに openssl ライブラリが必要なので gem install openssl ではインストールできない。

% ~/ruby30/bin/gem install openssl
ERROR:  While executing gem ... (Gem::Exception)
    OpenSSL is not available. Install OpenSSL and rebuild Ruby (preferred) or use non-HTTPS sources

なので wget や curl で openssl gem をダウンロードする。

% wget -q https://rubygems.org/downloads/openssl-3.0.1.gem
% curl -s https://rubygems.org/downloads/openssl-3.0.1.gem --output openssl-3.0.1.gem

その後ファイルを指定して gem install すればOK。

% ~/ruby30/bin/gem install openssl-3.0.1.gem
Building native extensions. This could take a while...
Successfully installed openssl-3.0.1
Parsing documentation for openssl-3.0.1
Installing ri documentation for openssl-3.0.1
Done installing documentation for openssl after 0 seconds
1 gem installed

Ruby 2.7.7

Ruby 3.0 と同じように openssl をビルドしないようにしてインストールしてみると make install でエラーになる。

% tar xf ruby-2.7.7.tar.xz
% cd ruby-2.7.7
% ./configure --prefix=$HOME/ruby27 --with-ext=zlib,psych,dbm,gdbm,+
% make -j
% make install
...
/tmp/ruby-2.7.7/lib/rubygems/core_ext/kernel_require.rb:83:in `require': cannot load such file -- openssl (LoadError)
make: *** [uncommon.mk:373: do-install-all] エラー 1

ちょっと強引かもしれないけど、ビルド前に ext/openssl を openssl gem に置き換えたらできた。 ext/digest が openssl に依存してるみたいなので一緒に置き換えておく。

% curl -s https://rubygems.org/downloads/openssl-3.0.1.gem --output openssl-3.0.1.gem
% curl -s https://rubygems.org/downloads/digest-3.1.0.gem --output digest-3.1.0.gem
% gem unpack openssl-3.0.1.gem
% gem unpack digest-3.1.0.gem
% tar xf ruby-2.7.7.tar.xz
% cd ruby-2.7.7
% rm -rf ext/openssl ext/digest
% rsync -a ../openssl-3.0.1/ext/openssl ./ext/
% rsync -a ../openssl-3.0.1/lib ./ext/openssl/
% rsync -a ../digest-3.1.0/ext/digest ./ext/
% rsync -a ../digest-3.1.0/lib ./ext/digest/
% ./configure --prefix=$HOME/ruby27 --with-ext=openssl,zlib,psych,dbm,gdbm,+
% make -j
% make install

ちなみに rbenv は openssl-1.1.1s をインストールしてそれを使ってビルドしてるっぽい。 まあ普通は rbenv を使うのがいいと思う。