akishin999の日記

調べた事などを書いて行きます。

Ubuntu に rbenv で Ruby 1.8.6 系をインストールしようとしたらハマった

タイトル通りですが、ちょっと古いコードの検証環境が欲しかったので、開発環境として使用している Ubuntu に rbenv で Ruby の 1.8.6 系をインストールしようとしたところ、予想外にハマって時間を取られたのでまとめておきます。

環境は Ubuntu 12.10(32bit)、rbenv 0.4.0-37-g7a10b64 で、 Ruby 1.9Ruby 2.0 が導入済みでした。

まずは普通にインストールを試してみます。

% rbenv install 1.8.6-p383
Downloading ruby-1.8.6-p383.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/4f49544d4a4d0d34e9d86c41e853db2e
Installing ruby-1.8.6-p383...

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20130406180919.22628
Results logged to /tmp/ruby-build.20130406180919.22628.log

Last 10 log lines:
rbconfig.rb updated
compiling Win32API
compiling bigdecimal
make[1]: ディレクトリ `/tmp/ruby-build.20130406180919.22628/ruby-1.8.6-p383/ext/bigdecimal' に入ります
mkdir -p ../../.ext/i686-linux
/usr/bin/gcc -I. -I../.. -I../../. -I../.././ext/bigdecimal -DBASE=10000UL -DBASE_FIG=4 -I'/home/akishin/.rbenv/versions/1.8.6-p383/include'  -D_FILE_OFFSET_BITS=64 -fPIC    -c bigdecimal.c
make[1]: *** ジョブのパイプの read: そのようなファイルやディレクトリはありません.  中止.
make[1]: *** 未完了のジョブを待っています....
make[1]: ディレクトリ `/tmp/ruby-build.20130406180919.22628/ruby-1.8.6-p383/ext/bigdecimal' から出ます
make: *** [all] エラー 1

bigdecimal.c のコンパイルのところで何かエラーが発生してしまっているようです。
調べてみると以下のような情報を発見。

Twitter / dayflower: rbenv(ruby-build)で1.8.6いれようとした ...
https://twitter.com/dayflower/status/192066012634546177

1.8.6-p420 build failed on Ubuntu 10.4 Lucid Lynx Issue #88 sstephenson/ruby-build
https://github.com/sstephenson/ruby-build/issues/88

どうやら ruby-build が make 時に指定しているオプションが宜しくないということのようです。
なので書かれていた通り、オプションを上書きするための環境変数 MAKEOPTS を指定して以下のように再度実行します。

% MAKEOPTS="" rbenv install 1.8.6-p383
Downloading ruby-1.8.6-p383.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/4f49544d4a4d0d34e9d86c41e853db2e
Installing ruby-1.8.6-p383...

BUILD FAILED

Inspect or clean up the working tree at /tmp/ruby-build.20130406184625.24590
Results logged to /tmp/ruby-build.20130406184625.24590.log

Last 10 log lines:
ossl.h:120:7: 備考: expected ‘struct stack_st_X509 *’ but argument is of type ‘int *’
ossl_pkcs7.c: 関数 ‘ossl_pkcs7_set_crls’ 内:
ossl_pkcs7.c:624:10: 警告: 互換性のないポインタ型からの代入です [デフォルトで有効]
ossl_pkcs7.c: 関数 ‘ossl_pkcs7_get_crls’ 内:
ossl_pkcs7.c:634:5: 警告: 互換性のないポインタ型から 1 番目の ‘ossl_x509crl_sk2ary’ の引数に渡しています [デフォルトで有効]
In file included from ossl_pkcs7.c:11:0:
ossl.h:121:7: 備考: expected ‘struct stack_st_X509_CRL *’ but argument is of type ‘int *’
make[1]: *** [ossl_pkcs7.o] エラー 1
make[1]: ディレクトリ `/tmp/ruby-build.20130406184625.24590/ruby-1.8.6-p383/ext/openssl' から出ます
make: *** [all] エラー 1

内容は変わりましたが、またしてもエラー。
今度はどうやら OpenSSL 絡みのようです。

Ubuntu 12.10 に入っていた OpenSSL のバージョンを確認してみると以下のような結果となりました。

% openssl version
OpenSSL 1.0.1c 10 May 2012

もしかすると OpenSSL が新しすぎるのかも知れません。
という事で、取りあえず古いバージョンを入れてみる事に。
公式サイトから 0.9.8 系のソースコードを取得して /usr/local にインストール。

% sudo -s
# cd /usr/local/src
# wget http://www.openssl.org/source/openssl-0.9.8y.tar.gz
# tar xzf openssl-0.9.8y.tar.gz
# cd openssl-0.9.8y
# ./config --prefix=/usr/local
# make
# paco -D make install

今インストールした方のバージョンを確認してみます。

# /usr/local/bin/openssl version
OpenSSL 0.9.8y 5 Feb 2013

無事に 0.9.8 系がインストールされました。

改めて、--with-openssl-dir オプションで先ほどインストールした openssl を指定してインストールを試みてみます。

# CONFIGURE_OPTS="--with-openssl-dir=/usr/local" MAKEOPTS="" rbenv install 1.8.6-p383
Downloading ruby-1.8.6-p383.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/4f49544d4a4d0d34e9d86c41e853db2e
Installing ruby-1.8.6-p383...
Installed ruby-1.8.6-p383 to /home/akishin/.rbenv/versions/1.8.6-p383

Downloading rubygems-1.3.7.tar.gz...
-> http://dqw8nmjcqpjn7.cloudfront.net/e85cfadd025ff6ab689375adbf344bbe
Installing rubygems-1.3.7...
Installed rubygems-1.3.7 to /home/akishin/.rbenv/versions/1.8.6-p383

今度は無事にインストールされました!

念のためバージョンを確認してみます。

% rbenv versions
1.8.6-p383
% rbenv global 1.8.6-p383
% ruby -v
ruby 1.8.6 (2009-08-04 patchlevel 383) [i686-linux]
% gem -v
1.3.7

問題なさそうですね。

Ruby ももう 2.0 がリリースされたので、さすがに 1.8.6 で新たにコードを書く機会はないとは思います。
が、今回のように古いコードのメンテなどの為にたまに必要になったりすることもあると思うので、もし同じようにハマった方がいたら参考にしてみて下さい。

若干時間はかかりましたが、なんとか rbenv で入ってくれたので良かったです。