mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	
							parent
							
								
									a40b390b17
								
							
						
					
					
						commit
						f2bcdc7283
					
				
				
				Notes:
				
					git
				
				2020-06-28 02:03:18 +09:00 
				
			
			
			
		
		
					 4 changed files with 54 additions and 32 deletions
				
			
		| 
						 | 
				
			
			@ -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-*/")
 | 
			
		||||
  if bundle
 | 
			
		||||
    libffi_package_name = Dir.glob("#{$srcdir}/libffi-*/")
 | 
			
		||||
                            .map {|n| File.basename(n)}
 | 
			
		||||
                            .max_by {|n| n.scan(/\d+/).map(&:to_i)}
 | 
			
		||||
  unless ver
 | 
			
		||||
  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
 | 
			
		||||
 | 
			
		||||
if libffi
 | 
			
		||||
  $defs << "-DHAVE_FFI_PREP_CIF_VAR"
 | 
			
		||||
else
 | 
			
		||||
  have_func('ffi_prep_cif_var', ffi_header)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
have_header 'sys/mman.h'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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"])
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue