Ubuntu 16.04 に Ruby 1.8.5 をインストールする

年末なので Ubuntu 16.04 に Ruby 1.8.5 をインストールして動かしてみます。

## 必要なライブラリをインストールする

Ruby 1.8.5 をビルドするにあたって必要となるライブラリをインストールします。
ここで一つ問題になるのが、OpenSSL0.9.8を要求される点です。
OpenSSL1.0系ではビルドに失敗します。

OpenSSL0.9.8をインストールするために古いリポジトリを使います。

    $ echo 'deb http://old-releases.ubuntu.com/ubuntu lucid-security main' | sudo tee /etc/apt/sources.list.d/lucid-security.list
    $ sudo apt-get update

準備ができたのでインストールします。

    $ sudo apt-get install zlib1g-dev
    $ sudo apt-get install -t lucid-security libssl-dev

その他必要となるライブラリをインストールします。

    $ sudo apt-get install build-essential libyaml-dev libxml2-dev libxslt1-dev libreadline-dev

## ruby-build をインストールする

この辺は公式のドキュメントそのままです。
https://github.com/rbenv/ruby-build#installing-as-a-standalone-program-advanced

    $ git clone https://github.com/rbenv/ruby-build.git
    $ cd ruby-build
    $ sudo ./install.sh

## Ruby 1.8.5 をインストールする

さて ruby-build には ruby 1.8.5 の definition がいくつか用意されていますが、これはそのままでは使えません。
※ わかってるなら Pull-Request しろという話ですがすいませんとりあえずそのまま進みます。

以下は Ruby 1.8.5-p231 をインストールした際のログです。

```
$ ruby-build 1.8.5-p231 ~/ruby-1.8.5
Downloading ruby-1.8.5-p231.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2
Installing ruby-1.8.5-p231...

WARNING: ruby-1.8.5-p231 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

Installed ruby-1.8.5-p231 to /home/yono/ruby-1.8.5

Downloading rubygems-1.3.7.tgz...
-> https://dqw8nmjcqpjn7.cloudfront.net/388b90ae6273f655507b10c8ba6bee9ea72e7d49c3e610025531cb8c3ba67c9d
Installing rubygems-1.3.7...

BUILD FAILED (Ubuntu 16.04 using ruby-build 20160913)

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

Last 10 log lines:
Last-Modified: Fri, 23 May 2014 08:48:13 GMT
ETag: "e85cfadd025ff6ab689375adbf344bbe"
Accept-Ranges: bytes
Server: AmazonS3
X-Cache: Miss from cloudfront
Via: 1.1 96275b125ac8a1ca0365ff6f864de90c.cloudfront.net (CloudFront)
X-Amz-Cf-Id: vCBUe9FY2sEYl9REEnO8B3qa17peFB7nYlqidlOnoNr37jn7rCdMHQ==

/tmp/ruby-build.20161104233606.31970/rubygems-1.3.7 /tmp/ruby-build.20161104233606.31970 ~
ERROR:  Expected Ruby version >= 1.8.6, is 1.8.5.231
```

rubygems のインストールに失敗しています。何故かと言うと、インストールしようとしている rubygems 1.3.7 が Ruby 1.8.6 以上を要求しているからです。

https://github.com/rubygems/rubygems/blob/v1.3.7/lib/rubygems/commands/setup_command.rb#L59-L64

```ruby
    required_version = Gem::Requirement.new '>= 1.8.6'

    unless required_version.satisfied_by? Gem.ruby_version then
      alert_error "Expected Ruby version #{required_version}, is #{Gem.ruby_version}"
      terminate_interaction 1
    end
```

rubygems 1.3.7 未満で Ruby 1.8.6 以上を要求しないバージョンを探してみると、rubygems 1.3.5 が該当しました。
ruby-build には Custom Definition という仕組みがあるのでそれを使って rubygems 1.3.5 をインストールするように変更してみましょう。
https://github.com/rbenv/ruby-build#custom-definitions

叩き台となる Ruby 1.8.5-p231 の definition を手元にコピーします。

    $ cp ruby-build/share/ruby-build/1.8.5-p231 .

