B
Brian Candler
I've got a compilation issue.
If I set --libdir when compiling ruby-1.8.2, I find that ruby installs its
standard libraries in one place, but at runtime it looks for them in the
wrong place.
To demonstrate, let me build ruby like this:
# mkdir /opt /opt/lib /opt/include
...
$ ./configure --prefix=/opt/ruby --libdir=/opt/lib \
--with-cppflags=-I/opt/include --with-ldflags=-L/opt/lib
$ make
$ sudo make install
[the reason is to keep ruby together with the external libraries I need to
link it against]
Now, if I do this, I find that Ruby's libraries are installed here:
/opt/lib/ruby/1.8 # .rb files
/opt/lib/ruby/1.8/i386-freebsd5.3 # .so files
But the Ruby binary is searching for them elsewhere:
$ /opt/ruby/bin/ruby -e 'p $:'
["/opt/ruby/lib/ruby/site_ruby/1.8",
"/opt/ruby/lib/ruby/site_ruby/1.8/i386-freebsd5.3",
"/opt/ruby/lib/ruby/site_ruby",
"/opt/ruby/lib/ruby/1.8", # <<<< NOTE
"/opt/ruby/lib/ruby/1.8/i386-freebsd5.3", # <<<< NOTE
"."]
As a result, none of the ruby system libraries can be found:
$ /opt/ruby/bin/irb
/opt/ruby/bin/irb:10:in `require': No such file to load -- irb (LoadError)
from /opt/ruby/bin/irb:10
Now, I would have thought that setting --libdir would automatically update
rubylibdir and archdir, and in fact it has done so:
$ /opt/ruby/bin/ruby -rrbconfig -e 'p Config::CONFIG["rubylibdir"]'
"/opt/lib/ruby/1.8"
$ /opt/ruby/bin/ruby -rrbconfig -e 'p Config::CONFIG["archdir"]'
"/opt/lib/ruby/1.8/i386-freebsd5.3"
So, why is $: not set to the correct value? It seems that it the wrong value
exists in config.h:
$ grep RUBY_LIB *
config.h:#define RUBY_LIB "/opt/ruby/lib/ruby/1.8"
but it's not clear to me why that should be, since it's created from within
the ./configure script, which ought to have access to the --libdir
parameter. As far as I can tell it's an oversight, because RUBY_LIB_PREFIX
is derived directly from ${prefix}, not from ${libdir}.
Now, I'd be happy to work around this by setting rubylibdir to
/opt/ruby/lib/ruby/1.8
so that the library files are installed in the place where $: expects to
find them; however I can't see how to do this.
./configure --rubylibdir=/opt/ruby/lib/ruby/1.8 # gives an error
./configure --with-rubylibdir=/opt/ruby/lib/ruby/1.8 # has no effect
So I'm a bit stumped now. To summarise:
(1) "./configure --libdir=/foo" correctly updates rubylibdir so that
the .rb/.so files are installed there, but does not update RUBY_LIB
in config.h, so $: has the wrong path to those files.
And:
(2) I can't see a way from the ./configure line to set
CONFIG["rubylibdir"] independently of --libdir
Any suggestions for how I can work around this? Unfortunately, I do really
want to specify --prefix and --libdir separately for my particular file
layout.
Thanks,
Brian.
If I set --libdir when compiling ruby-1.8.2, I find that ruby installs its
standard libraries in one place, but at runtime it looks for them in the
wrong place.
To demonstrate, let me build ruby like this:
# mkdir /opt /opt/lib /opt/include
...
$ ./configure --prefix=/opt/ruby --libdir=/opt/lib \
--with-cppflags=-I/opt/include --with-ldflags=-L/opt/lib
$ make
$ sudo make install
[the reason is to keep ruby together with the external libraries I need to
link it against]
Now, if I do this, I find that Ruby's libraries are installed here:
/opt/lib/ruby/1.8 # .rb files
/opt/lib/ruby/1.8/i386-freebsd5.3 # .so files
But the Ruby binary is searching for them elsewhere:
$ /opt/ruby/bin/ruby -e 'p $:'
["/opt/ruby/lib/ruby/site_ruby/1.8",
"/opt/ruby/lib/ruby/site_ruby/1.8/i386-freebsd5.3",
"/opt/ruby/lib/ruby/site_ruby",
"/opt/ruby/lib/ruby/1.8", # <<<< NOTE
"/opt/ruby/lib/ruby/1.8/i386-freebsd5.3", # <<<< NOTE
"."]
As a result, none of the ruby system libraries can be found:
$ /opt/ruby/bin/irb
/opt/ruby/bin/irb:10:in `require': No such file to load -- irb (LoadError)
from /opt/ruby/bin/irb:10
Now, I would have thought that setting --libdir would automatically update
rubylibdir and archdir, and in fact it has done so:
$ /opt/ruby/bin/ruby -rrbconfig -e 'p Config::CONFIG["rubylibdir"]'
"/opt/lib/ruby/1.8"
$ /opt/ruby/bin/ruby -rrbconfig -e 'p Config::CONFIG["archdir"]'
"/opt/lib/ruby/1.8/i386-freebsd5.3"
So, why is $: not set to the correct value? It seems that it the wrong value
exists in config.h:
$ grep RUBY_LIB *
config.h:#define RUBY_LIB "/opt/ruby/lib/ruby/1.8"
but it's not clear to me why that should be, since it's created from within
the ./configure script, which ought to have access to the --libdir
parameter. As far as I can tell it's an oversight, because RUBY_LIB_PREFIX
is derived directly from ${prefix}, not from ${libdir}.
Now, I'd be happy to work around this by setting rubylibdir to
/opt/ruby/lib/ruby/1.8
so that the library files are installed in the place where $: expects to
find them; however I can't see how to do this.
./configure --rubylibdir=/opt/ruby/lib/ruby/1.8 # gives an error
./configure --with-rubylibdir=/opt/ruby/lib/ruby/1.8 # has no effect
So I'm a bit stumped now. To summarise:
(1) "./configure --libdir=/foo" correctly updates rubylibdir so that
the .rb/.so files are installed there, but does not update RUBY_LIB
in config.h, so $: has the wrong path to those files.
And:
(2) I can't see a way from the ./configure line to set
CONFIG["rubylibdir"] independently of --libdir
Any suggestions for how I can work around this? Unfortunately, I do really
want to specify --prefix and --libdir separately for my particular file
layout.
Thanks,
Brian.