Testing for ruby 1.9 in extension code


#1

Hi

In C extension code, what’s the canonical way to test whether the ruby
being compiled against is 1.8 or 1.9?

I’ve been using ways like

#ifdef RUBY_RUBY_H
… 1.9 code
#endif

But this seems accidental. However I didn’t find a RUBY_VERSION constant
in the headers anywhere.

I’d like to submit a patch to SWIG to fix problems it has with the
latest 1.9.1-preview, and wish to use the authoritative way.

thanks
a


#2

Alex F. wrote:

In C extension code, what’s the canonical way to test whether the ruby
being compiled against is 1.8 or 1.9?
[…]
But this seems accidental. However I didn’t find a RUBY_VERSION constant
in the headers anywhere.
[…]

Have you looked at version.h?

head -n12 ruby-1.9-svn/version.h

#define RUBY_VERSION “1.9.0”
#define RUBY_RELEASE_DATE “2008-11-10”
#define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20081110
#define RUBY_PATCHLEVEL 0

#define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 9
#define RUBY_VERSION_TEENY 0
#define RUBY_RELEASE_YEAR 2008
#define RUBY_RELEASE_MONTH 11
#define RUBY_RELEASE_DAY 10

Regards,
Daniel


#3

Daniel Schömer wrote:

head -n12 ruby-1.9-svn/version.h

#define RUBY_VERSION “1.9.0”
#define RUBY_RELEASE_DATE “2008-11-10”
#define RUBY_VERSION_CODE 190
#define RUBY_RELEASE_CODE 20081110
#define RUBY_PATCHLEVEL 0

Thanks, this looked perfect. I wondered why my ‘grep VERSION
include/ruby/*.h’ hadn’t found this. Turns out version.h is deliberately
not installed for ruby 1.9, although it is in the source tree:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/12069

So the correct way is apparently never to test version, but presence of
features. In my case I ended up doing

#ifdef HAVE_RUBY_IO_H
#include “ruby/io.h”
#else
#include “rubyio.h”
#endif

to get around the disappearance of the latter header in 1.9.1.

thanks
a


#4

May I suggest a different approach, with the fast evolution of Ruby I
would rather not check for the version but for features. (Like e.g.
Object detection vs. Browser detection in Javascript)
E.g.

begin
Object.method :tap
rescue NameError
Object.module_eval do
def tap &blk; instance_eval( &blk ); self end
end
end

The above example, that I actually used, came to full value when I
upgraded from 8.6 to 8.7 :slight_smile:

HTH
Robert

C’est véritablement utile puisque c’est joli.

Antoine de Saint Exupéry