Installing Ruby 1.8.7 on Mac OS X 10.5.3
Yah, this week is all about solving problems. I run into a lot of them, but it gives me something to blog about. But hey, if I can spend 20 minutes writing down a solution to a couple hour problem that I had, then I could save you a few hours too.
Problem
Trying to install Ruby 1.8.7 (or even 1.9) on my Leopard machine produces warning messages on “make” that look like this:
gcc -I. -I../../.ext/include/i686-darwin9.1.0 -I../.././include
-I../.././ext/readline -DRUBY_EXTCONF_H=\"extconf.h\" -fno-common
-g -O2 -pipe -fno-common -o readline.o -c readline.c
readline.c: In function 'filename_completion_proc_call':
readline.c:659: error: 'filename_completion_function' undeclared
(first use in this function)
readline.c:659: error: (Each undeclared identifier is reported only once
readline.c:659: error: for each function it appears in.)
readline.c:659: warning: assignment makes pointer from integer without a
cast
readline.c: In function 'username_completion_proc_call':
readline.c:684: error: 'username_completion_function' undeclared
(first use in this function)
readline.c:684: warning: assignment makes pointer from integer without a
cast
make[1]: *** [readline.o] Error 1
make: *** [all] Error 1
Solution
I originally came across this problem right around new years and eventually found a solution thanks to Han Kessels on the Ruby Forums. It involved the following steps:
- Download the newest version of readline (version 5.2 at the time of writing) at GNU.org. You may have to apply the following patch. Thanks to Michael Biven for showing a nice simple way to do this from the command line:
$ curl -O ftp://ftp.gnu.org/gnu/readline/readline-5.2.tar.gz $ tar xzvf readline-5.2.tar.gz $ cd readline-5.2 $ curl -O http://ftp.gnu.org/gnu/readline/readline-5.2-patches/readline52-012 $ patch -p0 < readline52-012 $ ./configure --prefix=/usr/local $ make $ sudo make install $ cd .. - Now you can download the 1.8.7 version of ruby, and install it but you should point to the version of readline that you just installed (to /usr/local) like so:
$ curl -O ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.gz $ tar xzvf ruby-1.8.7.tar.gz $ cd ruby-1.8.7 $ ./configure --prefix=/usr/local/ruby1.8.7 --with-readline-dir=/usr/local $ make $ sudo make install $ cd /usr/local/ruby1.8.7/bin $ ./ruby -v ruby 1.8.7 (2008-05-31 patchlevel 0) [i686-darwin9.3.0]
The End Result
If you followed my terminal commands from above you should have a working Ruby 1.8.7 version installed in your “/usr/local/ruby1.8.7/bin”. If you wanted ruby in a different directory then change the “–prefix=/usr/local/ruby1.8.7″ option on ./configure to instead point to the directory you wanted it.
Why put it in its own directory at all? Well, I happen to have multiple version of ruby. By default I have 1.8.6, I have this version of 1.8.7, I even have a 1.9 version I installed a while ago. Its easy to remember where each is if the directory they reside in clearly states the name. This way I can test a script, maybe even run benchmarks, in each version of ruby. However, you might not want to take this extra measure.

