rubysl-dl 0.0.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +0 -1
- data/.travis.yml +8 -0
- data/README.md +2 -2
- data/Rakefile +0 -1
- data/ext/rubysl/dl/depend +46 -0
- data/ext/rubysl/dl/dl.c +742 -0
- data/ext/rubysl/dl/dl.def +59 -0
- data/ext/rubysl/dl/dl.h +313 -0
- data/ext/rubysl/dl/extconf.rb +193 -0
- data/ext/rubysl/dl/h2rb +500 -0
- data/ext/rubysl/dl/handle.c +215 -0
- data/ext/rubysl/dl/install.rb +49 -0
- data/ext/rubysl/dl/lib/dl/import.rb +225 -0
- data/ext/rubysl/dl/lib/dl/struct.rb +149 -0
- data/ext/rubysl/dl/lib/dl/types.rb +245 -0
- data/ext/rubysl/dl/lib/dl/win32.rb +25 -0
- data/ext/rubysl/dl/mkcall.rb +69 -0
- data/ext/rubysl/dl/mkcallback.rb +63 -0
- data/ext/rubysl/dl/mkcbtable.rb +25 -0
- data/ext/rubysl/dl/ptr.c +1062 -0
- data/ext/rubysl/dl/sample/c++sample.C +35 -0
- data/ext/rubysl/dl/sample/c++sample.rb +60 -0
- data/ext/rubysl/dl/sample/drives.rb +70 -0
- data/ext/rubysl/dl/sample/getch.rb +5 -0
- data/ext/rubysl/dl/sample/libc.rb +69 -0
- data/ext/rubysl/dl/sample/msgbox.rb +19 -0
- data/ext/rubysl/dl/sample/msgbox2.rb +18 -0
- data/ext/rubysl/dl/sample/stream.rb +87 -0
- data/ext/rubysl/dl/sym.c +993 -0
- data/ext/rubysl/dl/test/libtest.def +28 -0
- data/ext/rubysl/dl/test/test.c +247 -0
- data/ext/rubysl/dl/test/test.rb +306 -0
- data/ext/rubysl/dl/type.rb +115 -0
- data/lib/dl.rb +1 -0
- data/lib/rubysl/dl.rb +2 -0
- data/lib/rubysl/dl/version.rb +5 -0
- data/rubysl-dl.gemspec +20 -18
- metadata +109 -87
- data/lib/rubysl-dl.rb +0 -7
- data/lib/rubysl-dl/version.rb +0 -5
@@ -0,0 +1,59 @@
|
|
1
|
+
EXPORTS
|
2
|
+
Init_dl
|
3
|
+
dlfree
|
4
|
+
dlmalloc
|
5
|
+
dlrealloc
|
6
|
+
dlstrdup
|
7
|
+
rb_ary_to_ptr
|
8
|
+
rb_dl_dlopen
|
9
|
+
rb_dl_malloc
|
10
|
+
rb_dl_strdup
|
11
|
+
rb_eDLError
|
12
|
+
rb_eDLTypeError
|
13
|
+
rb_io_to_ptr
|
14
|
+
rb_mDL
|
15
|
+
rb_str_to_ptr
|
16
|
+
Init_dlhandle
|
17
|
+
rb_cDLHandle
|
18
|
+
rb_dlhandle_close
|
19
|
+
rb_dlhandle_disable_close
|
20
|
+
rb_dlhandle_enable_close
|
21
|
+
rb_dlhandle_sym
|
22
|
+
Init_dlptr
|
23
|
+
rb_cDLPtrData
|
24
|
+
rb_dlmem_each
|
25
|
+
rb_dlptr2cptr
|
26
|
+
rb_dlptr_malloc
|
27
|
+
rb_dlptr_aref
|
28
|
+
rb_dlptr_aset
|
29
|
+
rb_dlptr_cmp
|
30
|
+
rb_dlptr_define_data_type
|
31
|
+
rb_dlptr_define_struct
|
32
|
+
rb_dlptr_define_union
|
33
|
+
rb_dlptr_eql
|
34
|
+
rb_dlptr_free_get
|
35
|
+
rb_dlptr_free_set
|
36
|
+
rb_dlptr_get_data_type
|
37
|
+
rb_dlptr_inspect
|
38
|
+
rb_dlptr_minus
|
39
|
+
rb_dlptr_new
|
40
|
+
rb_dlptr_new2
|
41
|
+
rb_dlptr_null_p
|
42
|
+
rb_dlptr_plus
|
43
|
+
rb_dlptr_ptr
|
44
|
+
rb_dlptr_ref
|
45
|
+
rb_dlptr_to_array
|
46
|
+
rb_dlptr_to_i
|
47
|
+
rb_dlptr_to_s
|
48
|
+
rb_dlptr_to_str
|
49
|
+
rb_mDLMemorySpace
|
50
|
+
Init_dlsym
|
51
|
+
rb_cDLSymbol
|
52
|
+
rb_dlsym2csym
|
53
|
+
rb_dlsym_call
|
54
|
+
rb_dlsym_cproto
|
55
|
+
rb_dlsym_inspect
|
56
|
+
rb_dlsym_name
|
57
|
+
rb_dlsym_new
|
58
|
+
rb_dlsym_proto
|
59
|
+
rb_dlsym_to_ptr
|
data/ext/rubysl/dl/dl.h
ADDED
@@ -0,0 +1,313 @@
|
|
1
|
+
/* -*- C -*-
|
2
|
+
* $Id: dl.h 11708 2007-02-12 23:01:19Z shyouhei $
|
3
|
+
*/
|
4
|
+
|
5
|
+
#ifndef RUBY_DL_H
|
6
|
+
#define RUBY_DL_H
|
7
|
+
|
8
|
+
#include <ruby.h>
|
9
|
+
#include <dlconfig.h>
|
10
|
+
|
11
|
+
#if defined(HAVE_DLFCN_H)
|
12
|
+
# include <dlfcn.h>
|
13
|
+
# /* some stranger systems may not define all of these */
|
14
|
+
#ifndef RTLD_LAZY
|
15
|
+
#define RTLD_LAZY 0
|
16
|
+
#endif
|
17
|
+
#ifndef RTLD_GLOBAL
|
18
|
+
#define RTLD_GLOBAL 0
|
19
|
+
#endif
|
20
|
+
#ifndef RTLD_NOW
|
21
|
+
#define RTLD_NOW 0
|
22
|
+
#endif
|
23
|
+
#else
|
24
|
+
# if defined(HAVE_WINDOWS_H)
|
25
|
+
# include <windows.h>
|
26
|
+
# define dlclose(ptr) FreeLibrary((HINSTANCE)ptr)
|
27
|
+
# define dlopen(name,flag) ((void*)LoadLibrary(name))
|
28
|
+
# define dlerror() "unknown error"
|
29
|
+
# define dlsym(handle,name) ((void*)GetProcAddress(handle,name))
|
30
|
+
# define RTLD_LAZY -1
|
31
|
+
# define RTLD_NOW -1
|
32
|
+
# define RTLD_GLOBAL -1
|
33
|
+
# endif
|
34
|
+
#endif
|
35
|
+
|
36
|
+
#if !defined(StringValue)
|
37
|
+
# define StringValue(v) if(TYPE(v) != T_STRING) v = rb_str_to_str(v)
|
38
|
+
#endif
|
39
|
+
#if !defined(StringValuePtr)
|
40
|
+
# define StringValuePtr(v) RSTRING((TYPE(v) == T_STRING) ? (v) : rb_str_to_str(v))->ptr
|
41
|
+
#endif
|
42
|
+
|
43
|
+
#ifdef DEBUG
|
44
|
+
#define DEBUG_CODE(b) {printf("DEBUG:%d\n",__LINE__);b;}
|
45
|
+
#define DEBUG_CODE2(b1,b2) {printf("DEBUG:%d\n",__LINE__);b1;}
|
46
|
+
#else
|
47
|
+
#define DEBUG_CODE(b)
|
48
|
+
#define DEBUG_CODE2(b1,b2) b2
|
49
|
+
#endif
|
50
|
+
|
51
|
+
#define VOID_DLTYPE 0x00
|
52
|
+
#define CHAR_DLTYPE 0x01
|
53
|
+
#define SHORT_DLTYPE 0x02
|
54
|
+
#define INT_DLTYPE 0x03
|
55
|
+
#define LONG_DLTYPE 0x04
|
56
|
+
#define FLOAT_DLTYPE 0x05
|
57
|
+
#define DOUBLE_DLTYPE 0x06
|
58
|
+
#define VOIDP_DLTYPE 0x07
|
59
|
+
|
60
|
+
#define ARG_TYPE(x,i) (((x) & (0x07 << ((i)*3))) >> ((i)*3))
|
61
|
+
#define PUSH_ARG(x,t) do{x <<= 3; x |= t;}while(0)
|
62
|
+
#define PUSH_0(x) PUSH_ARG(x,VOID_DLTYPE)
|
63
|
+
|
64
|
+
#if SIZEOF_INT == SIZEOF_LONG
|
65
|
+
# define PUSH_I(x) PUSH_ARG(x,LONG_DLTYPE)
|
66
|
+
# define ANY2I(x) x.l
|
67
|
+
# define DLINT(x) (long)x
|
68
|
+
#else
|
69
|
+
# define PUSH_I(x) PUSH_ARG(x,INT_DLTYPE)
|
70
|
+
# define ANY2I(x) x.i
|
71
|
+
# define DLINT(x) (int)x
|
72
|
+
#endif
|
73
|
+
#define PUSH_L(x) PUSH_ARG(x,LONG_DLTYPE)
|
74
|
+
#define ANY2L(x) x.l
|
75
|
+
#define DLLONG(x) (long)x
|
76
|
+
|
77
|
+
#if defined(WITH_TYPE_FLOAT)
|
78
|
+
# if SIZEOF_FLOAT == SIZEOF_DOUBLE
|
79
|
+
# define PUSH_F(x) PUSH_ARG(x,DOUBLE_DLTYPE)
|
80
|
+
# define ANY2F(x) (x.d)
|
81
|
+
# define DLFLOAT(x) ((double)x)
|
82
|
+
# else
|
83
|
+
# define PUSH_F(x) PUSH_ARG(x,FLOAT_DLTYPE)
|
84
|
+
# define ANY2F(x) (x.f)
|
85
|
+
# define DLFLOAT(x) ((float)x)
|
86
|
+
# endif
|
87
|
+
#else
|
88
|
+
# define PUSH_F(x) PUSH_ARG(x,DOUBLE_DLTYPE)
|
89
|
+
# define ANY2F(x) (x.d)
|
90
|
+
# define DLFLOAT(x) ((double)x)
|
91
|
+
#endif
|
92
|
+
#define PUSH_D(x) PUSH_ARG(x,DOUBLE_DLTYPE)
|
93
|
+
#define ANY2D(x) (x.d)
|
94
|
+
#define DLDOUBLE(x) ((double)x)
|
95
|
+
|
96
|
+
#if SIZEOF_INT == SIZEOF_VOIDP && SIZEOF_INT != SIZEOF_LONG
|
97
|
+
# define PUSH_P(x) PUSH_ARG(x,INT_DLTYPE)
|
98
|
+
# define ANY2P(x) (x.i)
|
99
|
+
# define DLVOIDP(x) ((int)x)
|
100
|
+
#elif SIZEOF_LONG == SIZEOF_VOIDP
|
101
|
+
# define PUSH_P(x) PUSH_ARG(x,LONG_DLTYPE)
|
102
|
+
# define ANY2P(x) (x.l)
|
103
|
+
# define DLVOIDP(x) ((long)x)
|
104
|
+
#else
|
105
|
+
# define PUSH_P(x) PUSH_ARG(x,VOIDP_DLTYPE)
|
106
|
+
# define ANY2P(x) (x.p)
|
107
|
+
# define DLVOIDP(x) ((void*)p)
|
108
|
+
#endif
|
109
|
+
|
110
|
+
#if defined(WITH_TYPE_CHAR)
|
111
|
+
# define PUSH_C(x) PUSH_ARG(x,CHAR_DLTYPE)
|
112
|
+
# define ANY2C(x) (x.c)
|
113
|
+
# define DLCHAR(x) ((char)x)
|
114
|
+
#else
|
115
|
+
# define PUSH_C(x) PUSH_I(x)
|
116
|
+
# define ANY2C(x) ANY2I(x)
|
117
|
+
# define DLCHAR(x) DLINT(x)
|
118
|
+
#endif
|
119
|
+
|
120
|
+
#if defined(WITH_TYPE_SHORT)
|
121
|
+
# define PUSH_H(x) PUSH_ARG(x,SHORT_DLTYPE)
|
122
|
+
# define ANY2H(x) (x.h)
|
123
|
+
# define DLSHORT(x) ((short)x)
|
124
|
+
#else
|
125
|
+
# define PUSH_H(x) PUSH_I(x)
|
126
|
+
# define ANY2H(x) ANY2I(x)
|
127
|
+
# define DLSHORT(x) DLINT(x)
|
128
|
+
#endif
|
129
|
+
|
130
|
+
#define PUSH_S(x) PUSH_P(x)
|
131
|
+
#define ANY2S(x) ANY2P(x)
|
132
|
+
#define DLSTR(x) DLVOIDP(x)
|
133
|
+
|
134
|
+
#define CBPUSH_0(x) PUSH_0(x)
|
135
|
+
#define CBPUSH_C(x) PUSH_C(x)
|
136
|
+
#define CBPUSH_H(x) PUSH_H(x)
|
137
|
+
#define CBPUSH_I(x) PUSH_I(x)
|
138
|
+
#define CBPUSH_L(x) PUSH_L(x)
|
139
|
+
#define CBPUSH_F(x) PUSH_F(x)
|
140
|
+
#define CBPUSH_D(x) PUSH_D(x)
|
141
|
+
#if defined(WITH_CBTYPE_VOIDP)
|
142
|
+
# define CBPUSH_P(x) PUSH_ARG(x,VOIDP_DLTYPE)
|
143
|
+
#else
|
144
|
+
# define CBPUSH_P(x) PUSH_P(x)
|
145
|
+
#endif
|
146
|
+
|
147
|
+
|
148
|
+
#if defined(USE_INLINE_ASM)
|
149
|
+
# if defined(__i386__) && defined(__GNUC__)
|
150
|
+
# define DLSTACK
|
151
|
+
# define DLSTACK_METHOD "asm"
|
152
|
+
# define DLSTACK_REVERSE
|
153
|
+
# define DLSTACK_PROTO
|
154
|
+
# define DLSTACK_ARGS
|
155
|
+
# define DLSTACK_START(sym)
|
156
|
+
# define DLSTACK_END(sym)
|
157
|
+
# define DLSTACK_PUSH_C(x) asm volatile ("pushl %0" :: "g" (x));
|
158
|
+
# define DLSTACK_PUSH_H(x) asm volatile ("pushl %0" :: "g" (x));
|
159
|
+
# define DLSTACK_PUSH_I(x) asm volatile ("pushl %0" :: "g" (x));
|
160
|
+
# define DLSTACK_PUSH_L(x) asm volatile ("pushl %0" :: "g" (x));
|
161
|
+
# define DLSTACK_PUSH_P(x) asm volatile ("pushl %0" :: "g" (x));
|
162
|
+
# define DLSTACK_PUSH_F(x) asm volatile ("flds %0"::"g"(x));\
|
163
|
+
asm volatile ("subl $4,%esp");\
|
164
|
+
asm volatile ("fstps (%esp)");
|
165
|
+
# define DLSTACK_PUSH_D(x) asm volatile ("fldl %0"::"g"(x));\
|
166
|
+
asm volatile ("subl $8,%esp");\
|
167
|
+
asm volatile ("fstpl (%esp)")
|
168
|
+
# else
|
169
|
+
# error --with-asm is not supported on this machine
|
170
|
+
# endif
|
171
|
+
#elif defined(USE_DLSTACK)
|
172
|
+
# define DLSTACK
|
173
|
+
# define DLSTACK_GUARD
|
174
|
+
# define DLSTACK_METHOD "dl"
|
175
|
+
# define DLSTACK_PROTO long,long,long,long,long,\
|
176
|
+
long,long,long,long,long,\
|
177
|
+
long,long,long,long,long
|
178
|
+
# define DLSTACK_ARGS stack[0],stack[1],stack[2],stack[3],stack[4],\
|
179
|
+
stack[5],stack[6],stack[7],stack[8],stack[9],\
|
180
|
+
stack[10],stack[11],stack[12],stack[13],stack[14]
|
181
|
+
# define DLSTACK_SIZE (sizeof(long)*15)
|
182
|
+
# define DLSTACK_START(sym)
|
183
|
+
# define DLSTACK_END(sym)
|
184
|
+
# define DLSTACK_PUSH_C(x) {long v=(long)x; memcpy(sp,&v,sizeof(long)); sp++;}
|
185
|
+
# define DLSTACK_PUSH_H(x) {long v=(long)x; memcpy(sp,&v,sizeof(long)); sp++;}
|
186
|
+
# define DLSTACK_PUSH_I(x) {long v=(long)x; memcpy(sp,&v,sizeof(long)); sp++;}
|
187
|
+
# define DLSTACK_PUSH_L(x) memcpy(sp,&x,sizeof(long)); sp++;
|
188
|
+
# define DLSTACK_PUSH_P(x) memcpy(sp,&x,sizeof(void*)); sp++;
|
189
|
+
# define DLSTACK_PUSH_F(x) memcpy(sp,&x,sizeof(float)); sp+=sizeof(float)/sizeof(long);
|
190
|
+
# define DLSTACK_PUSH_D(x) memcpy(sp,&x,sizeof(double)); sp+=sizeof(double)/sizeof(long);
|
191
|
+
#else
|
192
|
+
# define DLSTACK_METHOD "none"
|
193
|
+
#endif
|
194
|
+
|
195
|
+
extern VALUE rb_mDL;
|
196
|
+
extern VALUE rb_mDLMemorySpace;
|
197
|
+
extern VALUE rb_cDLHandle;
|
198
|
+
extern VALUE rb_cDLSymbol;
|
199
|
+
extern VALUE rb_cDLPtrData;
|
200
|
+
extern VALUE rb_cDLStructData;
|
201
|
+
|
202
|
+
extern VALUE rb_eDLError;
|
203
|
+
extern VALUE rb_eDLTypeError;
|
204
|
+
|
205
|
+
#if defined(LONG2NUM) && (SIZEOF_LONG == SIZEOF_VOIDP)
|
206
|
+
# define DLLONG2NUM(x) LONG2NUM((long)x)
|
207
|
+
# define DLNUM2LONG(x) (long)(NUM2LONG(x))
|
208
|
+
#else
|
209
|
+
# define DLLONG2NUM(x) INT2NUM((long)x)
|
210
|
+
# define DLNUM2LONG(x) (long)(NUM2INT(x))
|
211
|
+
#endif
|
212
|
+
|
213
|
+
typedef struct { char c; void *x; } s_voidp;
|
214
|
+
typedef struct { char c; short x; } s_short;
|
215
|
+
typedef struct { char c; int x; } s_int;
|
216
|
+
typedef struct { char c; long x; } s_long;
|
217
|
+
typedef struct { char c; float x; } s_float;
|
218
|
+
typedef struct { char c; double x; } s_double;
|
219
|
+
|
220
|
+
#define ALIGN_VOIDP (sizeof(s_voidp) - sizeof(void *))
|
221
|
+
#define ALIGN_SHORT (sizeof(s_short) - sizeof(short))
|
222
|
+
#define ALIGN_INT (sizeof(s_int) - sizeof(int))
|
223
|
+
#define ALIGN_LONG (sizeof(s_long) - sizeof(long))
|
224
|
+
#define ALIGN_FLOAT (sizeof(s_float) - sizeof(float))
|
225
|
+
#define ALIGN_DOUBLE (sizeof(s_double) - sizeof(double))
|
226
|
+
|
227
|
+
/* for compatibility */
|
228
|
+
#define VOIDP_ALIGN ALIGN_VOIDP
|
229
|
+
#define SHORT_ALIGN ALIGN_SHORT
|
230
|
+
#define INT_ALIGN ALIGN_INT
|
231
|
+
#define LONG_ALIGN ALIGN_LONG
|
232
|
+
#define FLOAT_ALIGN ALIGN_FLOAT
|
233
|
+
#define DOUBLE_ALIGN ALIGN_DOUBLE
|
234
|
+
|
235
|
+
#define DLALIGN(ptr,offset,align) {\
|
236
|
+
while( (((unsigned long)((char *)ptr + offset)) % align) != 0 ) offset++;\
|
237
|
+
}
|
238
|
+
|
239
|
+
typedef void (*freefunc_t)(void *);
|
240
|
+
#define DLFREEFUNC(func) ((freefunc_t)(func))
|
241
|
+
|
242
|
+
typedef union {
|
243
|
+
void* p;
|
244
|
+
char c;
|
245
|
+
short h;
|
246
|
+
int i;
|
247
|
+
long l;
|
248
|
+
float f;
|
249
|
+
double d;
|
250
|
+
char *s;
|
251
|
+
} ANY_TYPE;
|
252
|
+
|
253
|
+
struct dl_handle {
|
254
|
+
void *ptr;
|
255
|
+
int open;
|
256
|
+
int enable_close;
|
257
|
+
};
|
258
|
+
|
259
|
+
struct sym_data {
|
260
|
+
void *func;
|
261
|
+
char *name;
|
262
|
+
char *type;
|
263
|
+
int len;
|
264
|
+
};
|
265
|
+
|
266
|
+
enum DLPTR_CTYPE {
|
267
|
+
DLPTR_CTYPE_UNKNOWN,
|
268
|
+
DLPTR_CTYPE_STRUCT,
|
269
|
+
DLPTR_CTYPE_UNION
|
270
|
+
};
|
271
|
+
|
272
|
+
struct ptr_data {
|
273
|
+
void *ptr; /* a pointer to the data */
|
274
|
+
freefunc_t free; /* free() */
|
275
|
+
char *stype; /* array of type specifiers */
|
276
|
+
int *ssize; /* size[i] = sizeof(type[i]) > 0 */
|
277
|
+
int slen; /* the number of type specifiers */
|
278
|
+
ID *ids;
|
279
|
+
int ids_num;
|
280
|
+
int ctype; /* DLPTR_CTYPE_UNKNOWN, DLPTR_CTYPE_STRUCT, DLPTR_CTYPE_UNION */
|
281
|
+
long size;
|
282
|
+
};
|
283
|
+
|
284
|
+
#define RDLPTR(obj) ((struct ptr_data *)(DATA_PTR(obj)))
|
285
|
+
#define RDLSYM(obj) ((struct sym_data *)(DATA_PTR(obj)))
|
286
|
+
|
287
|
+
void dlfree(void*);
|
288
|
+
void *dlmalloc(size_t);
|
289
|
+
void *dlrealloc(void*,size_t);
|
290
|
+
char *dlstrdup(const char *);
|
291
|
+
size_t dlsizeof(const char *);
|
292
|
+
|
293
|
+
void *rb_ary2cary(char t, VALUE ary, long *size);
|
294
|
+
|
295
|
+
/*
|
296
|
+
void rb_dlmem_delete(void *ptr);
|
297
|
+
void rb_dlmem_aset(void *ptr, VALUE obj);
|
298
|
+
VALUE rb_dlmem_aref(void *ptr);
|
299
|
+
*/
|
300
|
+
|
301
|
+
void dlptr_free(struct ptr_data *data);
|
302
|
+
void dlptr_init(VALUE val);
|
303
|
+
|
304
|
+
VALUE rb_dlptr_new(void *ptr, long size, freefunc_t func);
|
305
|
+
VALUE rb_dlptr_new2(VALUE klass, void *ptr, long size, freefunc_t func);
|
306
|
+
VALUE rb_dlptr_malloc(long size, freefunc_t func);
|
307
|
+
void *rb_dlptr2cptr(VALUE val);
|
308
|
+
|
309
|
+
VALUE rb_dlsym_new(void (*func)(), const char *name, const char *type);
|
310
|
+
freefunc_t rb_dlsym2csym(VALUE val);
|
311
|
+
|
312
|
+
|
313
|
+
#endif /* RUBY_DL_H */
|
@@ -0,0 +1,193 @@
|
|
1
|
+
require 'mkmf'
|
2
|
+
|
3
|
+
begin # for the exception SystemExit
|
4
|
+
|
5
|
+
$:.unshift File.dirname(__FILE__)
|
6
|
+
require 'type'
|
7
|
+
|
8
|
+
if( ARGV.include?("--help") )
|
9
|
+
print <<EOF
|
10
|
+
--help print this messages
|
11
|
+
--with-type-char strictly use type 'char'
|
12
|
+
--with-type-short strictly use type 'short'
|
13
|
+
--with-type-float strictly use type 'float'
|
14
|
+
--with-args=<max_arg>
|
15
|
+
--with-callback=<max_callback>
|
16
|
+
--enable-asm use the embedded assembler for passing arguments.
|
17
|
+
(this option is available for i386 machine now.)
|
18
|
+
--enable-dlstack use a stack emulation for constructing function call.
|
19
|
+
EOF
|
20
|
+
exit(0)
|
21
|
+
end
|
22
|
+
|
23
|
+
($CPPFLAGS || $CFLAGS) << " -I."
|
24
|
+
|
25
|
+
if (RbConfig::CONFIG['CC'] =~ /gcc/) # from Win32API
|
26
|
+
$CFLAGS << " -fno-defer-pop -fno-omit-frame-pointer"
|
27
|
+
end
|
28
|
+
|
29
|
+
$with_dlstack ||= true
|
30
|
+
$with_asm = ! $with_dlstack
|
31
|
+
|
32
|
+
$with_type_int = try_cpp(<<EOF)
|
33
|
+
#include "config.h"
|
34
|
+
#if SIZEOF_INT == SIZEOF_LONG
|
35
|
+
#error int not needed
|
36
|
+
#endif
|
37
|
+
EOF
|
38
|
+
|
39
|
+
$with_type_float = try_cpp(<<EOF)
|
40
|
+
#include "config.h"
|
41
|
+
#if SIZEOF_FLOAT == SIZEOF_DOUBLE
|
42
|
+
#error float not needed
|
43
|
+
#endif
|
44
|
+
EOF
|
45
|
+
|
46
|
+
$with_type_voidp = try_cpp(<<EOF)
|
47
|
+
#include "config.h"
|
48
|
+
#if SIZEOF_VOIDP == SIZEOF_INT || SIZEOF_VOIDP == SIZEOF_LONG
|
49
|
+
#error void* not needed
|
50
|
+
#endif
|
51
|
+
EOF
|
52
|
+
|
53
|
+
$with_type_char = DLTYPE[CHAR][:sym]
|
54
|
+
$with_type_short = DLTYPE[SHORT][:sym]
|
55
|
+
$with_type_long = DLTYPE[LONG][:sym]
|
56
|
+
$with_type_double= DLTYPE[DOUBLE][:sym]
|
57
|
+
$with_type_int &= DLTYPE[INT][:sym]
|
58
|
+
$with_type_float &= DLTYPE[FLOAT][:sym]
|
59
|
+
$with_type_voidp &= DLTYPE[VOIDP][:sym]
|
60
|
+
|
61
|
+
$with_type_char = enable_config("type-char", $with_type_char)
|
62
|
+
$with_type_short = enable_config("type-short", $with_type_short)
|
63
|
+
$with_type_float = enable_config("type-float", $with_type_float)
|
64
|
+
|
65
|
+
$with_asm = enable_config("asm", $with_asm)
|
66
|
+
$with_dlstack = enable_config("dlstack", $with_dlstack)
|
67
|
+
|
68
|
+
args = with_config("args")
|
69
|
+
max_arg = nil
|
70
|
+
if( $with_asm || $with_dlstack )
|
71
|
+
$with_type_char = true
|
72
|
+
$with_type_short = true
|
73
|
+
$with_type_float = true
|
74
|
+
max_arg = 0
|
75
|
+
end
|
76
|
+
if( args )
|
77
|
+
max_arg = args.to_i
|
78
|
+
if( !max_arg )
|
79
|
+
print("--with-args=<max_arg>\n")
|
80
|
+
exit(1)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
max_arg ||= 6
|
84
|
+
|
85
|
+
max_callback = with_config("callback","10").to_i
|
86
|
+
callback_types = DLTYPE.keys.length
|
87
|
+
|
88
|
+
|
89
|
+
$dlconfig_h = <<EOF
|
90
|
+
#define MAX_ARG #{max_arg}
|
91
|
+
EOF
|
92
|
+
|
93
|
+
def dlc_define(const)
|
94
|
+
$dlconfig_h << "#if !defined(#{const})\n" +
|
95
|
+
"# define #{const}\n" +
|
96
|
+
"#endif\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
$dlconfig_h << "#define MAX_CALLBACK #{max_callback}\n"
|
100
|
+
$dlconfig_h << "#define CALLBACK_TYPES #{callback_types}\n"
|
101
|
+
if( $with_dlstack )
|
102
|
+
$dlconfig_h << "#define USE_DLSTACK\n"
|
103
|
+
else
|
104
|
+
if( $with_asm )
|
105
|
+
$dlconfig_h << "#define USE_INLINE_ASM\n"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
if( $with_type_char )
|
109
|
+
$dlconfig_h << "#define WITH_TYPE_CHAR\n"
|
110
|
+
end
|
111
|
+
if( $with_type_short )
|
112
|
+
$dlconfig_h << "#define WITH_TYPE_SHORT\n"
|
113
|
+
end
|
114
|
+
if( $with_type_long )
|
115
|
+
$dlconfig_h << "#define WITH_TYPE_LONG\n"
|
116
|
+
end
|
117
|
+
if( $with_type_double )
|
118
|
+
$dlconfig_h << "#define WITH_TYPE_DOUBLE\n"
|
119
|
+
end
|
120
|
+
if( $with_type_float )
|
121
|
+
$dlconfig_h << "#define WITH_TYPE_FLOAT\n"
|
122
|
+
end
|
123
|
+
if( $with_type_int )
|
124
|
+
$dlconfig_h << "#define WITH_TYPE_INT\n"
|
125
|
+
end
|
126
|
+
if( $with_type_voidp )
|
127
|
+
$dlconfig_h << "#define WITH_TYPE_VOIDP\n"
|
128
|
+
end
|
129
|
+
|
130
|
+
if( have_header("windows.h") )
|
131
|
+
have_library("kernel32")
|
132
|
+
have_func("GetLastError", "windows.h")
|
133
|
+
dlc_define("HAVE_WINDOWS_H")
|
134
|
+
have_windows_h = true
|
135
|
+
end
|
136
|
+
|
137
|
+
if( have_header("dlfcn.h") )
|
138
|
+
dlc_define("HAVE_DLFCN_H")
|
139
|
+
have_library("dl")
|
140
|
+
have_func("dlopen")
|
141
|
+
have_func("dlclose")
|
142
|
+
have_func("dlsym")
|
143
|
+
if( have_func("dlerror") )
|
144
|
+
dlc_define("HAVE_DLERROR")
|
145
|
+
end
|
146
|
+
elsif ( have_windows_h )
|
147
|
+
have_func("LoadLibrary")
|
148
|
+
have_func("FreeLibrary")
|
149
|
+
have_func("GetProcAddress")
|
150
|
+
else
|
151
|
+
exit(0)
|
152
|
+
end
|
153
|
+
|
154
|
+
def File.update(file, str)
|
155
|
+
begin
|
156
|
+
open(file){|f|f.read} == str
|
157
|
+
rescue Errno::ENOENT
|
158
|
+
false
|
159
|
+
end or open(file, "w"){|f|f.print(str)}
|
160
|
+
end
|
161
|
+
|
162
|
+
File.update("dlconfig.h", <<EOF)
|
163
|
+
#ifndef DLCONFIG_H
|
164
|
+
#define DLCONFIG_H
|
165
|
+
#{$dlconfig_h}
|
166
|
+
#endif /* DLCONFIG_H */
|
167
|
+
EOF
|
168
|
+
|
169
|
+
File.update("dlconfig.rb", <<EOF)
|
170
|
+
MAX_ARG = #{max_arg}
|
171
|
+
MAX_CALLBACK = #{max_callback}
|
172
|
+
CALLBACK_TYPES = #{callback_types}
|
173
|
+
DLTYPE[CHAR][:sym] = #{$with_type_char}
|
174
|
+
DLTYPE[SHORT][:sym] = #{$with_type_short}
|
175
|
+
DLTYPE[INT][:sym] = #{$with_type_int}
|
176
|
+
DLTYPE[LONG][:sym] = #{$with_type_long}
|
177
|
+
DLTYPE[FLOAT][:sym] = #{$with_type_float}
|
178
|
+
DLTYPE[DOUBLE][:sym]= #{$with_type_double}
|
179
|
+
DLTYPE[VOIDP][:sym] = #{$with_type_voidp}
|
180
|
+
EOF
|
181
|
+
|
182
|
+
$INSTALLFILES = [
|
183
|
+
["./dlconfig.h", "$(archdir)$(target_prefix)", "."],
|
184
|
+
["dl.h", "$(archdir)$(target_prefix)", ""],
|
185
|
+
]
|
186
|
+
$cleanfiles = %w[test/test.o]
|
187
|
+
$distcleanfiles = %w[call.func callback.func cbtable.func dlconfig.rb
|
188
|
+
./dlconfig.h test/libtest.so test/*~ *~ mkmf.log]
|
189
|
+
|
190
|
+
create_makefile('dl')
|
191
|
+
rescue SystemExit
|
192
|
+
# do nothing
|
193
|
+
end
|