[Win32utils-devel] Trying to get RubyInline to work with VS

Heesob Park phasis at gmail.com
Sat Jun 23 03:59:19 UTC 2012


Hi,

2012/6/23 Daniel Berger <djberg96 at gmail.com>

> On Thu, Jun 21, 2012 at 8:27 PM, Heesob Park <phasis at gmail.com> wrote:
> > Hi,
> >
> > 2012/6/22 Daniel Berger <djberg96 at gmail.com>
> >>
> >> Hi,
> >>
> >> I noticed that RubyInline did not work with Visual Studio (or mingw
> >> for that matter). I forked RubyInline and made some patches that look
> >> like they ought to work. Mostly it was just adjusting the build
> >> command string so that linker options came after the -link option,
> >> though I also changed the default extension to .dll and I make a
> >> Dir.chdir call before the build happens so that it doesn't build in
> >> the current directory.
> >>
> >> https://github.com/djberg96/rubyinline
> >>
> >> However, even after my patches I'm still having trouble. It builds,
> >> but it won't load. I tried it with this simple bit of inline code:
> >>
> >> # factorial.rb
> >> require "inline"
> >> class MyTest
> >>  inline do |builder|
> >>    builder.c "
> >>      long factorial(int max) {
> >>        int i=max, result=1;
> >>        while (i >= 2) { result *= i--; }
> >>        return result;
> >>      }"
> >>  end
> >> end
> >>
> >> t = MyTest.new()
> >> p t.factorial(5)
> >>
> >> I can see that it generated the .c code and built the .dll file in
> >> c:\Users\djberge\.ruby_inline\ruby-1.9.1
> >>
> >> Inline_MyTest_cb89593d1f9fe3ecdb2178215eee80ae.c
> >> Inline_MyTest_cb89593d1f9fe3ecdb2178215eee80ae.dll
> >>
> >> However, it fails trying to load the file:
> >>
> >> c:/usr/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
> >> `require': cannot load such file --
> >>
> >>
> C:/Users/djberge/.ruby_inline/ruby-1.9.1/Inline_MyTest_cb89593d1f9fe3ecdb2178215eee80ae.dll
> >> (LoadError)
> >>        from
> >> c:/usr/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in
> >> `require'
> >>        from
> >> c:/usr/lib/ruby/gems/1.9.1/gems/RubyInline-3.11.2/lib/inline.rb:522:in
> >> `load'
> >>        from
> >> c:/usr/lib/ruby/gems/1.9.1/gems/RubyInline-3.11.2/lib/inline.rb:859:in
> >> `inline'
> >>        from factorial.rb:3:in `<class:MyTest>'
> >>        from factorial.rb:2:in `<main>'
> >>
> >> What have I done wrong?
> >>
> >
> > Ruby wants not .dll but .so for the extension name.
> >
> > Here is a patch for your forked Rubyinline.
> >
> > diff --git a/inline.rb b/inline.rb.new
> > index 3ac2f41..de45ee1 100644
> > --- a/inline.rb
> > +++ b/inline.rb.new
> > @@ -377,11 +377,7 @@ module Inline
> >
> >      def so_name
> >        unless defined? @so_name then
> > -        if WINDOZE
> > -          @so_name = "#{Inline.directory}/#{module_name}.dll"
> > -        else
> >            @so_name =
> > "#{Inline.directory}/#{module_name}.#{RbConfig::CONFIG["DLEXT"]}"
> > -        end
> >        end
> >        @so_name
> >      end
> > @@ -571,7 +567,7 @@ VALUE #{method}_equals(VALUE value) {
> >                              nil
> >                            end
> >
> > -          if WINDOZE
> > +          if WINDOZE && RUBY_PLATFORM =~ /mswin/
> >              cmd = [ RbConfig::CONFIG['LDSHARED'],
> >                      flags,
> >                      RbConfig::CONFIG['CFLAGS'],
> > @@ -657,7 +653,7 @@ VALUE #{method}_equals(VALUE value) {
> >        # gawd windoze land sucks
> >        case RUBY_PLATFORM
> >        when /mswin32/ then
> > -        " -link /LIBPATH:\"#{RbConfig::CONFIG['libdir']}\"
> > /DEFAULTLIB:\"#{RbConfig::CONFIG['LIBRUBY']}\" /INCREMENTAL:no
> > /EXPORT:Init_#{module_name}"
> > +        " -link /OUT:\"#{self.so_name}\"
> > /LIBPATH:\"#{RbConfig::CONFIG['libdir']}\"
> > /DEFAULTLIB:\"#{RbConfig::CONFIG['LIBRUBY']}\" /INCREMENTAL:no
> > /EXPORT:Init_#{module_name}"
> >        when /mingw32/ then
> >          c = RbConfig::CONFIG
> >          " -Wl,--enable-auto-import -L#{c['libdir']}
> > -l#{c['RUBY_SO_NAME']}"
>
> I don't suppose there's an easy way to have all of the compilation
> happen in a different directory is there? I see options for individual
> output files, but not one to say "build everything in directory X". Am
> I missing it?
>
>  As far as I know, there is no shortcut to set whole building directory
once.

I think the following is the second best way.

" /Fe\"#{Inline.directory}/\" /Fd\"#{Inline.directory}/\"
/Fo\"#{Inline.directory}/\" -link  /OUT:\"#{self.so_name}\"
/LIBPATH:\"#{RbConfig::CONFIG['libdir']}\"
/DEFAULTLIB:\"#{RbConfig::CONFIG['LIBRUBY']}\" /INCREMENTAL:no
/EXPORT:Init_#{module_name}"


Regards,
Park Heesob
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/win32utils-devel/attachments/20120623/94310be5/attachment-0001.html>


More information about the win32utils-devel mailing list