distributing native and ruby version of a library

  • Thread starter Patrick Gundlach
  • Start date
P

Patrick Gundlach

Hi,

I have a simple library, one in a pure ruby version and one in a
ruby/c version (which is quicker). I would like to distribute both and
let the user decide (by checking whether a c library is available)
which version to install. What would a clever way to accomplish that?
Should I make the decision when running extconf.rb? Any hints?

Patrick

(the directory structure so far)

rb/mylib.rb

c/mylib.rb
/mylib_base.c
/extconf.rb

both should be used by require 'mylib' or alike.
 
P

Phil Tomson

Hi,

I have a simple library, one in a pure ruby version and one in a
ruby/c version (which is quicker). I would like to distribute both and
let the user decide (by checking whether a c library is available)
which version to install. What would a clever way to accomplish that?
Should I make the decision when running extconf.rb? Any hints?

Patrick

(the directory structure so far)

rb/mylib.rb

c/mylib.rb
/mylib_base.c
/extconf.rb

both should be used by require 'mylib' or alike.


How about in your rb/mylib.rb file you do something like:

begin
require 'ext/mylib_base'
rescue
require 'lib/mylib_base'
end

Where ext/mylib_base would be the shared lib created from the C file and
lib/mylib_base would be the Ruby implementation.

The user of mylib just does:

require 'mylib'

....and it's all transparent to the user whether or not the C version or the
ruby version is used.

Phil
 
D

David Vallner

Well, last guess before I head to bed:

In "mylib.rb":

begin
require "mylib_impl_c" # Attempts to load the C shared library.
rescue LoadError
require "mylib_impl_rb" # Falls back to the ruby implementation.
end

Yay for gracefully degrading functionality. Or performance, for that matter=
=2E=20
Sprinkle with configuration parameters to let user determine at runtime whi=
ch=20
backend to use to taste.

David Vallner

D=C5=88a Streda 08 Febru=C3=A1r 2006 20:58 Patrick Gundlach nap=C3=ADsal:
 
P

Patrick Gundlach

Hi Phil (and David),


[...]
How about in your rb/mylib.rb file you do something like:

begin
require 'ext/mylib_base'
rescue
require 'lib/mylib_base'
end

Where ext/mylib_base would be the shared lib created from the C file and
lib/mylib_base would be the Ruby implementation.

The user of mylib just does:

require 'mylib'

...and it's all transparent to the user whether or not the C version or the
ruby version is used.


OK, that makes sense. Thanks. I wonder if this could be combined with
the setup.rb from RAA (<http://raa.ruby-lang.org/project/setup/3.2.4>

When I run

ruby setup.rb config

setup.rb tries to create the c-extension in ext/mylib/... but this
might fail if the user doesn't have the necessary libraries installed.
Is there a way in setup.rb to say 'keep going if you can't create the
c extension'? I mean as a configuration file or alike, not as a
parameter passed to setup.rb. This way the c-extension will installed
only if available.

Patrick
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,483
Members
44,902
Latest member
Elena68X5

Latest Threads

Top