[前][次][番号順一覧][スレッド一覧]

ruby-changes:61965

From: Sutou <ko1@a...>
Date: Sun, 28 Jun 2020 02:03:11 +0900 (JST)
Subject: [ruby-changes:61965] f2bcdc7283 (master): [ruby/fiddle] Support MSWIN (#43)

https://git.ruby-lang.org/ruby.git/commit/?id=f2bcdc7283

From f2bcdc7283f2137e0916e251df3a52c40b1f6151 Mon Sep 17 00:00:00 2001
From: Sutou Kouhei <kou@c...>
Date: Sat, 27 Jun 2020 11:01:22 +0900
Subject: [ruby/fiddle] Support MSWIN (#43)

https://github.com/ruby/fiddle/commit/f16e7ff6e0

diff --git a/ext/fiddle/extconf.rb b/ext/fiddle/extconf.rb
index 1ec9c6b..b64d50c 100644
--- a/ext/fiddle/extconf.rb
+++ b/ext/fiddle/extconf.rb
@@ -3,23 +3,32 @@ require 'mkmf' https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L3
 
 # :stopdoc:
 
+libffi_version = nil
+have_libffi = false
 bundle = enable_config('bundled-libffi')
-if ! bundle
+unless bundle
   dir_config 'libffi'
 
-  pkg_config("libffi") and
-    ver = pkg_config("libffi", "modversion")
+  if pkg_config("libffi")
+    libffi_version = pkg_config("libffi", "modversion")
+  end
 
+  have_ffi_header = false
   if have_header(ffi_header = 'ffi.h')
-    true
+    have_ffi_header = true
   elsif have_header(ffi_header = 'ffi/ffi.h')
     $defs.push('-DUSE_HEADER_HACKS')
-    true
-  end and (have_library('ffi') || have_library('libffi'))
-end or
-begin
+    have_ffi_header = true
+  end
+  if have_ffi_header && (have_library('ffi') || have_library('libffi'))
+    have_libffi = true
+  end
+end
+
+unless have_libffi
   # for https://github.com/ruby/fiddle
-  if bundle && File.exist?("../../bin/extlibs.rb")
+  extlibs_rb = File.expand_path("../../bin/extlibs.rb", $srcdir)
+  if bundle && File.exist?(extlibs_rb)
     require "fileutils"
     require_relative "../../bin/extlibs"
     extlibs = ExtLibs.new
@@ -28,31 +37,32 @@ begin https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L37
     Dir.glob("#{$srcdir}/libffi-*/").each{|dir| FileUtils.rm_rf(dir)}
     extlibs.run(["--cache=#{cache_dir}", ext_dir])
   end
-  ver = bundle != false &&
-        Dir.glob("#{$srcdir}/libffi-*/")
-        .map {|n| File.basename(n)}
-        .max_by {|n| n.scan(/\d+/).map(&:to_i)}
-  unless ver
+  if bundle
+    libffi_package_name = Dir.glob("#{$srcdir}/libffi-*/")
+                            .map {|n| File.basename(n)}
+                            .max_by {|n| n.scan(/\d+/).map(&:to_i)}
+  end
+  unless libffi_package_name
     raise "missing libffi. Please install libffi."
   end
 
-  srcdir = "#{$srcdir}/#{ver}"
+  libffi_srcdir = "#{$srcdir}/#{libffi_package_name}"
   ffi_header = 'ffi.h'
   libffi = Struct.new(*%I[dir srcdir builddir include lib a cflags ldflags opt arch]).new
-  libffi.dir = ver
+  libffi.dir = libffi_package_name
   if $srcdir == "."
-    libffi.builddir = "#{ver}/#{RUBY_PLATFORM}"
+    libffi.builddir = libffi_package_name
     libffi.srcdir = "."
   else
     libffi.builddir = libffi.dir
-    libffi.srcdir = relative_from(srcdir, "..")
+    libffi.srcdir = relative_from(libffi_srcdir, "..")
   end
   libffi.include = "#{libffi.builddir}/include"
   libffi.lib = "#{libffi.builddir}/.libs"
   libffi.a = "#{libffi.lib}/libffi_convenience.#{$LIBEXT}"
   nowarn = CONFIG.merge("warnflags"=>"")
   libffi.cflags = RbConfig.expand("$(CFLAGS)".dup, nowarn)
-  ver = ver[/libffi-(.*)/, 1]
+  libffi_version = libffi_package_name[/libffi-(.*)/, 1]
 
   FileUtils.mkdir_p(libffi.dir)
   libffi.opt = CONFIG['configure_args'][/'(-C)'/, 1]
@@ -81,7 +91,6 @@ begin https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L91
   args.concat %W[
     --srcdir=#{libffi.srcdir}
     --host=#{libffi.arch}
-    --enable-builddir=#{RUBY_PLATFORM}
   ]
   args << ($enable_shared || !$static ? '--enable-shared' : '--enable-static')
   args << libffi.opt if libffi.opt
@@ -98,7 +107,7 @@ begin https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L107
       begin
         IO.copy_stream(libffi.dir + "/config.log", Logging.instance_variable_get(:@logfile))
       rescue SystemCallError => e
-        Logfile.message("%s\n", e.message)
+        Logging.message("%s\n", e.message)
       end
       raise "failed to configure libffi. Please install libffi."
     end
@@ -107,27 +116,32 @@ begin https://github.com/ruby/ruby/blob/trunk/ext/fiddle/extconf.rb#L116
     FileUtils.rm_f("#{libffi.include}/ffitarget.h")
   end
   unless File.file?("#{libffi.include}/ffitarget.h")
-    FileUtils.cp("#{srcdir}/src/x86/ffitarget.h", libffi.include, preserve: true)
+    FileUtils.cp("#{libffi_srcdir}/src/x86/ffitarget.h", libffi.include, preserve: true)
   end
   $INCFLAGS << " -I" << libffi.include
 end
 
-if ver
-  ver = ver.gsub(/-rc\d+/, '') # If ver contains rc version, just ignored.
-  ver = (ver.split('.').map(&:to_i) + [0,0])[0,3]
-  $defs.push(%{-DRUBY_LIBFFI_MODVERSION=#{ '%d%03d%03d' % ver }})
-  warn "libffi_version: #{ver.join('.')}"
+if libffi_version
+  # If libffi_version contains rc version, just ignored.
+  libffi_version = libffi_version.gsub(/-rc\d+/, '')
+  libffi_version = (libffi_version.split('.').map(&:to_i) + [0,0])[0,3]
+  $defs.push(%{-DRUBY_LIBFFI_MODVERSION=#{ '%d%03d%03d' % libffi_version }})
+  warn "libffi_version: #{libffi_version.join('.')}"
 end
 
 case
-when $mswin, $mingw, (ver && (ver <=> [3, 2]) >= 0)
+when $mswin, $mingw, (libffi_version && (libffi_version <=> [3, 2]) >= 0)
   $defs << "-DUSE_FFI_CLOSURE_ALLOC=1"
-when (ver && (ver <=> [3, 2]) < 0)
+when (libffi_version && (libffi_version <=> [3, 2]) < 0)
 else
   have_func('ffi_closure_alloc', ffi_header)
 end
 
-have_func('ffi_prep_cif_var', ffi_header)
+if libffi
+  $defs << "-DHAVE_FFI_PREP_CIF_VAR"
+else
+  have_func('ffi_prep_cif_var', ffi_header)
+end
 
 have_header 'sys/mman.h'
 
diff --git a/ext/fiddle/fiddle.gemspec b/ext/fiddle/fiddle.gemspec
index befa7ae..da57ea7 100644
--- a/ext/fiddle/fiddle.gemspec
+++ b/ext/fiddle/fiddle.gemspec
@@ -25,10 +25,13 @@ Gem::Specification.new do |spec| https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.gemspec#L25
     "LICENSE.txt",
     "README.md",
     "Rakefile",
+    "bin/downloader.rb",
+    "bin/extlibs.rb",
     "ext/fiddle/closure.c",
     "ext/fiddle/closure.h",
     "ext/fiddle/conversions.c",
     "ext/fiddle/conversions.h",
+    "ext/fiddle/depend",
     "ext/fiddle/extconf.rb",
     "ext/fiddle/extlibs",
     "ext/fiddle/fiddle.c",
diff --git a/ext/fiddle/win32/libffi-config.rb b/ext/fiddle/win32/libffi-config.rb
index 6abc9b2..985fc29 100755
--- a/ext/fiddle/win32/libffi-config.rb
+++ b/ext/fiddle/win32/libffi-config.rb
@@ -32,7 +32,7 @@ IO.foreach("#{srcdir}/configure.ac") do |line| https://github.com/ruby/ruby/blob/trunk/ext/fiddle/win32/libffi-config.rb#L32
   end
 end
 
-builddir = srcdir == "." ? enable['builddir'] : "."
+builddir = srcdir == "." ? (enable['builddir'] || ".") : "."
 conf['TARGET'] = /^x64/ =~ host ? "X86_WIN64" : "X86_WIN32"
 
 FileUtils.mkdir_p([builddir, "#{builddir}/include", "#{builddir}/src/x86"])
diff --git a/test/fiddle/test_func.rb b/test/fiddle/test_func.rb
index 376f878..cf71a4b 100644
--- a/test/fiddle/test_func.rb
+++ b/test/fiddle/test_func.rb
@@ -86,7 +86,12 @@ module Fiddle https://github.com/ruby/ruby/blob/trunk/test/fiddle/test_func.rb#L86
       else
         snprintf_name = "snprintf"
       end
-      snprintf = Function.new(@libc[snprintf_name],
+      begin
+        snprintf_pointer = @libc[snprintf_name]
+      rescue Fiddle::DLError
+        skip "Can't find #{snprintf_name}: #{$!.message}"
+      end
+      snprintf = Function.new(snprintf_pointer,
                               [
                                 TYPE_VOIDP,
                                 TYPE_SIZE_T,
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]