中身は以下のようになっています。

    $ cat 1.8.5-p231
    require_gcc
    install_package "ruby-1.8.5-p231" "https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2#b31a8db0a3b538c28bca1c9b08a07eb55a39547fdaad00c045f073851019639c" warn_eol auto_tcltk standard
    install_package "rubygems-1.3.7" "https://rubygems.org/rubygems/rubygems-1.3.7.tgz#388b90ae6273f655507b10c8ba6bee9ea72e7d49c3e610025531cb8c3ba67c9d" ruby

なんとなく3行目の `rubygems-1.3.7` を `rubygems-1.3.5` に変えるとよさそうです。末尾にハッシュ値が付いてるのでそれも記載する必要があります。

    $ wget https://rubygems.org/rubygems/rubygems-1.3.5.tgz
    $ sha256sum rubygems-1.3.5.tgz
    c0928cc1ae54dedfb5f57ad3829882c1f90e42bc17bf50491aa6f93a937546ac  rubygems-1.3.5.tgz

これを元にして `1.8.5-p231` を修正します。

    $ cat 1.8.5-p231
    require_gcc
    install_package "ruby-1.8.5-p231" "https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2#b31a8db0a3b538c28bca1c9b08a07eb55a39547fdaad00c045f073851019639c" warn_eol auto_tcltk standard
    install_package "rubygems-1.3.5" "https://rubygems.org/rubygems/rubygems-1.3.5.tgz#c0928cc1ae54dedfb5f57ad3829882c1f90e42bc17bf50491aa6f93a937546ac" ruby

修正した `1.8.5-p231` を使って Ruby 1.8.5 をインストールします。 `ruby-build` の引数にファイルを指定すると、そのファイルの記述を元にしてインストールが進みます。

    $ ruby-build ./1.8.5-p231 ~/ruby-1.8.5

ですがこのままだとエラーが出ます。

```
Downloading ruby-1.8.5-p231.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2
Installing ruby-1.8.5-p231...

WARNING: ruby-1.8.5-p231 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.


BUILD FAILED (Ubuntu 16.04 using ruby-build 20160913)

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

Last 10 log lines:
                 from ossl.h:45,
                 from ossl_cipher.c:11:
/usr/include/openssl/bn.h:412:5: note: previous declaration of ‘BN_pseudo_rand_range’ was here
 int BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
     ^
Makefile:176: ターゲット 'ossl_cipher.o' のレシピで失敗しました
make[1]: *** [ossl_cipher.o] エラー 1
make[1]: ディレクトリ '/tmp/ruby-build.20161115225857.13675/ruby-1.8.5-p231/ext/openssl' から出ます
Makefile:241: ターゲット 'all' のレシピで失敗しました
make: *** [all] エラー 1
```

半ば強引ですが openssl のヘッダファイルに手を加えます。
`/usr/include/openssl/bn.h` の411行目と412行目をコメントアウトします。

```
$ diff /usr/include/openssl/bn.h ./bn.h 
411,412c411,412
< int	BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
< int	BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
---
> //int	BN_rand_range(BIGNUM *rnd, const BIGNUM *range);
> //int	BN_pseudo_rand_range(BIGNUM *rnd, const BIGNUM *range);
```

これでビルドが通るようになりました。

```
$ ruby-build ./1.8.5-p231 ~/ruby-1.8.5
Downloading ruby-1.8.5-p231.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/1.8/ruby-1.8.5-p231.tar.bz2
Installing ruby-1.8.5-p231...

WARNING: ruby-1.8.5-p231 is past its end of life and is now unsupported.
It no longer receives bug fixes or critical security updates.

Installed ruby-1.8.5-p231 to /home/yono/ruby-1.8.5

Downloading rubygems-1.3.5.tgz...
-> https://rubygems.org/rubygems/rubygems-1.3.5.tgz
Installing rubygems-1.3.5...
Installed rubygems-1.3.5 to /home/yono/ruby-1.8.5
```

試しに動かしてみます。

```
$ ./ruby-1.8.5/bin/ruby -v
ruby 1.8.5 (2008-06-20 patchlevel 231) [x86_64-linux]
```

