From: ara.t.howard@... Date: 2006-10-10T06:26:41+09:00 Subject: Re: packaging hybrid extension? 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