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]
2 comments:
Hi Vince
I'm trying to follow these instructions but am getting an error when compiling automake. make check is failing on the subst.test. I'm a newbie when it comes to compiling my own binaries and am not sure how to find out more information so that I can solve the problem.
Any help would be most appreciated!
Michael, when you have succeeded compiling automake, it's usually sufficient, although it gives a better degree of confidence if the tests actually pass.
There are some links that suggest why automake may fail these tests from time to time, but I wouldn't worry about them too much here, since we're only building it incidentally for ruby.
Just skip make check, and do make install directly; fingers crossed, it should allow you to build ruby without a hitch.
Post a Comment