Ruby Forum Ruby > Cross Compiling Ruby Extension

Posted by Brian Takita (Guest)
on 18.10.2006 09:59
(Received via mailing list)
Hello,

I'm attempting to cross compile a ruby extension for Windows from a 
Linux
box.
Im running Ubuntu 6.06, Ruby 1.8.5, and mingw gcc 3.4.4.

I attempted to follow Mauricio Fernandez's instructions
http://eigenclass.org/hiki.rb?cross+compiling+rcovrt#f01

The file compiled but it appears that it is still a Linux binary.
json_ext.so: ELF 32-bit LSB shared object, Intel 80386, version 1 
(SYSV),
not stripped

Is there something that I may be missing?

Thank you,
Brian Takita
Posted by Austin Ziegler (austin)
on 18.10.2006 15:54
(Received via mailing list)
On 10/18/06, Brian Takita <brian.takita@gmail.com> wrote:
> I'm attempting to cross compile a ruby extension for Windows from a Linux
> box.
> Im running Ubuntu 6.06, Ruby 1.8.5, and mingw gcc 3.4.4.

I don't recommend doing this if you want your extension to be
compatible with the current Windows Ruby release.

-austin
Posted by Brian Takita (Guest)
on 18.10.2006 19:46
(Received via mailing list)
On 10/18/06, Austin Ziegler <halostatue@gmail.com> wrote:
>
> On 10/18/06, Brian Takita <brian.takita@gmail.com> wrote:
> > I'm attempting to cross compile a ruby extension for Windows from a
> Linux
> > box.
> > Im running Ubuntu 6.06, Ruby 1.8.5, and mingw gcc 3.4.4.
>
> I don't recommend doing this if you want your extension to be
> compatible with the current Windows Ruby release.


Thanks for your reply. I'm at my wit's end in compiling ruby extensions 
on
Windows. Ruby 1.8.5 is compiled under VC 6, right?

Its too bad that is very difficult to compile extensions for Windows.

Do you mind if I pick your brain at the conference?

-austin
Posted by Austin Ziegler (austin)
on 18.10.2006 20:50
(Received via mailing list)
On 10/18/06, Brian Takita <brian.takita@gmail.com> wrote:
>
> Its too bad that is very difficult to compile extensions for Windows.
>
> Do you mind if I pick your brain at the conference?

You can try -- I'm going to be interested in picking a lot of peoples'
brains at the conference about this issue. See a notice that I'll be
posting later tonight.

-austin
Posted by Mauricio Fernandez (Guest)
on 18.10.2006 20:54
(Received via mailing list)
On Wed, Oct 18, 2006 at 04:58:53PM +0900, Brian Takita wrote:
> json_ext.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV),
> not stripped

You are using mkrf instead of mkmf, so things work a bit differently.

$ cat extconf.rb
require 'rubygems'
require 'mkrf'

dir = File.dirname(__FILE__)
Mkrf::Generator.new('json_ext', "#{dir}/*.c")
$ cat > extconf.rb
require 'mkmf'
create_makefile "json_ext"
$ ruby -I ~/usr/ruby-mingw32/lib/ruby/1.8/i386-mingw32 extconf.rb
/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32/rbconfig.rb:7: ruby 
lib version (1.8.4) doesn't match executable version (1.8.5) 
(RuntimeError)
	from /home/batsman/usr//lib/ruby/1.8/mkmf.rb:4:in `require'
	from /home/batsman/usr//lib/ruby/1.8/mkmf.rb:4
	from extconf.rb:1:in `require'
	from extconf.rb:1

[use vim to edit rbconfig.rb and remove/comment the version check if the
native & cross-compiled ruby version differ]

$ ruby -I ~/ruby-mingw32/lib/ruby/1.8/i386-mingw32/ extconf.rb
creating Makefile
$ make
i586-mingw32msvc-gcc -I. 
-I/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32 
-I/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32 -I.  -g -O2   -c 
json_ext.c
i586-mingw32msvc-gcc -shared -s -Wl,--enable-auto-import,--export-all 
-L"/home/batsman/ruby-mingw32/lib" -o json_ext.so json_ext.o 
-lmsvcrt-ruby18  -lwsock32
$ file json_ext.so
json_ext.so: MS Windows PE 32-bit Intel 80386 console DLL
Posted by Mauricio Fernandez (Guest)
on 18.10.2006 21:00
(Received via mailing list)
On Wed, Oct 18, 2006 at 10:52:55PM +0900, Austin Ziegler wrote:
> On 10/18/06, Brian Takita <brian.takita@gmail.com> wrote:
> >I'm attempting to cross compile a ruby extension for Windows from a Linux
> >box.
> >Im running Ubuntu 6.06, Ruby 1.8.5, and mingw gcc 3.4.4.
> 
> I don't recommend doing this if you want your extension to be
> compatible with the current Windows Ruby release.

Isn't mingw supposed to be compatible with the MSVC (which the
One Click Installer uses now instead of some newer VC++) builds?

Ara mentioned some incompatibility on ruby-core (a problem with isascii 
IIRC)
but it had been solved in CVS for a while.
Posted by Brian Takita (Guest)
on 19.10.2006 04:02
(Received via mailing list)
On 10/18/06, Mauricio Fernandez <mfp@acm.org> wrote:
> > http://eigenclass.org/hiki.rb?cross+compiling+rcovrt#f01
> require 'mkrf'
>         from /home/batsman/usr//lib/ruby/1.8/mkmf.rb:4:in `require'
> i586-mingw32msvc-gcc -I.
> -I/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32
> -I/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32 -I.  -g -O2   -c
> json_ext.c
> i586-mingw32msvc-gcc -shared -s
> -Wl,--enable-auto-import,--export-all  -L"/home/batsman/ruby-mingw32/lib" -o
> json_ext.so json_ext.o  -lmsvcrt-ruby18  -lwsock32
> $ file json_ext.so
> json_ext.so: MS Windows PE 32-bit Intel 80386 console DLL


