matz / netlab.co.jp (Yukihiro Matsumoto) writes:

> Hi,
> 
> In message "[ruby-talk:02770]"
>     on 00/05/11, Andrew Hunt <Andy / Toolshed.Com> writes:
> 
> |I'm trying to install mod_ruby 0.17 with the latest Ruby from CVS,
> |and I'm running into a spot of trouble.
> |
> |Using the Makefile produced by Makefile.rb, the module fails to load --
> |it complains that:
> |
> |Cannot load /toolshed/local/libexec/mod_ruby.so into server: 
> |/toolshed/local/libexec/mod_ruby.so: undefined symbol: rb_io_close
> |/toolshed/local/bin/apachectl start: httpd could not be started
> |
> |And indeed, there's nothing in the Makefile that indicates Ruby should 
> |be linked in.  So I thought I'd be daring and add libruby.a into the 
> |shared obejct link.
> 
> Hmm, Makefile.RB should find the place for libruby.a or libruby.so
> from compilation information, which is placed in rbconfig.rb.
> 
> My Makefile contains the line:
> 
>   LIBRUBYARG = -L/usr/lib -lruby
> 
> to link the interpreter.

Well, I finally tracked it down. I feel kind of silly not to find it
earlier, but at the same it, it _is_ a bug, either in mkmf or in
mod_ruby's Makefile.RB.

We were all on the right track earlier when we were looking at
libraries. However, the problem turned to to be subtle.

When you run 'ruby Makefile.RB' in the mod_ruby directory, you get
a Makefile that contains:

     RUBY_INSTALL_NAME = ruby
     LIBRUBYARG = $(LIBRUBY_A)     <<<<<<<<< bug<<<<<<<<<<<<<<
     OBJS = mod_ruby.o ruby_config.o apachelib.o eruby.o
     TARGET = mod_ruby.so

The link line has

$(TARGET): $(OBJS)
      $(LDSHARED) $(DLDFLAGS) $(XLDFLAGS) -o $(TARGET) $(OBJS) $(LIBRUBYARG)...

LIBRUBYARG is empty, but the link doesn't care, because it assumes it
will resolve things when the .so is loaded.


Now the part I don't understand. When we initially had all these
problems, we tried building Ruby with --enable-shared. This left a
libruby.so lying around. When mod_ruby loaded, it linked into this
libruby.so, and things failed--it seems to go wrong whenever the Ruby
script tried to do output.

Any, today I did two things:

1. I did a 'find / -name libruby.so -exec rm {}\;'

2. I manually edited the Makefile in mod_ruby to include

   LIBRUBYARG = -L /tc/usr/lib/ruby/1.5/i686-linux -lruby

make, make install, and it all ran first time!


So, there seem to be two problems:

1. mod_ruby's Makefile has ($LIBRUBY_A) in it, rather than the -L -l

2. mod_ruby doesn't seem to work with a shared libruby.so (it could
   well be that _nothing_ works with libruby.so on my box)


Does this all make sense?


Dave