Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 28 Jan 2010 21:50:40 -0700
From:      Aaron Gifford <astounding@gmail.com>
To:        freebsd-ruby@freebsd.org
Subject:   Solved: Ruby Gem Require LoadError (8-STABLE, Ruby 1.9.1)
Message-ID:  <e58000751001282050n4c92c3b5pddfb549af1b75050@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
On Thu, Jan 28, 2010 at 7:25 PM, Aaron Gifford <astounding@gmail.com> wrote=
:
> =A0I wrote:
>> One more interesting thing:
>>
>> % ruby19 -e 'p Gem.default_dir'
>> "/usr/local/lib/ruby19/gems/1.9"
>>
>> That is NOT right. =A0It should be "/usr/local/lib/ruby/gems/1.9" instea=
d.
>>
>> Where does Gem.default_dir get set, does anyone know?
>>
>> Aaron out.
>
> It looks like gem_prelude.rb sets up the gems include path.
>
> The relevant code section is:
>
> =A0def self.default_dir
> =A0 =A0 =A0 =A0File.join File.dirname(ConfigMap[:sitedir]), 'Gems',
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ConfigMap[:ruby_version]
> =A0 =A0 =A0elsif RUBY_VERSION > '1.9' then
> =A0 =A0 =A0 =A0File.join(ConfigMap[:libdir], ConfigMap[:ruby_install_name=
], 'gems',
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ConfigMap[:ruby_version])
> =A0 =A0 =A0else
> =A0 =A0 =A0 =A0File.join(ConfigMap[:libdir], ruby_engine, 'gems',
> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0ConfigMap[:ruby_version])
> =A0 =A0 =A0end
> =A0 =A0end
>
> So the Gem.default_dir is being set to:
> =A0File.join(ConfigMap[:libdir], ConfigMap[:ruby_install_name], 'gems',
> ConfigMap[:ruby_version])
>
> (that's the middle "RUBY_VERSION > '1.9'" code chunk)
>
> So ConfigMap[:ruby_install_name] is "ruby19" in this case, and THAT's
> what is screwing this up.
>
>
>
> IDEAS:
>
> Either the FreeBSD Ruby 1.9 port needs to install things in
> "/usr/local/lib/ruby19" instead of "/usr/local/lib/ruby/" so the code
> will work as-is, or else something's gotta change with
> ConfigMap[:ruby_install_name], or else gem_prelude.rb code has to be
> changed...
>
> So... anyone with expertise, where does one go from here?
>
> Aaron out.

It looks like ConfigMap[:ruby_install_name] gets set earlier in the
same gem_prelude.rb code to RbConfig::CONFIG["ruby_install_name"]
which in turn is set in rbconfig.rb which sets it to "ruby19".  That
file is autogenerated during the build process by the mkconfig.rb
script which gets passed an "install_name" variable setting I'm
assuming.

That in turn gets set during make.  The Makefile shows:
$(RBCONFIG): $(srcdir)/mkconfig.rb config.status $(PREP)
        @$(MINIRUBY) $(srcdir)/mkconfig.rb -timestamp=3D$@ \
                -install_name=3D$(RUBY_INSTALL_NAME) \
                -so_name=3D$(RUBY_SO_NAME) rbconfig.rb

So it's getting set to the RUBY_INSTALL_NAME value 'ruby19'.  Of
course Makefile is created from the Makefile.in template by the GNU
Autoconf configure process.  The configure.in template shows
RUBY_INSTALL_NAME getting set to:

RUBY_INSTALL_NAME=3D"${ri_prefix}ruby${ri_suffix}"

That explains completely how Gem.default_dir is getting set to
""/usr/local/lib/ruby19/gems/1.9" instead of the actual path
"/usr/local/lib/ruby/gems/1.9"

ONE POSSIBLE FIX is this patch to gem_prelude.rb (in
/usr/ports/lang/ruby19/files/patch-gem_prelude.rb):
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- gem_prelude.rb.orig	2010-01-28 21:22:27.307910440 -0700
+++ gem_prelude.rb	2010-01-28 21:22:43.177946726 -0700
@@ -116,7 +116,7 @@
         File.join File.dirname(ConfigMap[:sitedir]), 'Gems',
                   ConfigMap[:ruby_version]
       elsif RUBY_VERSION > '1.9' then
-        File.join(ConfigMap[:libdir], ConfigMap[:ruby_install_name], 'gems=
',
+        File.join(ConfigMap[:libdir], 'ruby', 'gems',
                   ConfigMap[:ruby_version])
       else
         File.join(ConfigMap[:libdir], ruby_engine, 'gems',
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

This works.  Building/installing gems under 1.9.1 (with
RUBY_VERSION=3D1.9.1 in /etc/make.conf) did not break (still works), but
this time, no LoadErrors during require.  AT LAST!

user@host:/home/user% irb19
irb(main):001:0> require 'net/ssh'
=3D> true
irb(main):002:0>

And that makes ruby19 -e 'p Gem.default_dir' output
"/usr/local/lib/ruby/gems/1.9" like it should.

Aaron out.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?e58000751001282050n4c92c3b5pddfb549af1b75050>