From: Marvin Gülker on
Hi there,

I'm trying to create a C extension that compiles for both Ruby 1.8 and
1.9. As far as I know, there should be the macros RUBY_VERSION_MAJOR,
RUBY_VERSION_MINOR and RUBY_VERSION_TINY to check with which Ruby
version we're compiling, and they should be defined in the header
"ruby/version.h". But there's the problem: That file just doesn't exist
in my Ruby installations. Wheather I try to compile with 1.8.7 or 1.9.1,
I get:

fatal error: ruby/version.h: No such file or directory

This simple C extension demonstrates the issue:
-----------------------------------------
#include "ruby.h"
#include "ruby/version.h"

VALUE Foo;

static VALUE m_abc(VALUE self)
{
#if RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 9
printf("Using 1.9\n");
#else
printf("Using 1.8\n");
#endif
return Qnil;
}

void Init_abc()
{
Foo = rb_define_module("ABC");
rb_define_module_function(Foo, "abc", m_abc, 0);
}
-----------------------------------------

If I comment out '#include "ruby/version.h"' I don't get compile errors,
but when I run the program, I always get "Using 1.8" regardless which
Ruby the extension was compiled for.

Here's my systems configuration:
Windows Vista 32-Bit
ruby -v: ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]
ruby18 -v: ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-mingw32]
gcc --version: gcc.exe (GCC) 4.5.0
(I have a separate MinGW + MSYS installation, not the Development Kit
from the RubyInstaller)

I installed 1.9 via the RubyInstaller's 7z and compiled 1.8 myself.

Any hints on how to find out the Ruby version from C?

Marvin
--
Posted via http://www.ruby-forum.com/.

From: Luis Lavena on
On Jul 9, 11:39 am, Marvin Gülker <sutn...(a)gmx.net> wrote:
> Hi there,
>
> I'm trying to create a C extension that compiles for both Ruby 1.8 and
> 1.9. As far as I know, there should be the macros RUBY_VERSION_MAJOR,
> RUBY_VERSION_MINOR and RUBY_VERSION_TINY to check with which Ruby
> version we're compiling, and they should be defined in the header
> "ruby/version.h". But there's the problem: That file just doesn't exist
> in my Ruby installations. Wheather I try to compile with 1.8.7 or 1.9.1,
> I get:
>
> fatal error: ruby/version.h: No such file or directory
>
> This simple C extension demonstrates the issue:
> -----------------------------------------
> #include "ruby.h"
> #include "ruby/version.h"
>
> VALUE Foo;
>
> static VALUE m_abc(VALUE self)
> {
>   #if RUBY_VERSION_MAJOR == 1 && RUBY_VERSION_MINOR == 9
>   printf("Using 1.9\n");
>   #else
>   printf("Using 1.8\n");
>   #endif
>   return Qnil;
>
> }
>
> void Init_abc()
> {
>   Foo = rb_define_module("ABC");
>   rb_define_module_function(Foo, "abc", m_abc, 0);}
>
> -----------------------------------------
>
> If I comment out '#include "ruby/version.h"' I don't get compile errors,
> but when I run the program, I always get "Using 1.8" regardless which
> Ruby the extension was compiled for.
>
> Here's my systems configuration:
> Windows Vista 32-Bit
> ruby -v: ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-mingw32]
> ruby18 -v: ruby 1.8.7 (2009-12-24 patchlevel 248) [i386-mingw32]
> gcc --version: gcc.exe (GCC) 4.5.0
> (I have a separate MinGW + MSYS installation, not the Development Kit
> from the RubyInstaller)
>
> I installed 1.9 via the RubyInstaller's 7z and compiled 1.8 myself.
>
> Any hints on how to find out the Ruby version from C?
>

Most of the times you work around specific Ruby 1.9 features that
differ from 1.8, for example, encodings.

You have one example here:

http://github.com/datamapper/do/blob/master/do_mysql/ext/do_mysql/do_mysql.c

As you can see, ruby/version.h has been deprecated.

You can find more about these changes here:

http://blog.grayproductions.net/articles/getting_code_ready_for_ruby_19

What you can try to do is use the extconf process to create you the
needed defines.

http://github.com/datamapper/do/blob/master/do_mysql/ext/do_mysql/extconf.rb#L77-79

HTH,
--
Luis Lavena
From: Marvin Gülker on
Luis Lavena wrote:
> What you can try to do is use the extconf process to create you the
> needed defines.
>
> http://github.com/datamapper/do/blob/master/do_mysql/ext/do_mysql/extconf.rb#L77-79
>
> HTH,

Thank you, Luis! That helped me a lot, I now solved the problem by
adding this to my extconf.rb:
---------------------------------
print("Checking whether we are running Ruby 1.9... ")
if RUBY_VERSION >= "1.9.0"
$CFLAGS << " -DUSING_RUBY_19"
puts "yes"
else
puts "no"
end
---------------------------------
And in the C code I check wheather USING_RUBY_19 is defined.

Thank you!
Marvin
--
Posted via http://www.ruby-forum.com/.