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

Daniel Berger djberg96 at gmail.com
Sat Jun 23 00:24:33 UTC 2012


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


More information about the win32utils-devel mailing list