[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