Forum: Ruby Determining endianness in extconf.rb

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
aaron_patterson (Guest)
on 2005-12-05 20:52
(Received via mailing list)
Hi.  Hopefully this is the right list for this question!

I am writing an extension for Ruby in C, and I need to determine
the endianness of the machine and set a flag when I compile.  What is
the best way to go about this?  I've seen examples of determining
endianness but I don't know how to set the flag in extconf.rb

Any help would be greatly appreciated.  Thank you!

--Aaron
Daniel.Berger (Guest)
on 2005-12-05 21:25
(Received via mailing list)
Aaron P. wrote:
>
>

Modify $CFLAGS or $CPPFLAGS directly:

# extconf.rb
if [1].pack("I") == [1].pack("N")
    $CFLAGS += " -DBIG_ENDIAN" # note the leading space
end

/* In your C code somewhere */
#ifdef BIG_ENDIAN
    /* Do something */
#endif

Regards,

Dan
aaron_patterson (Guest)
on 2005-12-05 21:37
(Received via mailing list)
On Tue, Dec 06, 2005 at 04:21:37AM +0900, Daniel B. wrote:

[snip]

> #endif
>
> Regards,
>
> Dan
>

Thank you for the help!

--Aaron
nobuyoshi.nakada (Guest)
on 2005-12-06 07:03
(Received via mailing list)
Hi,

At Tue, 6 Dec 2005 04:21:37 +0900,
Daniel B. wrote in [ruby-talk:168948]:
> # extconf.rb
> if [1].pack("I") == [1].pack("N")
>     $CFLAGS += " -DBIG_ENDIAN" # note the leading space
> end

It tells the endian of the running platform, but not of the
target platform.  They can differ when cross-compiling.

Since config.h defines WORDS_BIGENDIAN for big-endian
platforms, you don't have to test it in extconf.rb.
aaron_patterson (Guest)
on 2005-12-07 00:24
(Received via mailing list)
On Tue, Dec 06, 2005 at 02:00:33PM +0900, nobuyoshi nakada wrote:
[snip]
>
> Since config.h defines WORDS_BIGENDIAN for big-endian
> platforms, you don't have to test it in extconf.rb.
>
> --
> Nobu Nakada

I guess I don't understand how I am supposed to set up my build
environment....  As far as I can tell, config.h is generated while
building Ruby from source.  The only config.h on my system is:

/usr/lib/ruby/1.8/i386-linux/config.h

Which does not have WORDS_BIGENDIAN listed in it.  I did find
WORDS_BIGENDIAN in /usr/lib/ruby/1.8/i386-linux/defines.h but it just
says to look at __BIG_ENDIAN__.

Can you point me to a small project that I can model my build after, or
an example exconf.rb?

Thanks for the help!

--Aaron
guslist (Guest)
on 2005-12-07 02:06
(Received via mailing list)
On Wed, 2005-12-07 at 07:22 +0900, Aaron P. wrote:
> environment....  As far as I can tell, config.h is generated while
> building Ruby from source.  The only config.h on my system is:
>
> /usr/lib/ruby/1.8/i386-linux/config.h
>
> Which does not have WORDS_BIGENDIAN listed in it.  I did find
> WORDS_BIGENDIAN in /usr/lib/ruby/1.8/i386-linux/defines.h but it just
> says to look at __BIG_ENDIAN__.

That's because you are on Intel, which is little endian.

> Can you point me to a small project that I can model my build after, or
> an example exconf.rb?

What he is saying is that you should not modify your extconf.rb file. In
your C code, just do:

#ifdef WORDS_BIGENDIAN
  // Big endian code
#else
  // Little endian code
#endif

Guillaume.
This topic is locked and can not be replied to.