Daniel Berger
2012-Jun-22 01:01 UTC
[Win32utils-devel] Trying to get RubyInline to work with VS
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? Regards, Dan
Heesob Park
2012-Jun-22 02:27 UTC
[Win32utils-devel] Trying to get RubyInline to work with VS
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'']}" Regards, Park Heesob -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/win32utils-devel/attachments/20120622/1853edb4/attachment-0001.html>
Daniel Berger
2012-Jun-22 04:23 UTC
[Win32utils-devel] Trying to get RubyInline to work with VS
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'']}" > > > Regards, > Park HeesobThanks! The docs Ruby will try to load a .dll but it doesn''t seem to actually be the case. Anyway, I have all the tests passing with VS but mingw has 6 failures, though there are many more in the core version, so it''s an improvement! Regards, Dan
Daniel Berger
2012-Jun-22 04:42 UTC
[Win32utils-devel] Trying to get RubyInline to work with VS
Hi, <snip>> Anyway, I have all the tests passing with VS but mingw has 6 failures, > though there are many more in the core version, so it''s an > improvement!It now passes with mingw, though it requires Devkit in your PATH. I''m not sure how to detect the Devkit location from within a Ruby program, however. Anyway, good enough for now. Thanks again, Dan
Daniel Berger
2012-Jun-23 00:24 UTC
[Win32utils-devel] Trying to get RubyInline to work with VS
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? I only ask because Ryan doesn''t like having to add a Dir.chdir call. Regards, Dan
Heesob Park
2012-Jun-23 03:59 UTC
[Win32utils-devel] Trying to get RubyInline to work with VS
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 directoryonce. 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>