distributing native and ruby version of a library

Discussion in 'Ruby' started by Patrick Gundlach, Feb 8, 2006.

  1. 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.
     
    Patrick Gundlach, Feb 8, 2006
    #1
    1. Advertising

  2. Patrick Gundlach

    Phil Tomson Guest

    In article <>,
    Patrick Gundlach <> wrote:
    >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
     
    Phil Tomson, Feb 9, 2006
    #2
    1. Advertising

  3. 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:
    > 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.
     
    David Vallner, Feb 9, 2006
    #3
  4. 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
     
    Patrick Gundlach, Feb 9, 2006
    #4
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. V Green
    Replies:
    0
    Views:
    885
    V Green
    Feb 5, 2008
  2. PA Bear [MS MVP]
    Replies:
    0
    Views:
    1,000
    PA Bear [MS MVP]
    Feb 5, 2008
  3. MowGreen [MVP]
    Replies:
    5
    Views:
    2,042
    PA Bear [MS MVP]
    Feb 9, 2008
  4. Andrew Milkowski
    Replies:
    0
    Views:
    219
    Andrew Milkowski
    Feb 23, 2010
  5. Andrew Milkowski
    Replies:
    0
    Views:
    156
    Andrew Milkowski
    Feb 23, 2010
Loading...

Share This Page