Compiling Ruby 1.9 for Mac OSX 10.4
This article contains specifics for installing Ruby on PowerPC MacOSX 10.4. Newer Intel Macs with > 10.4 OS has more updated dependencies and probably do not require the instructions described here; you shouldn’t need to compile from source in that case as well - there are one-click installers for binaries for Ruby 1.9 on the Internet, look for it.
On 10.4 PPC, the default version of Ruby is 1.8.2. This version is now old for some of the ruby plugins to be installed, specifically rubygems 1.3.5 in my case. I won’t go into the reasons here on not going for older versions of rubygems (Read here if you are really interested why), but since an upgrade of Ruby is warranted, instead of upgrading to the latest 1.8.x series, it might be worthwhile to try out the new features from the 1.9.x series instead.
In order to recompile ruby, you’ll need
Xcode from Apple.
That will install the SDK for developing on Apple’s MacOS, but more
importantly, it contains the gcc
part of the GNU toolchain required
for compilation.
However the GNU toolchain is incomplete at this stage; we’ll require at
the minimum GNU m4
, autoconf
and automake
to complete the chain of
dependencies Ruby needs.
Not Using Darwin Port/Fink
I’m going to compile these things from source directly without any package management system, and for a good reason; 3rd party MacOS package management systems are usually more trouble than it’s worth, either having longer compilation time from spurious dependencies, compilation breakages due to improperly configured parameters or missing specific compiler flags that you’ll end up having to fix by hand anyway.
That said, don’t be put off by the exercise of compiling from scratch. It is not difficult, and you’ll get to learn a thing or two about the internals of your OS.
Open up your terminal, and sudo
into root
:
Tigershark:~ vince$ sudo -i
Password:
Tigershark:~ root#
In order to separate your newly compiled stuffs from your existing
binaries, I recommend you create a separate directory under the '/'
directory so that they will be cleanly partitioned. I’m using the
directory '/lfs'
in my example here, as a tribute to the Linux from
Scratch project, where I got my
derivative knowledge from. Feel free to choose your own directory names
though.
Tigershark:~ root# export LFS=/lfs
Tigershark:~ root# echo "export PATH=$LFS/bin:$PATH" >> /Users/YOURUSERNAME/.profile
Tigershark:~ root# export PATH=$LFS/bin:$PATH
Tigershark:~ root# mkdir -p $LFS/src
Tigershark:~ root# cd $LFS/src
The code above creates the /lfs
directory, and the '/lfs/src'
directory as well. It also sets up the PATH environment to firstly look
in '/lfs/bin'
before it searches all other paths. This is necessary so
that you’ll be using your new binaries instead of the old system
binaries. The same change is added into your user’s .profile
file so
that Terminal will know to look for the new binaries in the future when
it starts up.
Installing m4
Tigershark:/ root# cd $LFS/src
Tigershark:/lfs/src root# curl http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz > m4-1.4.9.tar.gz
Tigershark:/lfs/src root# tar -zxvf m4-1.4.9.tar.gz
Tigershark:/lfs/src root# cd m4-1.4.9
Tigershark:/lfs/src/m4-1.4.9 root# ./configure --prefix=$LFS
Tigershark:/lfs/src/m4-1.4.9 root# make && make check
Make sure that the test results come up without any errors. When the test results are satisfied, install it.
Tigershark:/lfs/src/m4-1.4.9 root# make install
Installing autoconf
Tigershark:/ root# cd $LFS/src
Tigershark:/lfs/src root# curl http://ftp.gnu.org/gnu/autoconf/autoconf-2.65.tar.gz > autoconf-2.65.tar.gz
Tigershark:/lfs/src root# tar -zxvf autoconf-2.65.tar.gz
Tigershark:/lfs/src root# cd autoconf-2.65
Tigershark:/lfs/src/autoconf-2.65 root# ./configure --prefix=$LFS
Tigershark:/lfs/src/autoconf-2.65 root# make && make check
Make sure that the test results come up without any errors. When the test results are satisfied, install it.
Tigershark:/lfs/src/autoconf-2.65 root# make install
Installing automake
Tigershark:/ root# cd $LFS/src
Tigershark:/lfs/src root# curl http://ftp.gnu.org/gnu/automake/automake-1.9.6 > automake-1.9.6.tar.gz
Tigershark:/lfs/src root# tar -zxvf automake-1.9.6.tar.gz
Tigershark:/lfs/src root# cd automake-1.9.6
Tigershark:/lfs/src/automake-1.9.6 root# ./configure --prefix=$LFS
Tigershark:/lfs/src/automake-1.9.6 root# make && make check
Make sure that the test results come up without any errors. When the test results are satisfied, install it.
Tigershark:/lfs/src/automake-1.9.6 root# make install
Additional Step: Upgrading libreadline
Apple’s implementation of the readline
library has missing symbols in
which Ruby (or more accurately, irb
) requires in order to retrieve
command line history. If you do not use irb
(which I doubt, unless you
never require testing some code you’re uncertain of), you may skip
compiling this. But I recommend you do :)
Tigershark:/ root# cd $LFS/src
Tigershark:/lfs/src root# curl http://ftp.gnu.org/gnu/readline/readline-6.0.tar.gz > readline-6.0.tar.gz
Tigershark:/lfs/src root# tar -zxvf readline-6.0.tar.gz
Tigershark:/lfs/src root# cd readline-6.0
Tigershark:/lfs/src/readline-6.0 root# curl http://ftp.gnu.org/gnu/readline/readline-6.0-patches/readline60-001 > readline60-001
Tigershark:/lfs/src/readline-6.0 root# curl http://ftp.gnu.org/gnu/readline/readline-6.0-patches/readline60-002 > readline60-002
Tigershark:/lfs/src/readline-6.0 root# curl http://ftp.gnu.org/gnu/readline/readline-6.0-patches/readline60-003 > readline60-003
Tigershark:/lfs/src/readline-6.0 root# curl http://ftp.gnu.org/gnu/readline/readline-6.0-patches/readline60-004 > readline60-004
Tigershark:/lfs/src/readline-6.0 root# patch -p0 < readline60-001
Tigershark:/lfs/src/readline-6.0 root# patch -p0 < readline60-002
Tigershark:/lfs/src/readline-6.0 root# patch -p0 < readline60-003
Tigershark:/lfs/src/readline-6.0 root# patch -p0 < readline60-004
Tigershark:/lfs/src/readline-6.0 root# ./configure --libdir=/usr/local/lib
Tigershark:/lfs/src/readline-6.0 root# make && make check
The instructions also contains the additional patches that was released since libreadline 6.0. Make sure you follow those additional instructions to apply the patches correspondingly.
Also, note that the ./configure
parameter has changed. In this case,
we are installing a library, so the path to install to is different. We
are installing it to '/usr/local/lib'
, which will make sure that we
won’t conflict with the original libreadline
in '/usr/lib'
.
Finally, make Ruby!
Tigershark:/ root# cd $LFS/src
Tigershark:/lfs/src root# curl ftp://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.1-p243.tar.gz > ruby-1.9.1-p243.tar.gz
Tigershark:/lfs/src root# tar -zxvf ruby-1.9.1-p243.tar.gz
Tigershark:/lfs/src root# cd ruby-1.9.1-p243
Tigershark:/lfs/src/ruby-1.9.1-p243 root# ./configure --prefix=$LFS LDFLAGS=-L/usr/local/lib
Tigershark:/lfs/src/ruby-1.9.1-p243 root# make && make install
Note the additional parameter 'LDFLAGS=-L/usr/local/lib'
that we pass
to './configure'
. This is required so that when ruby gets compiled,
it’ll first search '/usr/local/lib'
for it’s library dependencies
before looking at its system default paths. Because we have our new
'libreadline'
installed, this makes sure that Ruby is compiled with
our newer library instead of the system one.
Congratulations! Once you’ve reached here, you have your new shiny Ruby 1.9 interpreter to play with! To check:
Tigershark:/ root# which ruby
/lfs/bin/ruby
Tigershark:/ root# ruby --version
ruby 1.9.1p243 (2009-07-16 revision 24175) [powerpc-darwin8.11.0]