diff options
author | Sutou Kouhei <kou@cozmixng.org> | 2020-06-27 11:01:22 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2020-06-27 23:54:09 +0900 |
commit | f2bcdc7283f2137e0916e251df3a52c40b1f6151 (patch) | |
tree | e873f5b3b06155927ba5dd2b9f670d59c201e81e | |
parent | a40b390b1775eec264fedc0bbd4504861e61c7e4 (diff) | |
download | ruby-f2bcdc7283f2137e0916e251df3a52c40b1f6151.tar.gz |
[ruby/fiddle] Support MSWIN (#43)
https://github.com/ruby/fiddle/commit/f16e7ff6e0
-rw-r--r-- | ext/fiddle/extconf.rb | 74 | ||||
-rw-r--r-- | ext/fiddle/fiddle.gemspec | 3 | ||||
-rwxr-xr-x | ext/fiddle/win32/libffi-config.rb | 2 | ||||
-rw-r--r-- | test/fiddle/test_func.rb | 7 |
4 files changed, 54 insertions, 32 deletions
diff --git a/ext/fiddle/extconf.rb b/ext/fiddle/extconf.rb index 1ec9c6b15a..b64d50c29e 100644 --- a/ext/fiddle/extconf.rb +++ b/ext/fiddle/extconf.rb @@ -3,23 +3,32 @@ require 'mkmf' # :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 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 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 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 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 befa7aeff5..da57ea7dc7 100644 --- a/ext/fiddle/fiddle.gemspec +++ b/ext/fiddle/fiddle.gemspec @@ -25,10 +25,13 @@ Gem::Specification.new do |spec| "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 6abc9b2c02..985fc29d36 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| 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 376f8786da..cf71a4b123 100644 --- a/test/fiddle/test_func.rb +++ b/test/fiddle/test_func.rb @@ -86,7 +86,12 @@ module Fiddle 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, |