Hello!
How can I check for the Ruby version inside a C extension? I found some
constants in version.h, but I don’t think that file is included via
ruby.h and it has a very common name that may conflicts with similar
files in other projects. So, I don’t think it is wise to include
version.h in a Ruby extension.
Is there another way to check if the extension gets compiled with Ruby
1.8 or 1.9?
Regards,
Elias
“e” == elias athanasopoulos [email protected] writes:
e> How can I check for the Ruby version inside a C extension?
Try to avoid to test the ruby version, but rather test the
functionality
that you want in extconf.rb.
For example
moulon% ruby -rmkmf -ve ‘have_func(“rb_frame_this_func”)’
ruby 1.8.4 (2005-12-24) [i486-linux]
checking for rb_frame_this_func()… no
moulon%
moulon% ./ruby -rmkmf -ve ‘have_func(“rb_frame_this_func”)’
ruby 1.9.0 (2006-07-14) [i686-linux]
checking for rb_frame_this_func()… yes
moulon%
Guy Decoux
Hello!
ts wrote:
ruby 1.8.4 (2005-12-24) [i486-linux]
checking for rb_frame_this_func()… no
moulon%
moulon% ./ruby -rmkmf -ve ‘have_func(“rb_frame_this_func”)’
ruby 1.9.0 (2006-07-14) [i686-linux]
checking for rb_frame_this_func()… yes
moulon%
Right. This is the problem I have to deal with. My extension uses
rb_frame_last_func() which is subsituted with rb_frame_this_func() in
1.9. So, I have to alter the actual code to use rb_frame_last_func() or
rb_frame_this_func() according to the ruby version installed in the
system.
So, checking in the Makefile will not help.
Regards,
Elias
[email protected] wrote:
Regards,
Elias
In your extconf.rb file construct a -D option from the RUBY_VERSION
constant:
VERSION_NUMBER = ‘0x’+RUBY_VERSION.tr(’.’,’’)
$CPPFLAGS = “-DRUBY_VERSION=#{VERSION_NUMBER}”
“A” == Athanasopoulos [email protected] writes:
A> So, checking in the Makefile will not help.
This is bdb
static VALUE
bdb_indexes(int argc, VALUE *argv, VALUE obj)
{
VALUE indexes;
int i;
#if HAVE_RB_ARY_VALUES_AT
rb_warn(“Common#%s is deprecated; use Common#values_at”,
#if HAVE_RB_FRAME_THIS_FUNC
rb_id2name(rb_frame_this_func()));
#else
rb_id2name(rb_frame_last_func()));
#endif
#endif
Guy Decoux
Hello!
ts wrote:
#else
rb_id2name(rb_frame_last_func()));
#endif
#endif
Again, in my Debian box:
elathan@velka:/usr/lib/ruby/1.9/i486-linux> find . | xargs grep HAVE_RB
./config.h:#define HAVE_RB_FD_INIT 1
./intern.h:#if defined(NFDBITS) && defined(HAVE_RB_FD_INIT)
./intern.h:#define HAVE_RB_DEFINE_ALLOC_FUNC 1
elathan@velka:/usr/lib/ruby/1.9/i486-linux>
Should I generate the macro HAVE_RB_FRAME_THIS_FUNC in the Makefile? I
thought Ruby 1.9 had it by default defined in its internals.
Regards,
Elias
Hi,
At Mon, 28 Aug 2006 22:15:09 +0900,
Athanasopoulos wrote in [ruby-talk:211102]:
Should I generate the macro HAVE_RB_FRAME_THIS_FUNC in the Makefile?
have_func does it.
I thought Ruby 1.9 had it by default defined in its internals.
No.
“A” == Athanasopoulos [email protected] writes:
A> Should I generate the macro HAVE_RB_FRAME_THIS_FUNC in the Makefile?
I
A> thought Ruby 1.9 had it by default defined in its internals.
Part of extconf.rb for bdb
[“rb_frame_this_func”, “rb_block_proc”, “rb_io_stdio_file”].each do |f|
if have_func(f)
$CFLAGS += " -DHAVE_#{f.upcase}"
end
end
[“insert”, “values_at”].each do |f|
print “checking for Array##{f}… "
if [].respond_to?(f)
puts “yes”
$CFLAGS += " -DHAVE_RB_ARY_#{f.upcase}”
else
puts “no”
end
end
Guy Decoux
“n” == nobu [email protected] writes:
n> have_func does it.
yes, but create_header must be called
Guy Decoux
Hi,
At Mon, 28 Aug 2006 23:41:58 +0900,
ts wrote in [ruby-talk:211133]:
n> have_func does it.
yes, but create_header must be called
have_func stores the macros in $defs, and they are directly
placed in Makefile as CPPFLAGS, unless create_header is called.