Thanks for demoing this. I'll give it a shot.

--
> Mauricio Fernandez  -   http://eigenclass.org   -  singular Ruby
>
>



On 10/18/06, <b class="gmail_sendername">Mauricio Fernandez</b> &lt;<a 
href="mailto:mfp@acm.org">mfp@acm.org</a>&gt; wrote:<div><span 
class="gmail_quote"></span><blockquote class="gmail_quote" 
style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 
0.8ex; padding-left: 1ex;">
On Wed, Oct 18, 2006 at 04:58:53PM +0900, Brian Takita wrote:<br>&gt; 
Hello,<br>&gt;<br>&gt; I'm attempting to cross compile a ruby extension 
for Windows from a Linux<br>&gt; box.<br>&gt; Im running Ubuntu 6.06, 
Ruby 1.8.5
, and mingw gcc 3.4.4.<br>&gt;<br>&gt; I attempted to follow Mauricio 
Fernandez's instructions<br>&gt; <a 
href="http://eigenclass.org/hiki.rb?cross+compiling+rcovrt#f01">http://eigenclass.org/hiki.rb?cross+compiling+rcovrt#f01
</a><br>&gt;<br>&gt; The file compiled but it appears that it is still a 
Linux binary.<br>&gt; json_ext.so: ELF 32-bit LSB shared object, Intel 
80386, version 1 (SYSV),<br>&gt; not stripped<br><br>You are using mkrf 
instead of mkmf, so things work a bit differently.
<br><br>$ cat extconf.rb<br>require 'rubygems'<br>require 
'mkrf'<br><br>dir = 
File.dirname(__FILE__)<br>Mkrf::Generator.new('json_ext', 
&quot;#{dir}/*.c&quot;)<br>$ cat &gt; extconf.rb<br>require 
'mkmf'<br>create_makefile &quot;json_ext&quot;
<br>$ ruby -I ~/usr/ruby-mingw32/lib/ruby/1.8/i386-mingw32 
extconf.rb<br>/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32/rbconfig.rb:7: 
ruby lib version (1.8.4) doesn't match executable version (1.8.5) 
(RuntimeError)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from 
/home/batsman/usr//lib/ruby/1.8/mkmf.rb:4:in 
`require'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from 
/home/batsman/usr//lib/ruby/1.8/mkmf.rb:4<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from 
extconf.rb:1:in 
`require'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from 
extconf.rb:1<br><br>[use vim to edit
rbconfig.rb and remove/comment the version check if the<br>native &amp; 
cross-compiled ruby version differ]<br><br>$ ruby -I 
~/ruby-mingw32/lib/ruby/1.8/i386-mingw32/ extconf.rb<br>creating 
Makefile<br>$ make<br>i586-mingw32msvc-gcc -I. 
-I/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32 
-I/home/batsman/ruby-mingw32/lib/ruby/1.8/i386-mingw32 -I.&nbsp;&nbsp;-g 
-O2&nbsp;&nbsp; -c json_ext.c
<br>i586-mingw32msvc-gcc -shared -s 
-Wl,--enable-auto-import,--export-all&nbsp;&nbsp;-L&quot;/home/batsman/ruby-mingw32/lib&quot; 
-o json_ext.so 
json_ext.o&nbsp;&nbsp;-lmsvcrt-ruby18&nbsp;&nbsp;-lwsock32<br>$ file 
json_ext.so<br>json_ext.so: MS Windows PE 32-bit Intel 80386 console DLL
</blockquote><div><br>Thanks for demoing this. I'll give it a shot. 
<br></div><br><blockquote class="gmail_quote" style="border-left: 1px 
solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 
1ex;">--<br>Mauricio Fernandez&nbsp;&nbsp;-&nbsp;&nbsp;
<a href="http://eigenclass.org">http://eigenclass.org</a>&nbsp;&nbsp; 
-&nbsp;&nbsp;singular Ruby<br><br></blockquote></div><br>
Posted by Brian Takita (Guest)
on 19.10.2006 07:43
(Received via mailing list)
On 10/18/06, Brian Takita <brian.takita@gmail.com> wrote:
> > >
> > $ cat extconf.rb
> > lib version (1.8.4) doesn't match executable version (1.8.5)
> > creating Makefile
>
>
> Thanks for demoing this. I'll give it a shot.
>

It looks like the compile worked. I did not run make install on mingw.

There where a couple of issues with the install task, such as
rubyw.exemissing and the .ext directory missing.
To resolve this I copied ruby.exe to rubyw.exe and the ext directory to 
.ext

Thank you,
Brian

--
Posted by Brian Takita (Guest)
on 19.10.2006 07:47
(Received via mailing list)
On 10/18/06, Austin Ziegler <halostatue@gmail.com> wrote:
> > Thanks for your reply. I'm at my wit's end in compiling ruby extensions
> on
> > Windows. Ruby 1.8.5 is compiled under VC 6, right?
> >
> > Its too bad that is very difficult to compile extensions for Windows.
> >
> > Do you mind if I pick your brain at the conference?
>
> You can try -- I'm going to be interested in picking a lot of peoples'
> brains at the conference about this issue. See a notice that I'll be
> posting later tonight.


Yes. It would be good to look for a resolution to this issue at the
conference. I cant wait to read your post.

-austin