@@ -888,6 +888,9 @@ class db_found(Exception): pass
888
888
if (dl_inc is not None ) and (platform not in ['atheos' , 'darwin' ]):
889
889
exts .append ( Extension ('dl' , ['dlmodule.c' ]) )
890
890
891
+ # Thomas Heller's _ctypes module
892
+ self .detect_ctypes ()
893
+
891
894
# Platform-specific libraries
892
895
if platform == 'linux2' :
893
896
# Linux-specific modules
@@ -1180,6 +1183,61 @@ def detect_tkinter(self, inc_dirs, lib_dirs):
1180
1183
# *** Uncomment these for TOGL extension only:
1181
1184
# -lGL -lGLU -lXext -lXmu \
1182
1185
1186
+ def detect_ctypes (self ):
1187
+ (srcdir ,) = sysconfig .get_config_vars ('srcdir' )
1188
+ ffi_builddir = os .path .join (self .build_temp , 'libffi' )
1189
+ ffi_srcdir = os .path .abspath (os .path .join (srcdir , 'Modules' ,
1190
+ '_ctypes' , 'libffi' ))
1191
+ ffi_configfile = os .path .join (ffi_builddir , 'fficonfig.py' )
1192
+
1193
+ if self .force or not os .path .exists (ffi_configfile ):
1194
+ from distutils .dir_util import mkpath
1195
+ mkpath (ffi_builddir )
1196
+ config_args = []
1197
+
1198
+ # Pass empty CFLAGS because we'll just append the resulting CFLAGS
1199
+ # to Python's; -g or -O2 is to be avoided.
1200
+ cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1201
+ % (ffi_builddir , ffi_srcdir , " " .join (config_args ))
1202
+
1203
+ res = os .system (cmd )
1204
+ if res or not os .path .exists (ffi_configfile ):
1205
+ print "Failed to configure _ctypes module"
1206
+ return
1207
+
1208
+ fficonfig = {}
1209
+ execfile (ffi_configfile , globals (), fficonfig )
1210
+ ffi_srcdir = os .path .join (fficonfig ['ffi_srcdir' ], 'src' )
1211
+
1212
+ # Add .S (preprocessed assembly) to C compiler source extensions.
1213
+ self .compiler .src_extensions .append ('.S' )
1214
+
1215
+ include_dirs = [os .path .join (ffi_builddir , 'include' ),
1216
+ ffi_builddir , ffi_srcdir ]
1217
+ extra_compile_args = fficonfig ['ffi_cflags' ].split ()
1218
+ sources = ['_ctypes/_ctypes.c' ,
1219
+ '_ctypes/callbacks.c' ,
1220
+ '_ctypes/callproc.c' ,
1221
+ '_ctypes/stgdict.c' ,
1222
+ '_ctypes/cfield.c' ,
1223
+ '_ctypes/malloc_closure.c' ] + fficonfig ['ffi_sources' ]
1224
+ depends = ['_ctypes/ctypes.h' ]
1225
+
1226
+ if sys .platform == 'darwin' :
1227
+ sources .append ('_ctypes/darwin/dlfcn_simple.c' )
1228
+ include_dirs .append ('_ctypes/darwin' )
1229
+ # XXX Is this still needed?
1230
+ ## extra_link_args.extend(['-read_only_relocs', 'warning'])
1231
+
1232
+ ext = Extension ('_ctypes' ,
1233
+ include_dirs = include_dirs ,
1234
+ extra_compile_args = extra_compile_args ,
1235
+ sources = sources ,
1236
+ depends = depends )
1237
+ ext_test = Extension ('_ctypes_test' ,
1238
+ sources = ['_ctypes/_ctypes_test.c' ])
1239
+ self .extensions .extend ([ext , ext_test ])
1240
+
1183
1241
class PyBuildInstall (install ):
1184
1242
# Suppress the warning about installation into the lib_dynload
1185
1243
# directory, which is not in sys.path when running Python during
0 commit comments