testing for ruby 1.9 in extension code

A

Alex Fenton

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
 
D

Daniel Schömer

Alex said:
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
 
A

Alex Fenton

Daniel said:
Alex said:
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


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
 
R

Robert Dober

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 :)

HTH
Robert
--=20
C'est v=E9ritablement utile puisque c'est joli.

Antoine de Saint Exup=E9ry
 

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

Forum statistics

Threads
473,774
Messages
2,569,596
Members
45,140
Latest member
SweetcalmCBDreview
Top