はい。

```
$ ./ruby-1.8.5/bin/irb
irb(main):001:0> newstyle_hash = {key: 'value'}
SyntaxError: compile error
(irb):1: odd number list for Hash
newstyle_hash = {key: 'value'}
                     ^
(irb):1: syntax error, unexpected ':', expecting '}'
newstyle_hash = {key: 'value'}
                     ^
(irb):1: syntax error, unexpected '}', expecting $end
	from (irb):1
	from :0
```

そうですね。

```
irb(main):002:0> oldstyle_hash = {:key => 'value'}
=> {:key=>"value"}
```

よっしゃ。

```
$ ./ruby-1.8.5/bin/gem source --list
*** CURRENT SOURCES ***

http://gems.rubyforge.org/
```

アッ。

```
$ ./ruby-1.8.5/bin/gem source --add https://rubygems.org/
https://rubygems.org/ added to sources
$ ./ruby-1.8.5/bin/gem source --remove http://gems.rubyforge.org/
http://gems.rubyforge.org/ removed from sources
```

ハイ。

```
$ ./ruby-1.8.5/bin/gem install -r rake -v 0.8.0
Successfully installed rake-0.8.0
1 gem installed
Installing ri documentation for rake-0.8.0...
Installing RDoc documentation for rake-0.8.0...

$ ./ruby-1.8.5/bin/gem install -r rails -v 1.2.6
Successfully installed activesupport-1.4.4
Successfully installed activerecord-1.15.6
Successfully installed actionpack-1.13.6
Successfully installed actionmailer-1.3.6
Successfully installed actionwebservice-1.2.6
Successfully installed rails-1.2.6
6 gems installed
Installing ri documentation for activesupport-1.4.4...
Installing ri documentation for activerecord-1.15.6...
Installing ri documentation for actionpack-1.13.6...
Installing ri documentation for actionmailer-1.3.6...
Installing ri documentation for actionwebservice-1.2.6...
Installing ri documentation for rails-1.2.6...
Installing RDoc documentation for activesupport-1.4.4...
Installing RDoc documentation for activerecord-1.15.6...
Installing RDoc documentation for actionpack-1.13.6...
Installing RDoc documentation for actionmailer-1.3.6...
Installing RDoc documentation for actionwebservice-1.2.6...
Installing RDoc documentation for rails-1.2.6...
```

こうして。

```
$ ./ruby-1.8.5/bin/rails blog
      create  
      create  app/controllers
      create  app/helpers
      create  app/models
      create  app/views/layouts
      create  config/environments
      create  components
      create  db
      create  doc
      create  lib
      create  lib/tasks
      create  log
      create  public/images
      create  public/javascripts
      create  public/stylesheets
      create  script/performance
      create  script/process
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/mocks/development
      create  test/mocks/test
      create  test/unit
      create  vendor
      create  vendor/plugins
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  Rakefile
      create  README
      create  app/controllers/application.rb
      create  app/helpers/application_helper.rb
      create  test/test_helper.rb
      create  config/database.yml
      create  config/routes.rb
      create  public/.htaccess
      create  config/boot.rb
      create  config/environment.rb
      create  config/environments/production.rb
      create  config/environments/development.rb
      create  config/environments/test.rb
      create  script/about
      create  script/breakpointer
      create  script/console
      create  script/destroy
      create  script/generate
      create  script/performance/benchmarker
      create  script/performance/profiler
      create  script/process/reaper
      create  script/process/spawner
      create  script/process/inspector
      create  script/runner
      create  script/server
      create  script/plugin
      create  public/dispatch.rb
      create  public/dispatch.cgi
      create  public/dispatch.fcgi
      create  public/404.html
      create  public/500.html
      create  public/index.html
      create  public/favicon.ico
      create  public/robots.txt
      create  public/images/rails.png
      create  public/javascripts/prototype.js
      create  public/javascripts/effects.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/controls.js
      create  public/javascripts/application.js
      create  doc/README_FOR_APP
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
```

こうじゃ。

長くなりそうなのでここまでにします。
こちらからは以上です。