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/