fiddle 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +52 -1
- data/Rakefile +3 -5
- data/bin/downloader.rb +331 -0
- data/bin/extlibs.rb +262 -0
- data/ext/fiddle/closure.c +5 -4
- data/ext/fiddle/conversions.c +161 -16
- data/ext/fiddle/conversions.h +14 -4
- data/ext/fiddle/depend +83 -0
- data/ext/fiddle/extconf.rb +54 -28
- data/ext/fiddle/extlibs +10 -2
- data/ext/fiddle/fiddle.c +46 -35
- data/ext/fiddle/fiddle.h +35 -1
- data/ext/fiddle/function.c +220 -81
- data/ext/fiddle/handle.c +10 -12
- data/ext/fiddle/pinned.c +123 -0
- data/ext/fiddle/pointer.c +106 -24
- data/ext/fiddle/win32/fficonfig.h +0 -0
- data/ext/fiddle/win32/libffi-config.rb +1 -1
- data/ext/fiddle/win32/libffi.mk.tmpl +0 -0
- data/fiddle.gemspec +46 -4
- data/lib/fiddle.rb +3 -1
- data/lib/fiddle/cparser.rb +29 -2
- data/lib/fiddle/import.rb +11 -9
- data/lib/fiddle/pack.rb +14 -7
- data/lib/fiddle/struct.rb +267 -43
- data/lib/fiddle/value.rb +18 -9
- data/lib/fiddle/version.rb +3 -0
- metadata +13 -12
- data/.gitignore +0 -13
- data/.travis.yml +0 -7
- data/Gemfile +0 -4
- data/bin/console +0 -14
- data/bin/setup +0 -8
data/ext/fiddle/closure.c
CHANGED
@@ -13,11 +13,12 @@ typedef struct {
|
|
13
13
|
ffi_type **argv;
|
14
14
|
} fiddle_closure;
|
15
15
|
|
16
|
-
#if defined(
|
17
|
-
#elif defined(__OpenBSD__) || defined(__APPLE__) || defined(__linux__)
|
16
|
+
#if defined(__OpenBSD__)
|
18
17
|
# define USE_FFI_CLOSURE_ALLOC 0
|
19
|
-
#
|
20
|
-
|
18
|
+
#endif
|
19
|
+
|
20
|
+
#if defined(USE_FFI_CLOSURE_ALLOC)
|
21
|
+
#elif !defined(HAVE_FFI_CLOSURE_ALLOC)
|
21
22
|
# define USE_FFI_CLOSURE_ALLOC 0
|
22
23
|
#else
|
23
24
|
# define USE_FFI_CLOSURE_ALLOC 1
|
data/ext/fiddle/conversions.c
CHANGED
@@ -1,7 +1,115 @@
|
|
1
1
|
#include <fiddle.h>
|
2
2
|
|
3
|
+
VALUE
|
4
|
+
rb_fiddle_type_ensure(VALUE type)
|
5
|
+
{
|
6
|
+
VALUE original_type = type;
|
7
|
+
|
8
|
+
if (!RB_SYMBOL_P(type)) {
|
9
|
+
VALUE type_string = rb_check_string_type(type);
|
10
|
+
if (!NIL_P(type_string)) {
|
11
|
+
type = rb_to_symbol(type_string);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
|
15
|
+
if (RB_SYMBOL_P(type)) {
|
16
|
+
ID type_id = rb_sym2id(type);
|
17
|
+
ID void_id;
|
18
|
+
ID voidp_id;
|
19
|
+
ID char_id;
|
20
|
+
ID short_id;
|
21
|
+
ID int_id;
|
22
|
+
ID long_id;
|
23
|
+
#ifdef TYPE_LONG_LONG
|
24
|
+
ID long_long_id;
|
25
|
+
#endif
|
26
|
+
ID float_id;
|
27
|
+
ID double_id;
|
28
|
+
ID variadic_id;
|
29
|
+
ID const_string_id;
|
30
|
+
ID size_t_id;
|
31
|
+
ID ssize_t_id;
|
32
|
+
ID ptrdiff_t_id;
|
33
|
+
ID intptr_t_id;
|
34
|
+
ID uintptr_t_id;
|
35
|
+
RUBY_CONST_ID(void_id, "void");
|
36
|
+
RUBY_CONST_ID(voidp_id, "voidp");
|
37
|
+
RUBY_CONST_ID(char_id, "char");
|
38
|
+
RUBY_CONST_ID(short_id, "short");
|
39
|
+
RUBY_CONST_ID(int_id, "int");
|
40
|
+
RUBY_CONST_ID(long_id, "long");
|
41
|
+
#ifdef TYPE_LONG_LONG
|
42
|
+
RUBY_CONST_ID(long_long_id, "long_long");
|
43
|
+
#endif
|
44
|
+
RUBY_CONST_ID(float_id, "float");
|
45
|
+
RUBY_CONST_ID(double_id, "double");
|
46
|
+
RUBY_CONST_ID(variadic_id, "variadic");
|
47
|
+
RUBY_CONST_ID(const_string_id, "const_string");
|
48
|
+
RUBY_CONST_ID(size_t_id, "size_t");
|
49
|
+
RUBY_CONST_ID(ssize_t_id, "ssize_t");
|
50
|
+
RUBY_CONST_ID(ptrdiff_t_id, "ptrdiff_t");
|
51
|
+
RUBY_CONST_ID(intptr_t_id, "intptr_t");
|
52
|
+
RUBY_CONST_ID(uintptr_t_id, "uintptr_t");
|
53
|
+
if (type_id == void_id) {
|
54
|
+
return INT2NUM(TYPE_VOID);
|
55
|
+
}
|
56
|
+
else if (type_id == voidp_id) {
|
57
|
+
return INT2NUM(TYPE_VOIDP);
|
58
|
+
}
|
59
|
+
else if (type_id == char_id) {
|
60
|
+
return INT2NUM(TYPE_CHAR);
|
61
|
+
}
|
62
|
+
else if (type_id == short_id) {
|
63
|
+
return INT2NUM(TYPE_SHORT);
|
64
|
+
}
|
65
|
+
else if (type_id == int_id) {
|
66
|
+
return INT2NUM(TYPE_INT);
|
67
|
+
}
|
68
|
+
else if (type_id == long_id) {
|
69
|
+
return INT2NUM(TYPE_LONG);
|
70
|
+
}
|
71
|
+
#ifdef TYPE_LONG_LONG
|
72
|
+
else if (type_id == long_long_id) {
|
73
|
+
return INT2NUM(TYPE_LONG_LONG);
|
74
|
+
}
|
75
|
+
#endif
|
76
|
+
else if (type_id == float_id) {
|
77
|
+
return INT2NUM(TYPE_FLOAT);
|
78
|
+
}
|
79
|
+
else if (type_id == double_id) {
|
80
|
+
return INT2NUM(TYPE_DOUBLE);
|
81
|
+
}
|
82
|
+
else if (type_id == variadic_id) {
|
83
|
+
return INT2NUM(TYPE_VARIADIC);
|
84
|
+
}
|
85
|
+
else if (type_id == const_string_id) {
|
86
|
+
return INT2NUM(TYPE_CONST_STRING);
|
87
|
+
}
|
88
|
+
else if (type_id == size_t_id) {
|
89
|
+
return INT2NUM(TYPE_SIZE_T);
|
90
|
+
}
|
91
|
+
else if (type_id == ssize_t_id) {
|
92
|
+
return INT2NUM(TYPE_SSIZE_T);
|
93
|
+
}
|
94
|
+
else if (type_id == ptrdiff_t_id) {
|
95
|
+
return INT2NUM(TYPE_PTRDIFF_T);
|
96
|
+
}
|
97
|
+
else if (type_id == intptr_t_id) {
|
98
|
+
return INT2NUM(TYPE_INTPTR_T);
|
99
|
+
}
|
100
|
+
else if (type_id == uintptr_t_id) {
|
101
|
+
return INT2NUM(TYPE_UINTPTR_T);
|
102
|
+
}
|
103
|
+
else {
|
104
|
+
type = original_type;
|
105
|
+
}
|
106
|
+
}
|
107
|
+
|
108
|
+
return rb_to_int(type);
|
109
|
+
}
|
110
|
+
|
3
111
|
ffi_type *
|
4
|
-
|
112
|
+
rb_fiddle_int_to_ffi_type(int type)
|
5
113
|
{
|
6
114
|
int signed_p = 1;
|
7
115
|
|
@@ -33,66 +141,90 @@ int_to_ffi_type(int type)
|
|
33
141
|
return &ffi_type_float;
|
34
142
|
case TYPE_DOUBLE:
|
35
143
|
return &ffi_type_double;
|
144
|
+
case TYPE_CONST_STRING:
|
145
|
+
return &ffi_type_pointer;
|
36
146
|
default:
|
37
147
|
rb_raise(rb_eRuntimeError, "unknown type %d", type);
|
38
148
|
}
|
39
149
|
return &ffi_type_pointer;
|
40
150
|
}
|
41
151
|
|
152
|
+
ffi_type *
|
153
|
+
int_to_ffi_type(int type)
|
154
|
+
{
|
155
|
+
return rb_fiddle_int_to_ffi_type(type);
|
156
|
+
}
|
157
|
+
|
42
158
|
void
|
43
|
-
|
159
|
+
rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst)
|
44
160
|
{
|
45
161
|
switch (type) {
|
46
162
|
case TYPE_VOID:
|
47
163
|
break;
|
48
164
|
case TYPE_VOIDP:
|
49
|
-
dst->pointer = NUM2PTR(rb_Integer(src));
|
165
|
+
dst->pointer = NUM2PTR(rb_Integer(*src));
|
50
166
|
break;
|
51
167
|
case TYPE_CHAR:
|
52
|
-
dst->schar = (signed char)NUM2INT(src);
|
168
|
+
dst->schar = (signed char)NUM2INT(*src);
|
53
169
|
break;
|
54
170
|
case -TYPE_CHAR:
|
55
|
-
dst->uchar = (unsigned char)NUM2UINT(src);
|
171
|
+
dst->uchar = (unsigned char)NUM2UINT(*src);
|
56
172
|
break;
|
57
173
|
case TYPE_SHORT:
|
58
|
-
dst->sshort = (unsigned short)NUM2INT(src);
|
174
|
+
dst->sshort = (unsigned short)NUM2INT(*src);
|
59
175
|
break;
|
60
176
|
case -TYPE_SHORT:
|
61
|
-
dst->sshort = (signed short)NUM2UINT(src);
|
177
|
+
dst->sshort = (signed short)NUM2UINT(*src);
|
62
178
|
break;
|
63
179
|
case TYPE_INT:
|
64
|
-
dst->sint = NUM2INT(src);
|
180
|
+
dst->sint = NUM2INT(*src);
|
65
181
|
break;
|
66
182
|
case -TYPE_INT:
|
67
|
-
dst->uint = NUM2UINT(src);
|
183
|
+
dst->uint = NUM2UINT(*src);
|
68
184
|
break;
|
69
185
|
case TYPE_LONG:
|
70
|
-
dst->slong = NUM2LONG(src);
|
186
|
+
dst->slong = NUM2LONG(*src);
|
71
187
|
break;
|
72
188
|
case -TYPE_LONG:
|
73
|
-
dst->ulong = NUM2ULONG(src);
|
189
|
+
dst->ulong = NUM2ULONG(*src);
|
74
190
|
break;
|
75
191
|
#if HAVE_LONG_LONG
|
76
192
|
case TYPE_LONG_LONG:
|
77
|
-
dst->slong_long = NUM2LL(src);
|
193
|
+
dst->slong_long = NUM2LL(*src);
|
78
194
|
break;
|
79
195
|
case -TYPE_LONG_LONG:
|
80
|
-
dst->ulong_long = NUM2ULL(src);
|
196
|
+
dst->ulong_long = NUM2ULL(*src);
|
81
197
|
break;
|
82
198
|
#endif
|
83
199
|
case TYPE_FLOAT:
|
84
|
-
dst->ffloat = (float)NUM2DBL(src);
|
200
|
+
dst->ffloat = (float)NUM2DBL(*src);
|
85
201
|
break;
|
86
202
|
case TYPE_DOUBLE:
|
87
|
-
dst->ddouble = NUM2DBL(src);
|
203
|
+
dst->ddouble = NUM2DBL(*src);
|
204
|
+
break;
|
205
|
+
case TYPE_CONST_STRING:
|
206
|
+
if (NIL_P(*src)) {
|
207
|
+
dst->pointer = NULL;
|
208
|
+
}
|
209
|
+
else {
|
210
|
+
dst->pointer = rb_string_value_cstr(src);
|
211
|
+
}
|
88
212
|
break;
|
89
213
|
default:
|
90
214
|
rb_raise(rb_eRuntimeError, "unknown type %d", type);
|
91
215
|
}
|
92
216
|
}
|
93
217
|
|
218
|
+
void
|
219
|
+
value_to_generic(int type, VALUE src, fiddle_generic *dst)
|
220
|
+
{
|
221
|
+
/* src isn't safe from GC when type is TYPE_CONST_STRING and src
|
222
|
+
* isn't String. */
|
223
|
+
return rb_fiddle_value_to_generic(type, &src, dst);
|
224
|
+
}
|
225
|
+
|
94
226
|
VALUE
|
95
|
-
|
227
|
+
rb_fiddle_generic_to_value(VALUE rettype, fiddle_generic retval)
|
96
228
|
{
|
97
229
|
int type = NUM2INT(rettype);
|
98
230
|
VALUE cPointer;
|
@@ -131,6 +263,13 @@ generic_to_value(VALUE rettype, fiddle_generic retval)
|
|
131
263
|
return rb_float_new(retval.ffloat);
|
132
264
|
case TYPE_DOUBLE:
|
133
265
|
return rb_float_new(retval.ddouble);
|
266
|
+
case TYPE_CONST_STRING:
|
267
|
+
if (retval.pointer) {
|
268
|
+
return rb_str_new_cstr(retval.pointer);
|
269
|
+
}
|
270
|
+
else {
|
271
|
+
return Qnil;
|
272
|
+
}
|
134
273
|
default:
|
135
274
|
rb_raise(rb_eRuntimeError, "unknown type %d", type);
|
136
275
|
}
|
@@ -138,4 +277,10 @@ generic_to_value(VALUE rettype, fiddle_generic retval)
|
|
138
277
|
UNREACHABLE;
|
139
278
|
}
|
140
279
|
|
280
|
+
VALUE
|
281
|
+
generic_to_value(VALUE rettype, fiddle_generic retval)
|
282
|
+
{
|
283
|
+
return rb_fiddle_generic_to_value(rettype, retval);
|
284
|
+
}
|
285
|
+
|
141
286
|
/* vim: set noet sw=4 sts=4 */
|
data/ext/fiddle/conversions.h
CHANGED
@@ -24,13 +24,23 @@ typedef union
|
|
24
24
|
void * pointer; /* ffi_type_pointer */
|
25
25
|
} fiddle_generic;
|
26
26
|
|
27
|
+
/* Deprecated. Use rb_fiddle_*() version. */
|
28
|
+
VALUE rb_fiddle_type_ensure(VALUE type);
|
29
|
+
ffi_type * rb_fiddle_int_to_ffi_type(int type);
|
30
|
+
void rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst);
|
31
|
+
VALUE rb_fiddle_generic_to_value(VALUE rettype, fiddle_generic retval);
|
32
|
+
|
33
|
+
/* Deprecated. Use rb_fiddle_*() version. */
|
27
34
|
ffi_type * int_to_ffi_type(int type);
|
28
|
-
void value_to_generic(int type, VALUE src, fiddle_generic *
|
35
|
+
void value_to_generic(int type, VALUE src, fiddle_generic *dst);
|
29
36
|
VALUE generic_to_value(VALUE rettype, fiddle_generic retval);
|
30
37
|
|
31
|
-
#define VALUE2GENERIC(_type, _src, _dst)
|
32
|
-
|
33
|
-
#define
|
38
|
+
#define VALUE2GENERIC(_type, _src, _dst) \
|
39
|
+
rb_fiddle_value_to_generic((_type), &(_src), (_dst))
|
40
|
+
#define INT2FFI_TYPE(_type) \
|
41
|
+
rb_fiddle_int_to_ffi_type(_type)
|
42
|
+
#define GENERIC2VALUE(_type, _retval) \
|
43
|
+
rb_fiddle_generic_to_value((_type), (_retval))
|
34
44
|
|
35
45
|
#if SIZEOF_VOIDP == SIZEOF_LONG
|
36
46
|
# define PTR2NUM(x) (LONG2NUM((long)(x)))
|
data/ext/fiddle/depend
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
PWD =
|
2
|
+
|
3
|
+
CONFIGURE_LIBFFI = \
|
4
|
+
$(LIBFFI_CONFIGURE) --disable-shared \
|
5
|
+
--host=$(LIBFFI_ARCH) --enable-builddir=$(arch) \
|
6
|
+
CC="$(CC)" CFLAGS="$(LIBFFI_CFLAGS)" \
|
7
|
+
LD="$(LD)" LDFLAGS="$(LIBFFI_LDFLAGS)"
|
8
|
+
|
9
|
+
$(STATIC_LIB) $(RUBYARCHDIR)/$(DLLIB) $(DLLIB): $(LIBFFI_A)
|
10
|
+
|
11
|
+
$(OBJS): $(FFI_H)
|
12
|
+
|
13
|
+
.PHONY: .FORCE hdr
|
14
|
+
|
15
|
+
.FORCE:
|
16
|
+
|
17
|
+
hdr: $(FFI_H)
|
18
|
+
|
19
|
+
configure-libffi build-libffi: .FORCE
|
20
|
+
configure-libffi \
|
21
|
+
$(LIBFFI_DIR)/include/ffi.h \
|
22
|
+
$(LIBFFI_DIR)/include/ffitarget.h \
|
23
|
+
$(LIBFFI_DIR)/fficonfig.h \
|
24
|
+
$(LIBFFI_DIR)/Makefile:
|
25
|
+
$(Q) $(MAKEDIRS) $(LIBFFI_DIR)
|
26
|
+
$(Q) $(CONFIGURE_LIBFFI)
|
27
|
+
|
28
|
+
build-libffi $(LIBFFI_A):
|
29
|
+
$(Q) $(SUBMAKE_PRE) $(MAKE) $(SUBMAKE_ARG)
|
30
|
+
|
31
|
+
clean-none:
|
32
|
+
clean-libffi:
|
33
|
+
$(Q) $(SUBMAKE_PRE) $(MAKE) $(SUBMAKE_ARG) clean
|
34
|
+
|
35
|
+
distclean-none:
|
36
|
+
distclean-libffi:
|
37
|
+
$(Q) $(SUBMAKE_PRE) $(MAKE) $(SUBMAKE_ARG) distclean
|
38
|
+
$(Q) $(RM) $(LIBFFI_DIR)/local.exp
|
39
|
+
$(Q) $(RUBY) -rfileutils -e "FileUtils.rmdir(Dir.glob(ARGV[0]+'/**/{,.*/}'), :parents=>true)" $(LIBFFI_DIR)
|
40
|
+
|
41
|
+
realclean-none:
|
42
|
+
realclean-libffi:
|
43
|
+
$(Q) $(RMALL) $(LIBFFI_DIR)
|
44
|
+
|
45
|
+
.PHONY: clean-libffi distclean-libffi realclean-libffi
|
46
|
+
.PHONY: clean-none distclean-none realclean-none
|
47
|
+
|
48
|
+
clean: clean-$(LIBFFI_CLEAN)
|
49
|
+
distclean: distclean-$(LIBFFI_CLEAN)
|
50
|
+
realclean: realclean-$(LIBFFI_CLEAN)
|
51
|
+
|
52
|
+
.PHONY: configure configure-libffi
|
53
|
+
|
54
|
+
closure.o: closure.c
|
55
|
+
closure.o: closure.h
|
56
|
+
closure.o: conversions.h
|
57
|
+
closure.o: fiddle.h
|
58
|
+
closure.o: function.h
|
59
|
+
conversions.o: closure.h
|
60
|
+
conversions.o: conversions.c
|
61
|
+
conversions.o: conversions.h
|
62
|
+
conversions.o: fiddle.h
|
63
|
+
conversions.o: function.h
|
64
|
+
fiddle.o: closure.h
|
65
|
+
fiddle.o: conversions.h
|
66
|
+
fiddle.o: fiddle.c
|
67
|
+
fiddle.o: fiddle.h
|
68
|
+
fiddle.o: function.h
|
69
|
+
function.o: closure.h
|
70
|
+
function.o: conversions.h
|
71
|
+
function.o: fiddle.h
|
72
|
+
function.o: function.c
|
73
|
+
function.o: function.h
|
74
|
+
handle.o: closure.h
|
75
|
+
handle.o: conversions.h
|
76
|
+
handle.o: fiddle.h
|
77
|
+
handle.o: function.h
|
78
|
+
handle.o: handle.c
|
79
|
+
pointer.o: closure.h
|
80
|
+
pointer.o: conversions.h
|
81
|
+
pointer.o: fiddle.h
|
82
|
+
pointer.o: function.h
|
83
|
+
pointer.o: pointer.c
|
data/ext/fiddle/extconf.rb
CHANGED
@@ -3,22 +3,32 @@ require 'mkmf'
|
|
3
3
|
|
4
4
|
# :stopdoc:
|
5
5
|
|
6
|
+
libffi_version = nil
|
7
|
+
have_libffi = false
|
6
8
|
bundle = enable_config('bundled-libffi')
|
7
|
-
|
9
|
+
unless bundle
|
8
10
|
dir_config 'libffi'
|
9
11
|
|
10
|
-
pkg_config("libffi")
|
11
|
-
|
12
|
+
if pkg_config("libffi")
|
13
|
+
libffi_version = pkg_config("libffi", "modversion")
|
14
|
+
end
|
12
15
|
|
16
|
+
have_ffi_header = false
|
13
17
|
if have_header(ffi_header = 'ffi.h')
|
14
|
-
true
|
18
|
+
have_ffi_header = true
|
15
19
|
elsif have_header(ffi_header = 'ffi/ffi.h')
|
16
|
-
$defs.push(
|
17
|
-
true
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
$defs.push('-DUSE_HEADER_HACKS')
|
21
|
+
have_ffi_header = true
|
22
|
+
end
|
23
|
+
if have_ffi_header && (have_library('ffi') || have_library('libffi'))
|
24
|
+
have_libffi = true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
unless have_libffi
|
29
|
+
# for https://github.com/ruby/fiddle
|
30
|
+
extlibs_rb = File.expand_path("../../bin/extlibs.rb", $srcdir)
|
31
|
+
if bundle && File.exist?(extlibs_rb)
|
22
32
|
require "fileutils"
|
23
33
|
require_relative "../../bin/extlibs"
|
24
34
|
extlibs = ExtLibs.new
|
@@ -27,31 +37,32 @@ begin
|
|
27
37
|
Dir.glob("#{$srcdir}/libffi-*/").each{|dir| FileUtils.rm_rf(dir)}
|
28
38
|
extlibs.run(["--cache=#{cache_dir}", ext_dir])
|
29
39
|
end
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
40
|
+
if bundle != false
|
41
|
+
libffi_package_name = Dir.glob("#{$srcdir}/libffi-*/")
|
42
|
+
.map {|n| File.basename(n)}
|
43
|
+
.max_by {|n| n.scan(/\d+/).map(&:to_i)}
|
44
|
+
end
|
45
|
+
unless libffi_package_name
|
35
46
|
raise "missing libffi. Please install libffi."
|
36
47
|
end
|
37
48
|
|
38
|
-
|
49
|
+
libffi_srcdir = "#{$srcdir}/#{libffi_package_name}"
|
39
50
|
ffi_header = 'ffi.h'
|
40
51
|
libffi = Struct.new(*%I[dir srcdir builddir include lib a cflags ldflags opt arch]).new
|
41
|
-
libffi.dir =
|
52
|
+
libffi.dir = libffi_package_name
|
42
53
|
if $srcdir == "."
|
43
|
-
libffi.builddir =
|
54
|
+
libffi.builddir = libffi_package_name
|
44
55
|
libffi.srcdir = "."
|
45
56
|
else
|
46
57
|
libffi.builddir = libffi.dir
|
47
|
-
libffi.srcdir = relative_from(
|
58
|
+
libffi.srcdir = relative_from(libffi_srcdir, "..")
|
48
59
|
end
|
49
60
|
libffi.include = "#{libffi.builddir}/include"
|
50
61
|
libffi.lib = "#{libffi.builddir}/.libs"
|
51
62
|
libffi.a = "#{libffi.lib}/libffi_convenience.#{$LIBEXT}"
|
52
63
|
nowarn = CONFIG.merge("warnflags"=>"")
|
53
64
|
libffi.cflags = RbConfig.expand("$(CFLAGS)".dup, nowarn)
|
54
|
-
|
65
|
+
libffi_version = libffi_package_name[/libffi-(.*)/, 1]
|
55
66
|
|
56
67
|
FileUtils.mkdir_p(libffi.dir)
|
57
68
|
libffi.opt = CONFIG['configure_args'][/'(-C)'/, 1]
|
@@ -80,7 +91,6 @@ begin
|
|
80
91
|
args.concat %W[
|
81
92
|
--srcdir=#{libffi.srcdir}
|
82
93
|
--host=#{libffi.arch}
|
83
|
-
--enable-builddir=#{RUBY_PLATFORM}
|
84
94
|
]
|
85
95
|
args << ($enable_shared || !$static ? '--enable-shared' : '--enable-static')
|
86
96
|
args << libffi.opt if libffi.opt
|
@@ -97,7 +107,7 @@ begin
|
|
97
107
|
begin
|
98
108
|
IO.copy_stream(libffi.dir + "/config.log", Logging.instance_variable_get(:@logfile))
|
99
109
|
rescue SystemCallError => e
|
100
|
-
|
110
|
+
Logging.message("%s\n", e.message)
|
101
111
|
end
|
102
112
|
raise "failed to configure libffi. Please install libffi."
|
103
113
|
end
|
@@ -106,15 +116,31 @@ begin
|
|
106
116
|
FileUtils.rm_f("#{libffi.include}/ffitarget.h")
|
107
117
|
end
|
108
118
|
unless File.file?("#{libffi.include}/ffitarget.h")
|
109
|
-
FileUtils.cp("#{
|
119
|
+
FileUtils.cp("#{libffi_srcdir}/src/x86/ffitarget.h", libffi.include, preserve: true)
|
110
120
|
end
|
111
121
|
$INCFLAGS << " -I" << libffi.include
|
112
122
|
end
|
113
123
|
|
114
|
-
if
|
115
|
-
|
116
|
-
|
117
|
-
|
124
|
+
if libffi_version
|
125
|
+
# If libffi_version contains rc version, just ignored.
|
126
|
+
libffi_version = libffi_version.gsub(/-rc\d+/, '')
|
127
|
+
libffi_version = (libffi_version.split('.').map(&:to_i) + [0,0])[0,3]
|
128
|
+
$defs.push(%{-DRUBY_LIBFFI_MODVERSION=#{ '%d%03d%03d' % libffi_version }})
|
129
|
+
warn "libffi_version: #{libffi_version.join('.')}"
|
130
|
+
end
|
131
|
+
|
132
|
+
case
|
133
|
+
when $mswin, $mingw, (libffi_version && (libffi_version <=> [3, 2]) >= 0)
|
134
|
+
$defs << "-DUSE_FFI_CLOSURE_ALLOC=1"
|
135
|
+
when (libffi_version && (libffi_version <=> [3, 2]) < 0)
|
136
|
+
else
|
137
|
+
have_func('ffi_closure_alloc', ffi_header)
|
138
|
+
end
|
139
|
+
|
140
|
+
if libffi
|
141
|
+
$defs << "-DHAVE_FFI_PREP_CIF_VAR"
|
142
|
+
else
|
143
|
+
have_func('ffi_prep_cif_var', ffi_header)
|
118
144
|
end
|
119
145
|
|
120
146
|
have_header 'sys/mman.h'
|
@@ -141,7 +167,7 @@ types.each do |type, signed|
|
|
141
167
|
if /^\#define\s+SIZEOF_#{type}\s+(SIZEOF_(.+)|\d+)/ =~ config
|
142
168
|
if size = $2 and size != 'VOIDP'
|
143
169
|
size = types.fetch(size) {size}
|
144
|
-
$defs <<
|
170
|
+
$defs << "-DTYPE_#{signed||type}=TYPE_#{size}"
|
145
171
|
end
|
146
172
|
if signed
|
147
173
|
check_signedness(type.downcase, "stddef.h")
|