Building and installing Ruby 1.8.6 on Mac OS X TigerEdit

Build

wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.6.tar.bz2
md5 ruby-1.8.6.tar.bz2
tar xjf ruby-1.8.6.tar.bz2
cd ruby-1.8.6
./configure --enable-install-doc --with-readline-dir=/usr/local --enable-pthread
make
make test
sudo make install
make check

I had hoped that the readline workaround needed in the last update (see "Building and installing Ruby 1.8.5 on Mac OS X Tiger") would no longer be required in this version, but it appears that it is because Ruby crashes during the make check phase unless you pass the --with-readline-dir=/usr/local switch to configure:

dyld: NSLinkModule() error
dyld: Symbol not found: _rl_filename_completion_function
  Referenced from: /Users/wincent/trabajo/unversioned/ruby/ruby-1.8.6/.ext/i686-darwin8.8.1/readline.bundle
  Expected in: flat namespace

make: *** [test-all] Trace/BPT trap

Likewise, unless you pass the --enable-pthread you’ll get this warning during the make:

*****************************************************************************
**
** PTHREAD SUPPORT MODE ERROR:
**
**   Ruby is not compiled with --enable-pthread, but your Tcl/Tk
**   library seems to be compiled with pthread support. This
**   combination may cause frequent hang or segmentation fault
**   errors when Ruby/Tk is working. We recommend that you NEVER
**   create the library with such a combination of pthread support.
**
**   Please recompile Ruby with the "--enable-pthread" configure option
**   or recompile Tcl/Tk with the "--disable-threads" configure option.
**
*****************************************************************************

Nor is it necessary to separately install the documentation when passing the --enable-install-doc switch to configure.

Updating FastRI index

On trying to update the FastRI index:

fastri-server -b

I found the following error:

/usr/local/lib/ruby/1.8/i686-darwin8.7.1/rbconfig.rb:7: ruby lib version (1.8.5) doesn't match executable version (1.8.6) (RuntimeError)
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:10:in `require'
        from /usr/local/lib/ruby/site_ruby/1.8/rubygems.rb:10
        from /usr/local/bin/fastri-server:9:in `require'
        from /usr/local/bin/fastri-server:9

Similar errors were printed when trying things like gem list --local or rake spec.

At the top of /usr/local/lib/ruby/1.8/i686-darwin8.7.1/rbconfig.rb we find:

module Config
  RUBY_VERSION == "1.8.5" or
    raise "ruby lib version (1.8.5) doesn't match executable version (#{RUBY_VERSION})"

And although the make output included this:

rbconfig.rb updated

The modification date on /usr/local/lib/ruby/1.8/i686-darwin8.7.1/rbconfig.rb shows that the installed copy wasn’t touched:

-rw-r--r--   1 root  wheel  - 6253 Sep 23 17:40 /usr/local/lib/ruby/1.8/i686-darwin8.7.1/rbconfig.rb

A quick check to see if the file was installed somewhere else:

# have to use "find" for this
find / -name rbconfig.rb

# "locate" would be quicker, but its database is updated only once per week
locate rbconfig.rb

# Spotlight would be quick and up-to-date, but directories like /usr are not indexed
mdfind "kMDItemFSName = 'rbconfig.rb'"

Here are the relevant entries:

/usr/lib/ruby/1.8/universal-darwin8.0/rbconfig.rb
/usr/local/lib/ruby/1.8/i686-darwin8.7.1/rbconfig.rb
/usr/local/lib/ruby/1.8/i686-darwin8.8.1/rbconfig.rb

Sure enough, the file at /usr/local/lib/ruby/1.8/i686-darwin8.8.1/rbconfig.rb corresponds to Ruby 1.8.6. So it appears that all installed gems are looking in the wrong directory for rbconfig.rb.

I tried downloading RubyGems and reinstalling it:

wget http://rubyforge.org/frs/download.php/17190/rubygems-0.9.2.tgz
tar xzf rubygems-0.9.2.tgz
cd rubygems-0.9.2
sudo ruby setup.rb

But this yielded:

/usr/local/lib/ruby/1.8/i686-darwin8.7.1/rbconfig.rb:7: ruby lib version (1.8.5) doesn't match executable version (1.8.6) (RuntimeError)
        from setup.rb:52:in `require'
        from setup.rb:52

The culprit was evidently in my ~/.bash_profile:

RUBYLIB="/usr/local/lib/ruby/site_ruby/1.8:/usr/local/lib/ruby/site_ruby/1.8/i686-darwin8.7.1:/usr/local/lib/ruby/1.8:/usr/local/lib
/ruby/1.8/i686-darwin8.7.1"
export RUBYLIB

I temporarily overrode this:

export RUBYLIB="/usr/local/lib/ruby/site_ruby/1.8:/usr/local/lib/ruby/site_ruby/1.8/i686-darwin8.8.1:/usr/local/lib/ruby/1.8:/usr/local/lib/ruby/1.8/i686-darwin8.8.1"

And found that things were working again:

fastri-server -b
gem list --local

The ~/.bash_profile stuff was something I’d put in when I first starting playing with Rails and Ruby, knowing absolutely nothing about either (see "Installing Ruby on Rails 1.1.4 on Mac OS X Tiger"). Even unsetting RUBYLIB entirely is fine:

unset RUBYLIB

Evidently, the newly built Ruby 1.8.6 already knows in which directories it should look for library files; witness the output of ruby -e "puts $:" after performing the unset:

/usr/local/lib/ruby/site_ruby/1.8
/usr/local/lib/ruby/site_ruby/1.8/i686-darwin8.8.1
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/1.8
/usr/local/lib/ruby/1.8/i686-darwin8.8.1
.

Updating installed gems

sudo gem update

Of my installed gems, only sqlite3-ruby needed to be updated.

See also