|
7 | 7 | if ! bundle
|
8 | 8 | dir_config 'libffi'
|
9 | 9 |
|
10 |
| - pkg_config("libffi") |
| 10 | + pkg_config("libffi") and |
| 11 | + ver = pkg_config("libffi", "modversion") |
11 | 12 |
|
12 | 13 | if have_header(ffi_header = 'ffi.h')
|
13 | 14 | true
|
14 | 15 | elsif have_header(ffi_header = 'ffi/ffi.h')
|
15 |
| - $defs.push(format('-DUSE_HEADER_HACKS')) |
| 16 | + $defs.push('-DUSE_HEADER_HACKS') |
16 | 17 | true
|
17 | 18 | end and (have_library('ffi') || have_library('libffi'))
|
18 | 19 | end or
|
|
27 | 28 | Dir.glob("#{$srcdir}/libffi-*/").each{|dir| FileUtils.rm_rf(dir)}
|
28 | 29 | extlibs.run(["--cache=#{cache_dir}", ext_dir])
|
29 | 30 | end
|
30 |
| - libffi_dir = bundle != false && |
| 31 | + ver = bundle != false && |
31 | 32 | Dir.glob("#{$srcdir}/libffi-*/")
|
32 | 33 | .map {|n| File.basename(n)}
|
33 | 34 | .max_by {|n| n.scan(/\d+/).map(&:to_i)}
|
34 |
| - unless libffi_dir |
| 35 | + unless ver |
35 | 36 | raise "missing libffi. Please install libffi."
|
36 | 37 | end
|
37 | 38 |
|
38 |
| - srcdir = "#{$srcdir}/#{libffi_dir}" |
| 39 | + srcdir = "#{$srcdir}/#{ver}" |
39 | 40 | ffi_header = 'ffi.h'
|
40 | 41 | libffi = Struct.new(*%I[dir srcdir builddir include lib a cflags ldflags opt arch]).new
|
41 |
| - libffi.dir = libffi_dir |
| 42 | + libffi.dir = ver |
42 | 43 | if $srcdir == "."
|
43 |
| - libffi.builddir = "#{libffi_dir}/#{RUBY_PLATFORM}" |
| 44 | + libffi.builddir = "#{ver}/#{RUBY_PLATFORM}" |
44 | 45 | libffi.srcdir = "."
|
45 | 46 | else
|
46 | 47 | libffi.builddir = libffi.dir
|
|
51 | 52 | libffi.a = "#{libffi.lib}/libffi_convenience.#{$LIBEXT}"
|
52 | 53 | nowarn = CONFIG.merge("warnflags"=>"")
|
53 | 54 | libffi.cflags = RbConfig.expand("$(CFLAGS)".dup, nowarn)
|
| 55 | + ver = ver[/libffi-(.*)/, 1] |
54 | 56 |
|
55 | 57 | FileUtils.mkdir_p(libffi.dir)
|
56 | 58 | libffi.opt = CONFIG['configure_args'][/'(-C)'/, 1]
|
|
110 | 112 | $INCFLAGS << " -I" << libffi.include
|
111 | 113 | end
|
112 | 114 |
|
| 115 | +if ver |
| 116 | + ver = ver.gsub(/-rc\d+/, '') # If ver contains rc version, just ignored. |
| 117 | + ver = (ver.split('.').map(&:to_i) + [0,0])[0,3] |
| 118 | + $defs.push(%{-DRUBY_LIBFFI_MODVERSION=#{ '%d%03d%03d' % ver }}) |
| 119 | + warn "libffi_version: #{ver.join('.')}" |
| 120 | +end |
| 121 | + |
| 122 | +case |
| 123 | +when $mswin, $mingw, (ver && (ver <=> [3, 2]) >= 0) |
| 124 | + $defs << "-DUSE_FFI_CLOSURE_ALLOC=1" |
| 125 | +when (ver && (ver <=> [3, 2]) < 0) |
| 126 | +else |
| 127 | + have_func('ffi_closure_alloc', ffi_header) |
| 128 | +end |
| 129 | + |
113 | 130 | have_header 'sys/mman.h'
|
114 | 131 |
|
115 | 132 | if have_header "dlfcn.h"
|
|
134 | 151 | if /^\#define\s+SIZEOF_#{type}\s+(SIZEOF_(.+)|\d+)/ =~ config
|
135 | 152 | if size = $2 and size != 'VOIDP'
|
136 | 153 | size = types.fetch(size) {size}
|
137 |
| - $defs << format("-DTYPE_%s=TYPE_%s", signed||type, size) |
| 154 | + $defs << "-DTYPE_#{signed||type}=TYPE_#{size}" |
138 | 155 | end
|
139 | 156 | if signed
|
140 | 157 | check_signedness(type.downcase, "stddef.h")
|
|
0 commit comments