# Determining endianness in extconf.rb

**URL:** <https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531>\
**Category:** Ruby\
**Created:** [December 5, 2005, 7:52pm UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531 "2005-12-05T19:52:48Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![aaron\_patterson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4491bb/32.png) [@aaron\_patterson](https://www.ruby-forum.com/u/aaron_patterson)\
**Post date:** [December 5, 2005, 7:52pm UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531/1 "2005-12-05T19:52:48Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aaron\_patterson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4491bb/32.png) [@aaron\_patterson](https://www.ruby-forum.com/u/aaron_patterson)\
**Post date:** [December 5, 2005, 8:25pm UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531/2 "2005-12-05T20:25:30Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aaron\_patterson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4491bb/32.png) [@aaron\_patterson](https://www.ruby-forum.com/u/aaron_patterson)\
**Post date:** [December 5, 2005, 8:37pm UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531/3 "2005-12-05T20:37:42Z")

</div>

On Tue, Dec 06, 2005 at 04:21:37AM +0900, Daniel B. wrote:

[snip]

> #endif
> 
> Regards,
> 
> Dan

Thank you for the help!

–Aaron

---

<div class="post-metadata">

**Author:** ![aaron\_patterson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4491bb/32.png) [@aaron\_patterson](https://www.ruby-forum.com/u/aaron_patterson)\
**Post date:** [December 6, 2005, 6:03am UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531/4 "2005-12-06T06:03:04Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![aaron\_patterson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4491bb/32.png) [@aaron\_patterson](https://www.ruby-forum.com/u/aaron_patterson)\
**Post date:** [December 6, 2005, 11:24pm UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531/5 "2005-12-06T23:24:27Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![aaron\_patterson](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/4491bb/32.png) [@aaron\_patterson](https://www.ruby-forum.com/u/aaron_patterson)\
**Post date:** [December 7, 2005, 1:06am UTC](https://www.ruby-forum.com/t/determining-endianness-in-extconf-rb/49531/6 "2005-12-07T01:06:11Z")

</div>

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.
