[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

packaging hybrid extension?

Rick DeNatale

10/9/2006 9:05:00 PM

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'.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

4 Answers

Ara.T.Howard

10/9/2006 9:27:00 PM

0

Rick DeNatale

10/10/2006 12:55:00 AM

0

On 10/9/06, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:

> this = File.dirname __FILE__
> archdir = File.join this, arch
>
> lib = File.join archdir, "foo.#{ dlext }"
> require lib

The problem is that __FILE__ only has the file name, not the path, so

File.dirname(__FILE__) => '.'

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

Ara.T.Howard

10/10/2006 1:15:00 AM

0

Rick DeNatale

10/10/2006 3:05:00 AM

0

On 10/9/06, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:
> On Tue, 10 Oct 2006, Rick DeNatale wrote:
>
> > On 10/9/06, ara.t.howard@noaa.gov <ara.t.howard@noaa.gov> wrote:
> >
> >> this = File.dirname __FILE__
> >> archdir = File.join this, arch
> >>
> >> lib = File.join archdir, "foo.#{ dlext }"
> >> require lib
> >
> > The problem is that __FILE__ only has the file name, not the path, so
> >
> > File.dirname(__FILE__) => '.'
>
> na. it's always relative to the current directory, so you just need to expand
> it (i forgot this part - sorry)
>
>
> mussel:~ > cat /tmp/b.rb
> puts File.dirname((__FILE__))
>
> mussel:~ > ruby /tmp/b.rb
> /tmp
>
>
>
> mussel:~ > cat /tmp/a.rb
> puts File.dirname(File.expand_path(__FILE__))
>
> mussel:~ > ruby /tmp/b.rb
> /tmp
>
> mussel:~ > ruby -I/tmp -r a.rb -e nil
> /tmp
>
>
> i use this technique all over the place for relative requires:
>
> http://codeforpeople.com/lib/ruby/rq/rq-2.3.4/lib/r...
>
>
> sorry for confusion.

Excellent! Thanks Ara.

--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...