On Tue, 10 Oct 2006, Rick DeNatale wrote:

> I'm writing something which is partially written in ruby, but uses an
> extension which adds methods to some of the classes in the ruby part.
>
> Right now I've got a directory which contains both the ruby code and
> the so containing the extensions
>
> $ls
> mycode.rb mycode_prims.so
>
> in mycode.rb I've got something like:
>
> class Mycode
>   def foo
>   end
> end
>
> # link in the primitives, mycode_prims includes various calls to
> # rb_define_method to add methods to the Mycode class.
> require 'mycode_prims'
>
> Now this works if the directory containing both parts is the current
> directory, but not otherwise. Actually I guess it would work as long
> as the directory was on the load path, but I'm concerned about the
> possibility of loading the wrong mycode_prims.so.
>
> Is there a way to get the directory containing the current source
> file?  __FILE__ only gives the file name, but not the path.
>
> What is the right way to do this?  I'd like to know how to approach
> this either with the code packaged as a gem or as 'source'.

one idea is to do something like this

in foo.rb

   require 'rbconfig'

   arch = Config::CONFIG["arch"]
   dlext = Config::CONFIG["DLEXT"]

   this = File.dirname __FILE__
   archdir = File.join this, arch

   lib = File.join archdir, "foo.#{ dlext }"
   require lib

then you layout dirs like so

   lib/foo.rb
   lib/i686-linux/foo.so
   lib/mswin/foo.dll

and you can distribute one gem, one tarball, etc.  you also could just dump
the *.so right into the libdir and do a


   lib = File.join(File.dirname(__FILE__), "foo.#{ dlext }")
   require lib

for example.  the key point is to bury the native lib close to the *.rb file
and do a relative require.

hope that made sense...

-a
-- 
in order to be effective truth must penetrate like an arrow - and that is
likely to hurt. -- wei wu wei