blob: bc1e1bbd877465b14255120aef7c44a2667e0ac3 [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
2#
Fredrik Lundhade711a2001-01-24 08:00:28 +00003
Brett Cannon84667c02004-12-07 03:25:18 +00004import sys, os, imp, re, optparse
Christian Heimesaf98da12008-01-27 15:18:18 +00005from glob import glob
Tarek Ziadéedacea32010-01-29 11:41:03 +00006import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +00007
8from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +00009from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000010from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000011from distutils.core import Extension, setup
12from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000013from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000014from distutils.command.install_lib import install_lib
Georg Brandlff52f762010-12-28 09:51:43 +000015from distutils.command.build_scripts import build_scripts
Stefan Krah095b2732010-06-08 13:41:44 +000016from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000017
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020018cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
19
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020020def get_platform():
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020021 # cross build
22 if "_PYTHON_HOST_PLATFORM" in os.environ:
23 return os.environ["_PYTHON_HOST_PLATFORM"]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020024 # Get value of sys.platform
25 if sys.platform.startswith('osf1'):
26 return 'osf1'
27 return sys.platform
28host_platform = get_platform()
29
Gregory P. Smithb04ded42010-01-03 00:38:10 +000030# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020031COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithb04ded42010-01-03 00:38:10 +000032
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000033# This global variable is used to hold the list of modules to be disabled.
34disabled_module_list = []
35
Antoine Pitroue9b428f2010-08-13 22:25:01 +000036# File which contains the directory for shared mods (for sys.path fixup
37# when running from the build dir, see Modules/getpath.c)
38_BUILDDIR_COOKIE = "pybuilddir.txt"
39
Michael W. Hudson39230b32002-01-16 15:26:48 +000040def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000041 """Add the directory 'dir' to the list 'dirlist' (after any relative
42 directories) if:
43
Michael W. Hudson39230b32002-01-16 15:26:48 +000044 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000045 2) 'dir' actually exists, and is a directory.
46 """
47 if dir is None or not os.path.isdir(dir) or dir in dirlist:
48 return
49 for i, path in enumerate(dirlist):
50 if not os.path.isabs(path):
51 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000052 return
53 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +000054
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000055def macosx_sdk_root():
56 """
57 Return the directory of the current OSX SDK,
58 or '/' if no SDK was specified.
59 """
60 cflags = sysconfig.get_config_var('CFLAGS')
61 m = re.search(r'-isysroot\s+(\S+)', cflags)
62 if m is None:
63 sysroot = '/'
64 else:
65 sysroot = m.group(1)
66 return sysroot
67
68def is_macosx_sdk_path(path):
69 """
70 Returns True if 'path' can be located in an OSX SDK
71 """
Ned Deily2910a7b2012-07-30 02:35:58 -070072 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
73 or path.startswith('/System/')
74 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000075
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000076def find_file(filename, std_dirs, paths):
77 """Searches for the directory where a given file is located,
78 and returns a possibly-empty list of additional directories, or None
79 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000080
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000081 'filename' is the name of a file, such as readline.h or libcrypto.a.
82 'std_dirs' is the list of standard system directories; if the
83 file is found in one of them, no additional directives are needed.
84 'paths' is a list of additional locations to check; if the file is
85 found in one of them, the resulting list will contain the directory.
86 """
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020087 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000088 # Honor the MacOSX SDK setting when one was specified.
89 # An SDK is a directory with the same structure as a real
90 # system, but with only header files and libraries.
91 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000092
93 # Check the standard locations
94 for dir in std_dirs:
95 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000096
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020097 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000098 f = os.path.join(sysroot, dir[1:], filename)
99
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000100 if os.path.exists(f): return []
101
102 # Check the additional directories
103 for dir in paths:
104 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000105
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200106 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000107 f = os.path.join(sysroot, dir[1:], filename)
108
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000109 if os.path.exists(f):
110 return [dir]
111
112 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000113 return None
114
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000115def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000116 result = compiler.find_library_file(std_dirs + paths, libname)
117 if result is None:
118 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000119
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200120 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000121 sysroot = macosx_sdk_root()
122
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000123 # Check whether the found file is in one of the standard directories
124 dirname = os.path.dirname(result)
125 for p in std_dirs:
126 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000127 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000128
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200129 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000130 if os.path.join(sysroot, p[1:]) == dirname:
131 return [ ]
132
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000133 if p == dirname:
134 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000135
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000136 # Otherwise, it must have been in one of the additional directories,
137 # so we have to figure out which one.
138 for p in paths:
139 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000140 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000141
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200142 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000143 if os.path.join(sysroot, p[1:]) == dirname:
144 return [ p ]
145
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000146 if p == dirname:
147 return [p]
148 else:
149 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000150
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000151def module_enabled(extlist, modname):
152 """Returns whether the module 'modname' is present in the list
153 of extensions 'extlist'."""
154 extlist = [ext for ext in extlist if ext.name == modname]
155 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000156
Jack Jansen144ebcc2001-08-05 22:31:19 +0000157def find_module_file(module, dirlist):
158 """Find a module in a set of possible folders. If it is not found
159 return the unadorned filename"""
160 list = find_file(module, [], dirlist)
161 if not list:
162 return module
163 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000164 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000165 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000166
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000167class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000168
Guido van Rossumd8faa362007-04-27 19:54:29 +0000169 def __init__(self, dist):
170 build_ext.__init__(self, dist)
171 self.failed = []
172
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000173 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000174
175 # Detect which modules should be compiled
Antoine Pitrou327fd402010-09-04 16:28:00 +0000176 old_so = self.compiler.shared_lib_extension
177 # Workaround PEP 3149 stuff
178 self.compiler.shared_lib_extension = os.environ.get("SO", ".so")
179 try:
180 missing = self.detect_modules()
181 finally:
182 self.compiler.shared_lib_extension = old_so
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000183
184 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000185 extensions = [ext for ext in self.extensions
186 if ext.name not in disabled_module_list]
187 # move ctypes to the end, it depends on other modules
188 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
189 if "_ctypes" in ext_map:
190 ctypes = extensions.pop(ext_map["_ctypes"])
191 extensions.append(ctypes)
192 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000193
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000194 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000195 # with Modules/.
196 srcdir = sysconfig.get_config_var('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000197 if not srcdir:
198 # Maybe running on Windows but not using CYGWIN?
199 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer4d491a52009-02-06 00:27:50 +0000200 srcdir = os.path.abspath(srcdir)
Neil Schemenauer014bf282009-02-05 16:35:45 +0000201 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000202
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000203 # Fix up the paths for scripts, too
204 self.distribution.scripts = [os.path.join(srcdir, filename)
205 for filename in self.distribution.scripts]
206
Christian Heimesaf98da12008-01-27 15:18:18 +0000207 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000208 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100209 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000210
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000211 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000212 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000213 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000214 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000215 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000216 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000217 else:
218 ext.depends = []
219 # re-compile extensions if a header file has been changed
220 ext.depends.extend(headers)
221
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000222 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000223 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000224 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000225 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000226
Ronald Oussoren94f25282010-05-05 19:11:21 +0000227 # Parse Modules/Setup and Modules/Setup.local to figure out which
228 # modules are turned on in the file.
229 remove_modules = []
230 for filename in ('Modules/Setup', 'Modules/Setup.local'):
231 input = text_file.TextFile(filename, join_lines=1)
232 while 1:
233 line = input.readline()
234 if not line: break
235 line = line.split()
236 remove_modules.append(line[0])
237 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000238
Ronald Oussoren94f25282010-05-05 19:11:21 +0000239 for ext in self.extensions[:]:
240 if ext.name in remove_modules:
241 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000242
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000243 # When you run "make CC=altcc" or something similar, you really want
244 # those environment variables passed into the setup.py phase. Here's
245 # a small set of useful ones.
246 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000247 args = {}
248 # unfortunately, distutils doesn't let us provide separate C and C++
249 # compilers
250 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000251 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
252 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000253 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000254
Antoine Pitroue9b428f2010-08-13 22:25:01 +0000255 # Not only do we write the builddir cookie, but we manually install
256 # the shared modules directory if it isn't already in sys.path.
257 # Otherwise trying to import the extensions after building them
258 # will fail.
259 with open(_BUILDDIR_COOKIE, "wb") as f:
260 f.write(self.build_lib.encode('utf-8', 'surrogateescape'))
Matthias Klose73117292010-08-23 16:47:09 +0000261 abs_build_lib = os.path.join(os.getcwd(), self.build_lib)
Antoine Pitroue9b428f2010-08-13 22:25:01 +0000262 if abs_build_lib not in sys.path:
263 sys.path.append(abs_build_lib)
264
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000265 build_ext.build_extensions(self)
266
Guido van Rossumd8faa362007-04-27 19:54:29 +0000267 longest = max([len(e.name) for e in self.extensions])
268 if self.failed:
269 longest = max(longest, max([len(name) for name in self.failed]))
270
271 def print_three_column(lst):
272 lst.sort(key=str.lower)
273 # guarantee zip() doesn't drop anything
274 while len(lst) % 3:
275 lst.append("")
276 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
277 print("%-*s %-*s %-*s" % (longest, e, longest, f,
278 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279
280 if missing:
281 print()
Benjamin Petersonda10d3b2009-01-01 00:23:30 +0000282 print("Python build finished, but the necessary bits to build "
283 "these modules were not found:")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000284 print_three_column(missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000285 print("To find the necessary bits, look in setup.py in"
286 " detect_modules() for the module's name.")
287 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000288
289 if self.failed:
290 failed = self.failed[:]
291 print()
292 print("Failed to build these modules:")
293 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000294 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000295
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000296 def build_extension(self, ext):
297
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000298 if ext.name == '_ctypes':
299 if not self.configure_ctypes(ext):
300 return
301
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000302 try:
303 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000304 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000305 self.announce('WARNING: building of extension "%s" failed: %s' %
306 (ext.name, sys.exc_info()[1]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000307 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000308 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000309 # Workaround for Mac OS X: The Carbon-based modules cannot be
310 # reliably imported into a command-line Python
311 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000312 self.announce(
313 'WARNING: skipping import check for Carbon-based "%s"' %
314 ext.name)
315 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000316
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200317 if host_platform == 'darwin' and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000318 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000319 # Don't bother doing an import check when an extension was
320 # build with an explicit '-arch' flag on OSX. That's currently
321 # only used to build 32-bit only extensions in a 4-way
322 # universal build and loading 32-bit code into a 64-bit
323 # process will fail.
324 self.announce(
325 'WARNING: skipping import check for "%s"' %
326 ext.name)
327 return
328
Jason Tishler24cf7762002-05-22 16:46:15 +0000329 # Workaround for Cygwin: Cygwin currently has fork issues when many
330 # modules have been imported
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200331 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000332 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
333 % ext.name)
334 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000335 ext_filename = os.path.join(
336 self.build_lib,
337 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000338
339 # If the build directory didn't exist when setup.py was
340 # started, sys.path_importer_cache has a negative result
341 # cached. Clear that cache before trying to import.
342 sys.path_importer_cache.clear()
343
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200344 # Don't try to load extensions for cross builds
345 if cross_compiling:
346 return
347
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000348 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000349 imp.load_dynamic(ext.name, ext_filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000350 except ImportError as why:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000351 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000352 self.announce('*** WARNING: renaming "%s" since importing it'
353 ' failed: %s' % (ext.name, why), level=3)
354 assert not self.inplace
355 basename, tail = os.path.splitext(ext_filename)
356 newname = basename + "_failed" + tail
357 if os.path.exists(newname):
358 os.remove(newname)
359 os.rename(ext_filename, newname)
360
361 # XXX -- This relies on a Vile HACK in
362 # distutils.command.build_ext.build_extension(). The
363 # _built_objects attribute is stored there strictly for
364 # use here.
365 # If there is a failure, _built_objects may not be there,
366 # so catch the AttributeError and move on.
367 try:
368 for filename in self._built_objects:
369 os.remove(filename)
370 except AttributeError:
371 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000372 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000373 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000374 self.announce('*** WARNING: importing extension "%s" '
375 'failed with %s: %s' % (ext.name, exc_type, why),
376 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000377 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000378
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400379 def add_multiarch_paths(self):
380 # Debian/Ubuntu multiarch support.
381 # https://wiki.ubuntu.com/MultiarchSpec
Barry Warsaw88e19452011-04-07 10:40:36 -0400382 if not find_executable('dpkg-architecture'):
383 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200384 opt = ''
385 if cross_compiling:
386 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400387 tmpfile = os.path.join(self.build_temp, 'multiarch')
388 if not os.path.exists(self.build_temp):
389 os.makedirs(self.build_temp)
390 ret = os.system(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200391 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
392 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400393 try:
394 if ret >> 8 == 0:
395 with open(tmpfile) as fp:
396 multiarch_path_component = fp.readline().strip()
397 add_dir_to_list(self.compiler.library_dirs,
398 '/usr/lib/' + multiarch_path_component)
399 add_dir_to_list(self.compiler.include_dirs,
400 '/usr/include/' + multiarch_path_component)
401 finally:
402 os.unlink(tmpfile)
403
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200404 def add_gcc_paths(self):
405 gcc = sysconfig.get_config_var('CC')
406 tmpfile = os.path.join(self.build_temp, 'gccpaths')
407 if not os.path.exists(self.build_temp):
408 os.makedirs(self.build_temp)
409 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
410 is_gcc = False
411 in_incdirs = False
412 inc_dirs = []
413 lib_dirs = []
414 try:
415 if ret >> 8 == 0:
416 with open(tmpfile) as fp:
417 for line in fp.readlines():
418 if line.startswith("gcc version"):
419 is_gcc = True
420 elif line.startswith("#include <...>"):
421 in_incdirs = True
422 elif line.startswith("End of search list"):
423 in_incdirs = False
424 elif is_gcc and line.startswith("LIBRARY_PATH"):
425 for d in line.strip().split("=")[1].split(":"):
426 d = os.path.normpath(d)
427 if '/gcc/' not in d:
428 add_dir_to_list(self.compiler.library_dirs,
429 d)
430 elif is_gcc and in_incdirs and '/gcc/' not in line:
431 add_dir_to_list(self.compiler.include_dirs,
432 line.strip())
433 finally:
434 os.unlink(tmpfile)
435
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000436 def detect_modules(self):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000437 # Ensure that /usr/local is always used, but the local build
438 # directories (i.e. '.' and 'Include') must be first. See issue
439 # 10520.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200440 if not cross_compiling:
441 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
442 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200443 # only change this for cross builds for 3.3, issues on Mageia
444 if cross_compiling:
445 self.add_gcc_paths()
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400446 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000447
Brett Cannon516592f2004-12-07 00:42:59 +0000448 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000449 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000450 # We must get the values from the Makefile and not the environment
451 # directly since an inconsistently reproducible issue comes up where
452 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000453 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000454 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000455 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
456 ('LDFLAGS', '-L', self.compiler.library_dirs),
457 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000458 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000459 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000460 # To prevent optparse from raising an exception about any
Skip Montanaroa5c2a512008-10-07 02:51:48 +0000461 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000462 # all double dashes and any dashes followed by a character
463 # that is not for the option we are dealing with.
464 #
465 # Please note that order of the regex is important! We must
466 # strip out double-dashes first so that we don't end up with
467 # substituting "--Long" to "-Long" and thus lead to "ong" being
468 # used for a library directory.
Guido van Rossum04110fb2007-08-24 16:32:05 +0000469 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
470 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000471 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000472 # Make sure that allowing args interspersed with options is
473 # allowed
474 parser.allow_interspersed_args = True
475 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000476 parser.add_option(arg_name, dest="dirs", action="append")
477 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000478 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000479 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000480 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000481
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100482 if os.path.normpath(sys.base_prefix) != '/usr' \
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000483 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
484 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
485 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
486 # building a framework with different architectures than
487 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000488 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000489 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000490 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000491 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000492
493 # lib_dirs and inc_dirs are used to search for files;
494 # if a file is found in one of those directories, it can
495 # be assumed that no additional -I,-L directives are needed.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200496 if not cross_compiling:
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200497 lib_dirs = self.compiler.library_dirs + [
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200498 '/lib64', '/usr/lib64',
499 '/lib', '/usr/lib',
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200500 ]
501 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000502 exts = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000504
Brett Cannon4454a1f2005-04-15 20:32:39 +0000505 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000506 with open(config_h) as file:
507 config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000508
Neil Schemenauer014bf282009-02-05 16:35:45 +0000509 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000510
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000511 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200512 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000513 lib_dirs += ['/usr/ccs/lib']
514
Charles-François Natali5739e102012-04-12 19:07:25 +0200515 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200516 if host_platform == 'hp-ux11':
Charles-François Natali5739e102012-04-12 19:07:25 +0200517 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
518
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200519 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +0000520 # This should work on any unixy platform ;-)
521 # If the user has bothered specifying additional -I and -L flags
522 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000523 #
524 # NOTE: using shlex.split would technically be more correct, but
525 # also gives a bootstrap problem. Let's hope nobody uses
526 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000527 cflags, ldflags = sysconfig.get_config_vars(
528 'CFLAGS', 'LDFLAGS')
529 for item in cflags.split():
530 if item.startswith('-I'):
531 inc_dirs.append(item[2:])
532
533 for item in ldflags.split():
534 if item.startswith('-L'):
535 lib_dirs.append(item[2:])
536
Fredrik Lundhade711a2001-01-24 08:00:28 +0000537 # Check for MacOS X, which doesn't need libm.a at all
538 math_libs = ['m']
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200539 if host_platform == 'darwin':
Fredrik Lundhade711a2001-01-24 08:00:28 +0000540 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000541
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000542 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
543
544 #
545 # The following modules are all pretty straightforward, and compile
546 # on pretty much any POSIXish platform.
547 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000548
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000549 # array objects
550 exts.append( Extension('array', ['arraymodule.c']) )
551 # complex math library functions
Mark Dickinsonf3718592009-12-21 15:27:41 +0000552 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
553 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000554 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000555 # math library functions, e.g. sin()
Mark Dickinson664b5112009-12-16 20:23:42 +0000556 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson8a591132009-12-17 08:35:56 +0000557 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000558 libraries=math_libs) )
Victor Stinnere0be4232011-10-25 13:06:09 +0200559
560 # time libraries: librt may be needed for clock_gettime()
561 time_libs = []
562 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
563 if lib:
564 time_libs.append(lib)
565
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000566 # time operations and variables
Victor Stinner5d272cc2012-03-13 13:35:55 +0100567 exts.append( Extension('time', ['timemodule.c'],
Victor Stinnere0be4232011-10-25 13:06:09 +0200568 libraries=time_libs) )
Victor Stinner5d272cc2012-03-13 13:35:55 +0100569 exts.append( Extension('_datetime', ['_datetimemodule.c']) )
Christian Heimesfe337bf2008-03-23 21:54:12 +0000570 # random number generator implemented in C
571 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000572 # bisect
573 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000574 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000575 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000576 # C-optimized pickle replacement
577 exts.append( Extension("_pickle", ["_pickle.c"]) )
Collin Winter670e6922007-03-21 02:57:17 +0000578 # atexit
579 exts.append( Extension("atexit", ["atexitmodule.c"]) )
Christian Heimes90540002008-05-08 14:29:10 +0000580 # _json speedups
581 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000582 # Python C API test module
Mark Dickinsona06f44b2009-02-10 16:18:22 +0000583 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
584 depends=['testcapi_long.h']) )
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100585 # Python PEP-3118 (buffer protocol) test module
586 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
Fred Drake0e474a82007-10-11 18:01:43 +0000587 # profiler (_lsprof is for cProfile.py)
Armin Rigoa871ef22006-02-08 12:53:56 +0000588 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000589 # static Unicode character database
Walter Dörwalde9eaab42007-05-22 16:02:13 +0000590 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000591
592 # Modules with some UNIX dependencies -- on by default:
593 # (If you have a really backward UNIX, select and socket may not be
594 # supported...)
595
596 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000597 libs = []
598 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
599 # May be necessary on AIX for flock function
600 libs = ['bsd']
601 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren94f25282010-05-05 19:11:21 +0000602 # pwd(3)
603 exts.append( Extension('pwd', ['pwdmodule.c']) )
604 # grp(3)
605 exts.append( Extension('grp', ['grpmodule.c']) )
606 # spwd, shadow passwords
607 if (config_h_vars.get('HAVE_GETSPNAM', False) or
608 config_h_vars.get('HAVE_GETSPENT', False)):
609 exts.append( Extension('spwd', ['spwdmodule.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000610 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000611 missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000612
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000613 # select(2); not on ancient System V
614 exts.append( Extension('select', ['selectmodule.c']) )
615
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000616 # Fred Drake's interface to the Python parser
617 exts.append( Extension('parser', ['parsermodule.c']) )
618
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000619 # Memory-mapped files (also works on Win32).
Ronald Oussoren94f25282010-05-05 19:11:21 +0000620 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000621
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000622 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000623 # syslog daemon interface
624 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000625
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000626 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000627 # Here ends the simple stuff. From here on, modules need certain
628 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000629 #
630
631 # Multimedia modules
632 # These don't work for 64-bit platforms!!!
633 # These represent audio samples or images as strings:
634
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000635 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000636 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000637 # 64-bit platforms.
638 exts.append( Extension('audioop', ['audioop.c']) )
639
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000640 # readline
Tarek Ziadé36797272010-07-22 12:50:05 +0000641 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000642 readline_termcap_library = ""
643 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200644 # Cannot use os.popen here in py3k.
645 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
646 if not os.path.exists(self.build_temp):
647 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000648 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200649 if do_readline:
650 if cross_compiling:
651 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
652 % (sysconfig.get_config_var('READELF'),
653 do_readline, tmpfile))
654 elif find_executable('ldd'):
655 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
656 else:
657 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200658 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000659 with open(tmpfile) as fp:
660 for ln in fp:
661 if 'curses' in ln:
662 readline_termcap_library = re.sub(
663 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
664 ).rstrip()
665 break
666 # termcap interface split out from ncurses
667 if 'tinfo' in ln:
668 readline_termcap_library = 'tinfo'
669 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200670 if os.path.exists(tmpfile):
671 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000672 # Issue 7384: If readline is already linked against curses,
673 # use the same library for the readline and curses modules.
674 if 'curses' in readline_termcap_library:
675 curses_library = readline_termcap_library
Tarek Ziadé36797272010-07-22 12:50:05 +0000676 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000677 curses_library = 'ncursesw'
Tarek Ziadé36797272010-07-22 12:50:05 +0000678 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000679 curses_library = 'ncurses'
Tarek Ziadé36797272010-07-22 12:50:05 +0000680 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000681 curses_library = 'curses'
682
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200683 if host_platform == 'darwin':
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000684 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000685 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
686 if dep_target and dep_target.split('.') < ['10', '5']:
687 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000688 if os_release < 9:
689 # MacOSX 10.4 has a broken readline. Don't try to build
690 # the readline module unless the user has installed a fixed
691 # readline package
692 if find_file('readline/rlconf.h', inc_dirs, []) is None:
693 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000694 if do_readline:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200695 if host_platform == 'darwin' and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000696 # In every directory on the search path search for a dynamic
697 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000698 # for dynamic libraries on the entire path.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000699 # This way a staticly linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000700 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000701 readline_extra_link_args = ('-Wl,-search_paths_first',)
702 else:
703 readline_extra_link_args = ()
704
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000705 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000706 if readline_termcap_library:
707 pass # Issue 7384: Already linked against curses or tinfo.
708 elif curses_library:
709 readline_libs.append(curses_library)
Tarek Ziadé36797272010-07-22 12:50:05 +0000710 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000711 ['/usr/lib/termcap'],
712 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000713 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000714 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000715 library_dirs=['/usr/lib/termcap'],
Thomas Wouters477c8d52006-05-27 19:21:47 +0000716 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000717 libraries=readline_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000718 else:
719 missing.append('readline')
720
Ronald Oussoren94f25282010-05-05 19:11:21 +0000721 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000722
Tarek Ziadé36797272010-07-22 12:50:05 +0000723 if self.compiler.find_library_file(lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000724 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000725 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000726 libs = []
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000727 exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000728
Skip Montanaroba9e9782003-03-20 23:34:22 +0000729 # CSV files
730 exts.append( Extension('_csv', ['_csv.c']) )
731
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000732 # POSIX subprocess module helper.
733 exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
734
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000735 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000736 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000737 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000738 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000739 search_for_ssl_incs_in = [
740 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000741 '/usr/contrib/ssl/include/'
742 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000743 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
744 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000745 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000746 if ssl_incs is not None:
747 krb5_h = find_file('krb5.h', inc_dirs,
748 ['/usr/kerberos/include'])
749 if krb5_h:
750 ssl_incs += krb5_h
Tarek Ziadé36797272010-07-22 12:50:05 +0000751 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000752 ['/usr/local/ssl/lib',
753 '/usr/contrib/ssl/lib/'
754 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000755
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000756 if (ssl_incs is not None and
757 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000758 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000759 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000760 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000761 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000762 depends = ['socketmodule.h']), )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000763 else:
764 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000765
Gregory P. Smithade97332005-08-23 21:19:40 +0000766 # find out which version of OpenSSL we have
767 openssl_ver = 0
768 openssl_ver_re = re.compile(
769 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000770
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000771 # look for the openssl version header on the compiler search path.
772 opensslv_h = find_file('openssl/opensslv.h', [],
773 inc_dirs + search_for_ssl_incs_in)
774 if opensslv_h:
775 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200776 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000777 name = os.path.join(macosx_sdk_root(), name[1:])
778 try:
Brett Cannon9f5db072010-10-29 20:19:27 +0000779 with open(name, 'r') as incfile:
780 for line in incfile:
781 m = openssl_ver_re.match(line)
782 if m:
783 openssl_ver = eval(m.group(1))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000784 except IOError as msg:
785 print("IOError while reading opensshv.h:", msg)
786 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000787
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000788 #print('openssl_ver = 0x%08x' % openssl_ver)
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000789 min_openssl_ver = 0x00907000
790 have_any_openssl = ssl_incs is not None and ssl_libs is not None
791 have_usable_openssl = (have_any_openssl and
792 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000793
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000794 if have_any_openssl:
795 if have_usable_openssl:
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000796 # The _hashlib module wraps optimized implementations
797 # of hash functions from the OpenSSL library.
798 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
Gregory P. Smith5af7fba2010-01-03 14:51:13 +0000799 depends = ['hashlib.h'],
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000800 include_dirs = ssl_incs,
801 library_dirs = ssl_libs,
802 libraries = ['ssl', 'crypto']) )
803 else:
804 print("warning: openssl 0x%08x is too old for _hashlib" %
805 openssl_ver)
806 missing.append('_hashlib')
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000807
Antoine Pitrou019ff192012-05-16 16:41:26 +0200808 # We always compile these even when OpenSSL is available (issue #14693).
809 # It's harmless and the object code is tiny (40-50 KB per module,
810 # only loaded when actually used).
811 exts.append( Extension('_sha256', ['sha256module.c'],
812 depends=['hashlib.h']) )
813 exts.append( Extension('_sha512', ['sha512module.c'],
814 depends=['hashlib.h']) )
815 exts.append( Extension('_md5', ['md5module.c'],
816 depends=['hashlib.h']) )
817 exts.append( Extension('_sha1', ['sha1module.c'],
818 depends=['hashlib.h']) )
Gregory P. Smith2f21eb32007-09-09 06:44:34 +0000819
Georg Brandl489cb4f2009-07-11 10:08:49 +0000820 # Modules that provide persistent dictionary-like semantics. You will
821 # probably want to arrange for at least one of them to be available on
822 # your machine, though none are defined by default because of library
823 # dependencies. The Python module dbm/__init__.py provides an
824 # implementation independent wrapper for these; dbm/dumb.py provides
825 # similar functionality (but slower of course) implemented in Python.
826
827 # Sleepycat^WOracle Berkeley DB interface.
828 # http://www.oracle.com/database/berkeley-db/db/index.html
829 #
830 # This requires the Sleepycat^WOracle DB code. The supported versions
831 # are set below. Visit the URL above to download
832 # a release. Most open source OSes come with one or more
833 # versions of BerkeleyDB already installed.
834
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +0200835 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000836 min_db_ver = (3, 3)
837 db_setup_debug = False # verbose debug prints from this script?
838
839 def allow_db_ver(db_ver):
840 """Returns a boolean if the given BerkeleyDB version is acceptable.
841
842 Args:
843 db_ver: A tuple of the version to verify.
844 """
845 if not (min_db_ver <= db_ver <= max_db_ver):
846 return False
847 return True
848
849 def gen_db_minor_ver_nums(major):
850 if major == 4:
851 for x in range(max_db_ver[1]+1):
852 if allow_db_ver((4, x)):
853 yield x
854 elif major == 3:
855 for x in (3,):
856 if allow_db_ver((3, x)):
857 yield x
858 else:
859 raise ValueError("unknown major BerkeleyDB version", major)
860
861 # construct a list of paths to look for the header file in on
862 # top of the normal inc_dirs.
863 db_inc_paths = [
864 '/usr/include/db4',
865 '/usr/local/include/db4',
866 '/opt/sfw/include/db4',
867 '/usr/include/db3',
868 '/usr/local/include/db3',
869 '/opt/sfw/include/db3',
870 # Fink defaults (http://fink.sourceforge.net/)
871 '/sw/include/db4',
872 '/sw/include/db3',
873 ]
874 # 4.x minor number specific paths
875 for x in gen_db_minor_ver_nums(4):
876 db_inc_paths.append('/usr/include/db4%d' % x)
877 db_inc_paths.append('/usr/include/db4.%d' % x)
878 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
879 db_inc_paths.append('/usr/local/include/db4%d' % x)
880 db_inc_paths.append('/pkg/db-4.%d/include' % x)
881 db_inc_paths.append('/opt/db-4.%d/include' % x)
882 # MacPorts default (http://www.macports.org/)
883 db_inc_paths.append('/opt/local/include/db4%d' % x)
884 # 3.x minor number specific paths
885 for x in gen_db_minor_ver_nums(3):
886 db_inc_paths.append('/usr/include/db3%d' % x)
887 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
888 db_inc_paths.append('/usr/local/include/db3%d' % x)
889 db_inc_paths.append('/pkg/db-3.%d/include' % x)
890 db_inc_paths.append('/opt/db-3.%d/include' % x)
891
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200892 if cross_compiling:
893 db_inc_paths = []
894
Georg Brandl489cb4f2009-07-11 10:08:49 +0000895 # Add some common subdirectories for Sleepycat DB to the list,
896 # based on the standard include directories. This way DB3/4 gets
897 # picked up when it is installed in a non-standard prefix and
898 # the user has added that prefix into inc_dirs.
899 std_variants = []
900 for dn in inc_dirs:
901 std_variants.append(os.path.join(dn, 'db3'))
902 std_variants.append(os.path.join(dn, 'db4'))
903 for x in gen_db_minor_ver_nums(4):
904 std_variants.append(os.path.join(dn, "db4%d"%x))
905 std_variants.append(os.path.join(dn, "db4.%d"%x))
906 for x in gen_db_minor_ver_nums(3):
907 std_variants.append(os.path.join(dn, "db3%d"%x))
908 std_variants.append(os.path.join(dn, "db3.%d"%x))
909
910 db_inc_paths = std_variants + db_inc_paths
911 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
912
913 db_ver_inc_map = {}
914
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200915 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000916 sysroot = macosx_sdk_root()
917
Georg Brandl489cb4f2009-07-11 10:08:49 +0000918 class db_found(Exception): pass
919 try:
920 # See whether there is a Sleepycat header in the standard
921 # search path.
922 for d in inc_dirs + db_inc_paths:
923 f = os.path.join(d, "db.h")
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200924 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000925 f = os.path.join(sysroot, d[1:], "db.h")
926
Georg Brandl489cb4f2009-07-11 10:08:49 +0000927 if db_setup_debug: print("db: looking for db.h in", f)
928 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +0000929 with open(f, 'rb') as file:
930 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +0000931 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000932 if m:
933 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +0000934 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000935 db_minor = int(m.group(1))
936 db_ver = (db_major, db_minor)
937
938 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
939 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +0000940 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000941 db_patch = int(m.group(1))
942 if db_patch < 21:
943 print("db.h:", db_ver, "patch", db_patch,
944 "being ignored (4.6.x must be >= 4.6.21)")
945 continue
946
947 if ( (db_ver not in db_ver_inc_map) and
948 allow_db_ver(db_ver) ):
949 # save the include directory with the db.h version
950 # (first occurrence only)
951 db_ver_inc_map[db_ver] = d
952 if db_setup_debug:
953 print("db.h: found", db_ver, "in", d)
954 else:
955 # we already found a header for this library version
956 if db_setup_debug: print("db.h: ignoring", d)
957 else:
958 # ignore this header, it didn't contain a version number
959 if db_setup_debug:
960 print("db.h: no version number version in", d)
961
962 db_found_vers = list(db_ver_inc_map.keys())
963 db_found_vers.sort()
964
965 while db_found_vers:
966 db_ver = db_found_vers.pop()
967 db_incdir = db_ver_inc_map[db_ver]
968
969 # check lib directories parallel to the location of the header
970 db_dirs_to_check = [
971 db_incdir.replace("include", 'lib64'),
972 db_incdir.replace("include", 'lib'),
973 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000974
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200975 if host_platform != 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000976 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
977
978 else:
979 # Same as other branch, but takes OSX SDK into account
980 tmp = []
981 for dn in db_dirs_to_check:
982 if is_macosx_sdk_path(dn):
983 if os.path.isdir(os.path.join(sysroot, dn[1:])):
984 tmp.append(dn)
985 else:
986 if os.path.isdir(dn):
987 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +0000988 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000989
990 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +0000991
Ezio Melotti42da6632011-03-15 05:18:48 +0200992 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +0000993 # XXX should we -ever- look for a dbX name? Do any
994 # systems really not name their library by version and
995 # symlink to more general names?
996 for dblib in (('db-%d.%d' % db_ver),
997 ('db%d%d' % db_ver),
998 ('db%d' % db_ver[0])):
999 dblib_file = self.compiler.find_library_file(
1000 db_dirs_to_check + lib_dirs, dblib )
1001 if dblib_file:
1002 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1003 raise db_found
1004 else:
1005 if db_setup_debug: print("db lib: ", dblib, "not found")
1006
1007 except db_found:
1008 if db_setup_debug:
1009 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1010 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
1011 db_incs = [db_incdir]
1012 dblibs = [dblib]
1013 else:
1014 if db_setup_debug: print("db: no appropriate library found")
1015 db_incs = None
1016 dblibs = []
1017 dblib_dir = None
1018
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001019 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001020 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001021
1022 # We hunt for #define SQLITE_VERSION "n.n.n"
1023 # We need to find >= sqlite version 3.0.8
1024 sqlite_incdir = sqlite_libdir = None
1025 sqlite_inc_paths = [ '/usr/include',
1026 '/usr/include/sqlite',
1027 '/usr/include/sqlite3',
1028 '/usr/local/include',
1029 '/usr/local/include/sqlite',
1030 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001031 ]
1032 if cross_compiling:
1033 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001034 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1035 MIN_SQLITE_VERSION = ".".join([str(x)
1036 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001037
1038 # Scan the default include directories before the SQLite specific
1039 # ones. This allows one to override the copy of sqlite on OSX,
1040 # where /usr/include contains an old version of sqlite.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001041 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001042 sysroot = macosx_sdk_root()
1043
Ned Deily9b635832012-08-05 15:13:33 -07001044 for d_ in inc_dirs + sqlite_inc_paths:
1045 d = d_
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001046 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001047 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001048
Ned Deily9b635832012-08-05 15:13:33 -07001049 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001050 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001051 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001052 with open(f) as file:
1053 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001054 m = re.search(
1055 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
1056 if m:
1057 sqlite_version = m.group(1)
1058 sqlite_version_tuple = tuple([int(x)
1059 for x in sqlite_version.split(".")])
1060 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1061 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001062 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001063 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001064 sqlite_incdir = d
1065 break
1066 else:
1067 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001068 print("%s: version %d is too old, need >= %s"%(d,
1069 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001071 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072
1073 if sqlite_incdir:
1074 sqlite_dirs_to_check = [
1075 os.path.join(sqlite_incdir, '..', 'lib64'),
1076 os.path.join(sqlite_incdir, '..', 'lib'),
1077 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1078 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1079 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001080 sqlite_libfile = self.compiler.find_library_file(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001081 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001082 if sqlite_libfile:
1083 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001084
1085 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001086 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001087 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 '_sqlite/cursor.c',
1089 '_sqlite/microprotocols.c',
1090 '_sqlite/module.c',
1091 '_sqlite/prepare_protocol.c',
1092 '_sqlite/row.c',
1093 '_sqlite/statement.c',
1094 '_sqlite/util.c', ]
1095
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001096 sqlite_defines = []
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001097 if host_platform != "win32":
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001098 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1099 else:
1100 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1101
Benjamin Peterson076ed002010-10-31 17:11:02 +00001102 # Enable support for loadable extensions in the sqlite3 module
1103 # if --enable-loadable-sqlite-extensions configure option is used.
1104 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1105 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001106
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001107 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +00001108 # In every directory on the search path search for a dynamic
1109 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001110 # for dynamic libraries on the entire path.
1111 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001112 # before the dynamic library in /usr/lib.
1113 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1114 else:
1115 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001116
Brett Cannonc5011fe2011-06-06 20:09:10 -07001117 include_dirs = ["Modules/_sqlite"]
1118 # Only include the directory where sqlite was found if it does
1119 # not already exist in set include directories, otherwise you
1120 # can end up with a bad search path order.
1121 if sqlite_incdir not in self.compiler.include_dirs:
1122 include_dirs.append(sqlite_incdir)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001123 exts.append(Extension('_sqlite3', sqlite_srcs,
1124 define_macros=sqlite_defines,
Brett Cannonc5011fe2011-06-06 20:09:10 -07001125 include_dirs=include_dirs,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001126 library_dirs=sqlite_libdir,
1127 runtime_library_dirs=sqlite_libdir,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001128 extra_link_args=sqlite_extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001129 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001130 else:
1131 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001132
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001133 dbm_setup_debug = False # verbose debug prints from this script?
Benjamin Petersond78735d2010-01-01 16:04:23 +00001134 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001135 # The standard Unix dbm module:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001136 if host_platform not in ['cygwin']:
Matthias Klose55708cc2009-04-30 08:06:49 +00001137 config_args = [arg.strip("'")
1138 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersond78735d2010-01-01 16:04:23 +00001139 dbm_args = [arg for arg in config_args
Matthias Klose55708cc2009-04-30 08:06:49 +00001140 if arg.startswith('--with-dbmliborder=')]
1141 if dbm_args:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001142 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001143 else:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001144 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001145 dbmext = None
1146 for cand in dbm_order:
1147 if cand == "ndbm":
1148 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan50f147a2012-06-17 18:27:11 +10001149 # Some systems have -lndbm, others have -lgdbm_compat,
1150 # others don't have either
Tarek Ziadé36797272010-07-22 12:50:05 +00001151 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001152 'ndbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001153 ndbm_libs = ['ndbm']
Nick Coghlan50f147a2012-06-17 18:27:11 +10001154 elif self.compiler.find_library_file(lib_dirs,
1155 'gdbm_compat'):
1156 ndbm_libs = ['gdbm_compat']
Matthias Klose55708cc2009-04-30 08:06:49 +00001157 else:
1158 ndbm_libs = []
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001159 if dbm_setup_debug: print("building dbm using ndbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001160 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1161 define_macros=[
1162 ('HAVE_NDBM_H',None),
1163 ],
1164 libraries=ndbm_libs)
1165 break
1166
1167 elif cand == "gdbm":
Tarek Ziadé36797272010-07-22 12:50:05 +00001168 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001169 gdbm_libs = ['gdbm']
Tarek Ziadé36797272010-07-22 12:50:05 +00001170 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001171 'gdbm_compat'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001172 gdbm_libs.append('gdbm_compat')
1173 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001174 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001175 dbmext = Extension(
1176 '_dbm', ['_dbmmodule.c'],
1177 define_macros=[
1178 ('HAVE_GDBM_NDBM_H', None),
1179 ],
1180 libraries = gdbm_libs)
1181 break
1182 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001183 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001184 dbmext = Extension(
1185 '_dbm', ['_dbmmodule.c'],
1186 define_macros=[
1187 ('HAVE_GDBM_DASH_NDBM_H', None),
1188 ],
1189 libraries = gdbm_libs)
1190 break
Georg Brandl489cb4f2009-07-11 10:08:49 +00001191 elif cand == "bdb":
1192 if db_incs is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001193 if dbm_setup_debug: print("building dbm using bdb")
Georg Brandl489cb4f2009-07-11 10:08:49 +00001194 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1195 library_dirs=dblib_dir,
1196 runtime_library_dirs=dblib_dir,
1197 include_dirs=db_incs,
1198 define_macros=[
1199 ('HAVE_BERKDB_H', None),
1200 ('DB_DBM_HSEARCH', None),
1201 ],
1202 libraries=dblibs)
Matthias Klose55708cc2009-04-30 08:06:49 +00001203 break
1204 if dbmext is not None:
1205 exts.append(dbmext)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001206 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001207 missing.append('_dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001208
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001209 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001210 if ('gdbm' in dbm_order and
Tarek Ziadé36797272010-07-22 12:50:05 +00001211 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001212 exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001213 libraries = ['gdbm'] ) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001214 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001215 missing.append('_gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001216
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001217 # Unix-only modules
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001218 if host_platform != 'win32':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001219 # Steen Lumholt's termios module
1220 exts.append( Extension('termios', ['termios.c']) )
1221 # Jeremy Hylton's rlimit interface
Antoine Pitrou6103ab12009-10-24 20:11:21 +00001222 exts.append( Extension('resource', ['resource.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001223
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001224 # Sun yellow pages. Some systems have the functions in libc.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001225 if (host_platform not in ['cygwin', 'qnx6'] and
Benjamin Peterson588009e2009-12-30 03:03:54 +00001226 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé36797272010-07-22 12:50:05 +00001227 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001228 libs = ['nsl']
1229 else:
1230 libs = []
1231 exts.append( Extension('nis', ['nismodule.c'],
1232 libraries = libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001233 else:
1234 missing.append('nis')
1235 else:
1236 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001237
Skip Montanaro72092942004-02-07 12:50:19 +00001238 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001239 # provided by the ncurses library.
Victor Stinneraa35b002011-11-29 00:08:12 +01001240 curses_defines = []
Victor Stinner756c6ec2011-11-27 00:19:53 +01001241 curses_includes = []
Victor Stinneraa35b002011-11-29 00:08:12 +01001242 panel_library = 'panel'
1243 if curses_library == 'ncursesw':
1244 curses_defines.append(('HAVE_NCURSESW', '1'))
1245 curses_includes.append('/usr/include/ncursesw')
1246 # Bug 1464056: If _curses.so links with ncursesw,
1247 # _curses_panel.so must link with panelw.
1248 panel_library = 'panelw'
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001249 if host_platform == 'darwin':
Ned Deily69192232012-06-20 23:47:14 -07001250 # On OS X, there is no separate /usr/lib/libncursesw nor
1251 # libpanelw. If we are here, we found a locally-supplied
1252 # version of libncursesw. There should be also be a
1253 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1254 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1255 # ncurses wide char support
1256 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001257 elif host_platform == 'darwin' and curses_library == 'ncurses':
Ned Deily69192232012-06-20 23:47:14 -07001258 # Building with the system-suppied combined libncurses/libpanel
1259 curses_defines.append(('HAVE_NCURSESW', '1'))
1260 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Victor Stinneraa35b002011-11-29 00:08:12 +01001261
Stefan Krah095b2732010-06-08 13:41:44 +00001262 if curses_library.startswith('ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001263 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001264 exts.append( Extension('_curses', ['_cursesmodule.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001265 include_dirs=curses_includes,
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001266 define_macros=curses_defines,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001267 libraries = curses_libs) )
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001268 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001269 # OSX has an old Berkeley curses, not good enough for
1270 # the _curses module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001271 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001272 curses_libs = ['curses', 'terminfo']
Tarek Ziadé36797272010-07-22 12:50:05 +00001273 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001274 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001275 else:
1276 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001277
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001278 exts.append( Extension('_curses', ['_cursesmodule.c'],
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001279 define_macros=curses_defines,
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001280 libraries = curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001281 else:
1282 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001283
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001284 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001285 if (module_enabled(exts, '_curses') and
Tarek Ziadé36797272010-07-22 12:50:05 +00001286 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001287 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001288 include_dirs=curses_includes,
Ned Deily69192232012-06-20 23:47:14 -07001289 define_macros=curses_defines,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001290 libraries = [panel_library] + curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001291 else:
1292 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001293
Barry Warsaw259b1e12002-08-13 20:09:26 +00001294 # Andrew Kuchling's zlib module. Note that some versions of zlib
1295 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1296 # http://www.cert.org/advisories/CA-2002-07.html
1297 #
1298 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1299 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1300 # now, we still accept 1.1.3, because we think it's difficult to
1301 # exploit this in Python, and we'd rather make it RedHat's problem
1302 # than our problem <wink>.
1303 #
1304 # You can upgrade zlib to version 1.1.4 yourself by going to
1305 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001306 zlib_inc = find_file('zlib.h', [], inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001307 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001308 if zlib_inc is not None:
1309 zlib_h = zlib_inc[0] + '/zlib.h'
1310 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001311 version_req = '"1.1.3"'
Brett Cannon9f5db072010-10-29 20:19:27 +00001312 with open(zlib_h) as fp:
1313 while 1:
1314 line = fp.readline()
1315 if not line:
1316 break
1317 if line.startswith('#define ZLIB_VERSION'):
1318 version = line.split()[2]
1319 break
Guido van Rossume6970912001-04-15 15:16:12 +00001320 if version >= version_req:
Tarek Ziadé36797272010-07-22 12:50:05 +00001321 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001322 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001323 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1324 else:
1325 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001326 exts.append( Extension('zlib', ['zlibmodule.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001327 libraries = ['z'],
1328 extra_link_args = zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001329 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001330 else:
1331 missing.append('zlib')
1332 else:
1333 missing.append('zlib')
1334 else:
1335 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001336
Christian Heimes1dc54002008-03-24 02:19:29 +00001337 # Helper module for various ascii-encoders. Uses zlib for an optimized
1338 # crc32 if we have it. Otherwise binascii uses its own.
1339 if have_zlib:
1340 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1341 libraries = ['z']
1342 extra_link_args = zlib_extra_link_args
1343 else:
1344 extra_compile_args = []
1345 libraries = []
1346 extra_link_args = []
1347 exts.append( Extension('binascii', ['binascii.c'],
1348 extra_compile_args = extra_compile_args,
1349 libraries = libraries,
1350 extra_link_args = extra_link_args) )
1351
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001352 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001353 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001354 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001355 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1356 else:
1357 bz2_extra_link_args = ()
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001358 exts.append( Extension('_bz2', ['_bz2module.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001359 libraries = ['bz2'],
1360 extra_link_args = bz2_extra_link_args) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001361 else:
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001362 missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001363
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001364 # LZMA compression support.
1365 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1366 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1367 libraries = ['lzma']) )
1368 else:
1369 missing.append('_lzma')
1370
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001371 # Interface to the Expat XML parser
1372 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001373 # Expat was written by James Clark and is now maintained by a group of
1374 # developers on SourceForge; see www.libexpat.org for more information.
1375 # The pyexpat module was written by Paul Prescod after a prototype by
1376 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1377 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001378 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001379 #
1380 # More information on Expat can be found at www.libexpat.org.
1381 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001382 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1383 expat_inc = []
1384 define_macros = []
1385 expat_lib = ['expat']
1386 expat_sources = []
1387 else:
1388 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1389 define_macros = [
1390 ('HAVE_EXPAT_CONFIG_H', '1'),
1391 ]
1392 expat_lib = []
1393 expat_sources = ['expat/xmlparse.c',
1394 'expat/xmlrole.c',
1395 'expat/xmltok.c']
Thomas Wouters477c8d52006-05-27 19:21:47 +00001396
Fred Drake2d59a492003-10-21 15:41:15 +00001397 exts.append(Extension('pyexpat',
1398 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001399 include_dirs = expat_inc,
1400 libraries = expat_lib,
1401 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001402 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001403
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001404 # Fredrik Lundh's cElementTree module. Note that this also
1405 # uses expat (via the CAPI hook in pyexpat).
1406
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001407 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001408 define_macros.append(('USE_PYEXPAT_CAPI', None))
1409 exts.append(Extension('_elementtree',
1410 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001411 include_dirs = expat_inc,
1412 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001413 sources = ['_elementtree.c'],
1414 ))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001415 else:
1416 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001417
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001418 # Hye-Shik Chang's CJKCodecs modules.
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001419 exts.append(Extension('_multibytecodec',
1420 ['cjkcodecs/multibytecodec.c']))
1421 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1422 exts.append(Extension('_codecs_%s' % loc,
1423 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001424
Stefan Krah1919b7e2012-03-21 18:25:23 +01001425 # Stefan Krah's _decimal module
1426 exts.append(self._decimal_ext())
1427
Thomas Hellercf567c12006-03-08 19:51:58 +00001428 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001429 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001430
Benjamin Petersone711caf2008-06-11 16:44:04 +00001431 # Richard Oudkerk's multiprocessing module
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001432 if host_platform == 'win32': # Windows
Benjamin Petersone711caf2008-06-11 16:44:04 +00001433 macros = dict()
1434 libraries = ['ws2_32']
1435
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001436 elif host_platform == 'darwin': # Mac OSX
Benjamin Peterson965ce872009-04-05 21:24:58 +00001437 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001438 libraries = []
1439
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001440 elif host_platform == 'cygwin': # Cygwin
Benjamin Peterson965ce872009-04-05 21:24:58 +00001441 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001442 libraries = []
Benjamin Peterson41181742008-07-02 20:22:54 +00001443
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001444 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Benjamin Peterson41181742008-07-02 20:22:54 +00001445 # FreeBSD's P1003.1b semaphore support is very experimental
1446 # and has many known problems. (as of June 2008)
Benjamin Peterson965ce872009-04-05 21:24:58 +00001447 macros = dict()
Benjamin Peterson41181742008-07-02 20:22:54 +00001448 libraries = []
1449
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001450 elif host_platform.startswith('openbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001451 macros = dict()
Benjamin Petersone5384b02008-10-04 22:00:42 +00001452 libraries = []
1453
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001454 elif host_platform.startswith('netbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001455 macros = dict()
Jesse Noller32d68c22009-03-31 18:48:42 +00001456 libraries = []
1457
Benjamin Petersone711caf2008-06-11 16:44:04 +00001458 else: # Linux and other unices
Benjamin Peterson965ce872009-04-05 21:24:58 +00001459 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001460 libraries = ['rt']
1461
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001462 if host_platform == 'win32':
Benjamin Petersone711caf2008-06-11 16:44:04 +00001463 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1464 '_multiprocessing/semaphore.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001465 ]
1466
1467 else:
1468 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001469 ]
Mark Dickinsona614f042009-11-28 12:48:43 +00001470 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1471 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001472 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1473
Jesse Noller6fd47e22009-01-23 14:09:08 +00001474 if sysconfig.get_config_var('WITH_THREAD'):
1475 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1476 define_macros=list(macros.items()),
1477 include_dirs=["Modules/_multiprocessing"]))
1478 else:
1479 missing.append('_multiprocessing')
Benjamin Petersone711caf2008-06-11 16:44:04 +00001480 # End multiprocessing
Guido van Rossuma9e20242007-03-08 00:43:48 +00001481
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001482 # Platform-specific libraries
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001483 if host_platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001484 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001485 else:
1486 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001487
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001488 if host_platform == 'darwin':
Benjamin Petersonebacd262008-05-29 21:09:51 +00001489 exts.append(
1490 Extension('_gestalt', ['_gestalt.c'],
1491 extra_link_args=['-framework', 'Carbon'])
1492 )
Ronald Oussoren84151202010-04-18 20:46:11 +00001493 exts.append(
1494 Extension('_scproxy', ['_scproxy.c'],
1495 extra_link_args=[
1496 '-framework', 'SystemConfiguration',
1497 '-framework', 'CoreFoundation',
1498 ]))
Benjamin Petersonebacd262008-05-29 21:09:51 +00001499
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001500 self.extensions.extend(exts)
1501
1502 # Call the method for detecting whether _tkinter can be compiled
1503 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001504
Guido van Rossumd8faa362007-04-27 19:54:29 +00001505 if '_tkinter' not in [e.name for e in self.extensions]:
1506 missing.append('_tkinter')
1507
1508 return missing
1509
Jack Jansen0b06be72002-06-21 14:48:38 +00001510 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1511 # The _tkinter module, using frameworks. Since frameworks are quite
1512 # different the UNIX search logic is not sharable.
1513 from os.path import join, exists
1514 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001515 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001516 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001517 join(os.getenv('HOME'), '/Library/Frameworks')
1518 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001519
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001520 sysroot = macosx_sdk_root()
1521
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001522 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001523 # bundles.
1524 # XXX distutils should support -F!
1525 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001526 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001527
1528
Jack Jansen0b06be72002-06-21 14:48:38 +00001529 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001530 if is_macosx_sdk_path(F):
1531 if not exists(join(sysroot, F[1:], fw + '.framework')):
1532 break
1533 else:
1534 if not exists(join(F, fw + '.framework')):
1535 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001536 else:
1537 # ok, F is now directory with both frameworks. Continure
1538 # building
1539 break
1540 else:
1541 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1542 # will now resume.
1543 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001544
Jack Jansen0b06be72002-06-21 14:48:38 +00001545 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1546 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001547 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001548 #
1549 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001550 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001551 for fw in ('Tcl', 'Tk')
1552 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001553 ]
1554
Tim Peters2c60f7a2003-01-29 03:49:43 +00001555 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001556 # complicated search, this is a hard-coded path. It could bail out
1557 # if X11 libs are not found...
1558 include_dirs.append('/usr/X11R6/include')
1559 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1560
Georg Brandlfcaf9102008-07-16 02:17:56 +00001561 # All existing framework builds of Tcl/Tk don't support 64-bit
1562 # architectures.
1563 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1564 archs = re.findall('-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001565
Ronald Oussorend097efe2009-09-15 19:07:58 +00001566 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1567 if not os.path.exists(self.build_temp):
1568 os.makedirs(self.build_temp)
1569
1570 # Note: cannot use os.popen or subprocess here, that
1571 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001572 if is_macosx_sdk_path(F):
1573 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1574 else:
1575 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001576
Brett Cannon9f5db072010-10-29 20:19:27 +00001577 with open(tmpfile) as fp:
1578 detected_archs = []
1579 for ln in fp:
1580 a = ln.split()[-1]
1581 if a in archs:
1582 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001583 os.unlink(tmpfile)
1584
1585 for a in detected_archs:
1586 frameworks.append('-arch')
1587 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001588
Jack Jansen0b06be72002-06-21 14:48:38 +00001589 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1590 define_macros=[('WITH_APPINIT', 1)],
1591 include_dirs = include_dirs,
1592 libraries = [],
Georg Brandlfcaf9102008-07-16 02:17:56 +00001593 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001594 extra_link_args = frameworks,
1595 )
1596 self.extensions.append(ext)
1597 return 1
1598
Tim Peters2c60f7a2003-01-29 03:49:43 +00001599
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001600 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001601 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001602
Jack Jansen0b06be72002-06-21 14:48:38 +00001603 # Rather than complicate the code below, detecting and building
1604 # AquaTk is a separate method. Only one Tkinter will be built on
1605 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001606 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001607 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001608 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001609
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001610 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001611 # The versions with dots are used on Unix, and the versions without
1612 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001613 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001614 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1615 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé36797272010-07-22 12:50:05 +00001616 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001617 'tk' + version)
Tarek Ziadé36797272010-07-22 12:50:05 +00001618 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001619 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001620 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001621 # Exit the loop when we've found the Tcl/Tk libraries
1622 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001623
Fredrik Lundhade711a2001-01-24 08:00:28 +00001624 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001625 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001626 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001627 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001628 dotversion = version
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001629 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001630 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1631 # but the include subdirs are named like .../include/tcl8.3.
1632 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1633 tcl_include_sub = []
1634 tk_include_sub = []
1635 for dir in inc_dirs:
1636 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1637 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1638 tk_include_sub += tcl_include_sub
1639 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1640 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001641
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001642 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001643 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001644 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001645 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001646
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001647 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001648
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001649 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1650 for dir in tcl_includes + tk_includes:
1651 if dir not in include_dirs:
1652 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001653
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001654 # Check for various platform-specific directories
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001655 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001656 include_dirs.append('/usr/openwin/include')
1657 added_lib_dirs.append('/usr/openwin/lib')
1658 elif os.path.exists('/usr/X11R6/include'):
1659 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001660 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001661 added_lib_dirs.append('/usr/X11R6/lib')
1662 elif os.path.exists('/usr/X11R5/include'):
1663 include_dirs.append('/usr/X11R5/include')
1664 added_lib_dirs.append('/usr/X11R5/lib')
1665 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001666 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001667 include_dirs.append('/usr/X11/include')
1668 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001669
Jason Tishler9181c942003-02-05 15:16:17 +00001670 # If Cygwin, then verify that X is installed before proceeding
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001671 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001672 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1673 if x11_inc is None:
1674 return
1675
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001676 # Check for BLT extension
Tarek Ziadé36797272010-07-22 12:50:05 +00001677 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001678 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001679 defs.append( ('WITH_BLT', 1) )
1680 libs.append('BLT8.0')
Tarek Ziadé36797272010-07-22 12:50:05 +00001681 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001682 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001683 defs.append( ('WITH_BLT', 1) )
1684 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001685
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001686 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001687 libs.append('tk'+ version)
1688 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001689
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001690 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001691 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001692
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001693 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001694 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001695 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001696
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001697 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1698 define_macros=[('WITH_APPINIT', 1)] + defs,
1699 include_dirs = include_dirs,
1700 libraries = libs,
1701 library_dirs = added_lib_dirs,
1702 )
1703 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001704
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001705## # Uncomment these lines if you want to play with xxmodule.c
1706## ext = Extension('xx', ['xxmodule.c'])
1707## self.extensions.append(ext)
Antoine Pitrou8c30a712010-12-04 18:36:03 +00001708 if 'd' not in sys.abiflags:
1709 ext = Extension('xxlimited', ['xxlimited.c'],
1710 define_macros=[('Py_LIMITED_API', 1)])
1711 self.extensions.append(ext)
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001712
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001713 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001714 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001715 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001716 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001717 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001718 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001719 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001720
Christian Heimes78644762008-03-04 23:39:23 +00001721 def configure_ctypes_darwin(self, ext):
1722 # Darwin (OS X) uses preconfigured files, in
1723 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauer014bf282009-02-05 16:35:45 +00001724 srcdir = sysconfig.get_config_var('srcdir')
Christian Heimes78644762008-03-04 23:39:23 +00001725 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1726 '_ctypes', 'libffi_osx'))
1727 sources = [os.path.join(ffi_srcdir, p)
1728 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001729 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001730 'x86/x86-darwin.S',
1731 'x86/x86-ffi_darwin.c',
1732 'x86/x86-ffi64.c',
1733 'powerpc/ppc-darwin.S',
1734 'powerpc/ppc-darwin_closure.S',
1735 'powerpc/ppc-ffi_darwin.c',
1736 'powerpc/ppc64-darwin_closure.S',
1737 ]]
1738
1739 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001740 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001741
1742 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1743 os.path.join(ffi_srcdir, 'powerpc')]
1744 ext.include_dirs.extend(include_dirs)
1745 ext.sources.extend(sources)
1746 return True
1747
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001748 def configure_ctypes(self, ext):
1749 if not self.use_system_libffi:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001750 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001751 return self.configure_ctypes_darwin(ext)
1752
Neil Schemenauer014bf282009-02-05 16:35:45 +00001753 srcdir = sysconfig.get_config_var('srcdir')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001754 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1755 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1756 '_ctypes', 'libffi'))
1757 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001758
Thomas Wouters477c8d52006-05-27 19:21:47 +00001759 from distutils.dep_util import newer_group
1760
1761 config_sources = [os.path.join(ffi_srcdir, fname)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001762 for fname in os.listdir(ffi_srcdir)
1763 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001764 if self.force or newer_group(config_sources,
1765 ffi_configfile):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001766 from distutils.dir_util import mkpath
1767 mkpath(ffi_builddir)
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001768 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
1769 if (('--host=' in arg) or ('--build=' in arg))]
Thomas Hellercf567c12006-03-08 19:51:58 +00001770
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001771 # Pass empty CFLAGS because we'll just append the resulting
1772 # CFLAGS to Python's; -g or -O2 is to be avoided.
1773 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1774 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001775
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001776 res = os.system(cmd)
1777 if res or not os.path.exists(ffi_configfile):
Guido van Rossum452bf512007-02-09 05:32:43 +00001778 print("Failed to configure _ctypes module")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001780
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001781 fficonfig = {}
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001782 with open(ffi_configfile) as f:
1783 exec(f.read(), globals(), fficonfig)
Thomas Hellercf567c12006-03-08 19:51:58 +00001784
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001785 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001786 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001787
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001788 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001789 ffi_builddir,
1790 os.path.join(ffi_srcdir, 'src')]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001791 extra_compile_args = fficonfig['ffi_cflags'].split()
1792
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001793 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1794 fficonfig['ffi_sources'])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001795 ext.include_dirs.extend(include_dirs)
1796 ext.extra_compile_args.extend(extra_compile_args)
1797 return True
1798
1799 def detect_ctypes(self, inc_dirs, lib_dirs):
1800 self.use_system_libffi = False
1801 include_dirs = []
1802 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001803 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001804 sources = ['_ctypes/_ctypes.c',
1805 '_ctypes/callbacks.c',
1806 '_ctypes/callproc.c',
1807 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001808 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001809 depends = ['_ctypes/ctypes.h']
1810
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001811 if host_platform == 'darwin':
Ronald Oussoren2decf222010-09-05 18:25:59 +00001812 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001813 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001814 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001815 include_dirs.append('_ctypes/darwin')
1816# XXX Is this still needed?
1817## extra_link_args.extend(['-read_only_relocs', 'warning'])
1818
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001819 elif host_platform == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001820 # XXX This shouldn't be necessary; it appears that some
1821 # of the assembler code is non-PIC (i.e. it has relocations
1822 # when it shouldn't. The proper fix would be to rewrite
1823 # the assembler code to be PIC.
1824 # This only works with GCC; the Sun compiler likely refuses
1825 # this option. If you want to compile ctypes with the Sun
1826 # compiler, please research a proper solution, instead of
1827 # finding some -z option for the Sun compiler.
1828 extra_link_args.append('-mimpure-text')
1829
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001830 elif host_platform.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001831 extra_link_args.append('-fPIC')
1832
Thomas Hellercf567c12006-03-08 19:51:58 +00001833 ext = Extension('_ctypes',
1834 include_dirs=include_dirs,
1835 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001836 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001837 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001838 sources=sources,
1839 depends=depends)
1840 ext_test = Extension('_ctypes_test',
1841 sources=['_ctypes/_ctypes_test.c'])
1842 self.extensions.extend([ext, ext_test])
1843
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001844 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1845 return
1846
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001847 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001848 # OS X 10.5 comes with libffi.dylib; the include files are
1849 # in /usr/include/ffi
1850 inc_dirs.append('/usr/include/ffi')
1851
Benjamin Petersond78735d2010-01-01 16:04:23 +00001852 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001853 if not ffi_inc or ffi_inc[0] == '':
Benjamin Petersond78735d2010-01-01 16:04:23 +00001854 ffi_inc = find_file('ffi.h', [], inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001855 if ffi_inc is not None:
1856 ffi_h = ffi_inc[0] + '/ffi.h'
Brett Cannon9f5db072010-10-29 20:19:27 +00001857 with open(ffi_h) as fp:
1858 while 1:
1859 line = fp.readline()
1860 if not line:
1861 ffi_inc = None
1862 break
1863 if line.startswith('#define LIBFFI_H'):
1864 break
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001865 ffi_lib = None
1866 if ffi_inc is not None:
1867 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé36797272010-07-22 12:50:05 +00001868 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 ffi_lib = lib_name
1870 break
1871
1872 if ffi_inc and ffi_lib:
1873 ext.include_dirs.extend(ffi_inc)
1874 ext.libraries.append(ffi_lib)
1875 self.use_system_libffi = True
1876
Stefan Krah1919b7e2012-03-21 18:25:23 +01001877 def _decimal_ext(self):
Stefan Krah60187b52012-03-23 19:06:27 +01001878 extra_compile_args = []
Stefan Krah3746aee2012-06-30 18:20:33 +02001879 undef_macros = ['NDEBUG']
Stefan Krah60187b52012-03-23 19:06:27 +01001880 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
1881 include_dirs = []
1882 libraries = ['mpdec']
1883 sources = ['_decimal/_decimal.c']
1884 depends = ['_decimal/docstrings.h']
1885 else:
Ned Deily458a6fb2012-04-01 02:30:46 -07001886 srcdir = sysconfig.get_config_var('srcdir')
1887 include_dirs = [os.path.abspath(os.path.join(srcdir,
1888 'Modules',
1889 '_decimal',
1890 'libmpdec'))]
Stefan Krah60187b52012-03-23 19:06:27 +01001891 libraries = []
1892 sources = [
1893 '_decimal/_decimal.c',
1894 '_decimal/libmpdec/basearith.c',
1895 '_decimal/libmpdec/constants.c',
1896 '_decimal/libmpdec/context.c',
1897 '_decimal/libmpdec/convolute.c',
1898 '_decimal/libmpdec/crt.c',
1899 '_decimal/libmpdec/difradix2.c',
1900 '_decimal/libmpdec/fnt.c',
1901 '_decimal/libmpdec/fourstep.c',
1902 '_decimal/libmpdec/io.c',
1903 '_decimal/libmpdec/memory.c',
1904 '_decimal/libmpdec/mpdecimal.c',
1905 '_decimal/libmpdec/numbertheory.c',
1906 '_decimal/libmpdec/sixstep.c',
1907 '_decimal/libmpdec/transpose.c',
1908 ]
1909 depends = [
1910 '_decimal/docstrings.h',
1911 '_decimal/libmpdec/basearith.h',
1912 '_decimal/libmpdec/bits.h',
1913 '_decimal/libmpdec/constants.h',
1914 '_decimal/libmpdec/convolute.h',
1915 '_decimal/libmpdec/crt.h',
1916 '_decimal/libmpdec/difradix2.h',
1917 '_decimal/libmpdec/fnt.h',
1918 '_decimal/libmpdec/fourstep.h',
1919 '_decimal/libmpdec/io.h',
1920 '_decimal/libmpdec/memory.h',
1921 '_decimal/libmpdec/mpdecimal.h',
1922 '_decimal/libmpdec/numbertheory.h',
1923 '_decimal/libmpdec/sixstep.h',
1924 '_decimal/libmpdec/transpose.h',
1925 '_decimal/libmpdec/typearith.h',
1926 '_decimal/libmpdec/umodarith.h',
1927 ]
1928
Stefan Krah1919b7e2012-03-21 18:25:23 +01001929 config = {
1930 'x64': [('CONFIG_64','1'), ('ASM','1')],
1931 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
1932 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
1933 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
1934 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
1935 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
1936 ('LEGACY_COMPILER','1')],
1937 'universal': [('UNIVERSAL','1')]
1938 }
1939
Stefan Krah1919b7e2012-03-21 18:25:23 +01001940 cc = sysconfig.get_config_var('CC')
1941 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
1942 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
1943
1944 if machine:
1945 # Override automatic configuration to facilitate testing.
1946 define_macros = config[machine]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001947 elif host_platform == 'darwin':
Stefan Krah1919b7e2012-03-21 18:25:23 +01001948 # Universal here means: build with the same options Python
1949 # was built with.
1950 define_macros = config['universal']
1951 elif sizeof_size_t == 8:
1952 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
1953 define_macros = config['x64']
1954 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
1955 define_macros = config['uint128']
1956 else:
1957 define_macros = config['ansi64']
1958 elif sizeof_size_t == 4:
1959 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
1960 if ppro and ('gcc' in cc or 'clang' in cc) and \
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001961 not 'sunos' in host_platform:
Stefan Krah1919b7e2012-03-21 18:25:23 +01001962 # solaris: problems with register allocation.
1963 # icc >= 11.0 works as well.
1964 define_macros = config['ppro']
1965 else:
1966 define_macros = config['ansi32']
1967 else:
1968 raise DistutilsError("_decimal: unsupported architecture")
1969
1970 # Workarounds for toolchain bugs:
1971 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
1972 # Some versions of gcc miscompile inline asm:
1973 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
1974 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
1975 extra_compile_args.append('-fno-ipa-pure-const')
1976 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
1977 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
1978 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
1979 undef_macros.append('_FORTIFY_SOURCE')
1980
1981 # Faster version without thread local contexts:
1982 if not sysconfig.get_config_var('WITH_THREAD'):
1983 define_macros.append(('WITHOUT_THREADS', 1))
1984
1985 # Uncomment for extra functionality:
1986 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
1987 ext = Extension (
1988 '_decimal',
1989 include_dirs=include_dirs,
Stefan Krah60187b52012-03-23 19:06:27 +01001990 libraries=libraries,
Stefan Krah1919b7e2012-03-21 18:25:23 +01001991 define_macros=define_macros,
1992 undef_macros=undef_macros,
1993 extra_compile_args=extra_compile_args,
1994 sources=sources,
1995 depends=depends
1996 )
1997 return ext
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001998
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001999class PyBuildInstall(install):
2000 # Suppress the warning about installation into the lib_dynload
2001 # directory, which is not in sys.path when running Python during
2002 # installation:
2003 def initialize_options (self):
2004 install.initialize_options(self)
2005 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002006
Éric Araujoe6792c12011-06-09 14:07:02 +02002007 # Customize subcommands to not install an egg-info file for Python
2008 sub_commands = [('install_lib', install.has_lib),
2009 ('install_headers', install.has_headers),
2010 ('install_scripts', install.has_scripts),
2011 ('install_data', install.has_data)]
2012
2013
Michael W. Hudson529a5052002-12-17 16:47:17 +00002014class PyBuildInstallLib(install_lib):
2015 # Do exactly what install_lib does but make sure correct access modes get
2016 # set on installed directories and files. All installed files with get
2017 # mode 644 unless they are a shared library in which case they will get
2018 # mode 755. All installed directories will get mode 755.
2019
2020 so_ext = sysconfig.get_config_var("SO")
2021
2022 def install(self):
2023 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002024 self.set_file_modes(outfiles, 0o644, 0o755)
2025 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002026 return outfiles
2027
2028 def set_file_modes(self, files, defaultMode, sharedLibMode):
2029 if not self.is_chmod_supported(): return
2030 if not files: return
2031
2032 for filename in files:
2033 if os.path.islink(filename): continue
2034 mode = defaultMode
2035 if filename.endswith(self.so_ext): mode = sharedLibMode
2036 log.info("changing mode of %s to %o", filename, mode)
2037 if not self.dry_run: os.chmod(filename, mode)
2038
2039 def set_dir_modes(self, dirname, mode):
2040 if not self.is_chmod_supported(): return
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002041 for dirpath, dirnames, fnames in os.walk(dirname):
2042 if os.path.islink(dirpath):
2043 continue
2044 log.info("changing mode of %s to %o", dirpath, mode)
2045 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002046
2047 def is_chmod_supported(self):
2048 return hasattr(os, 'chmod')
2049
Georg Brandlff52f762010-12-28 09:51:43 +00002050class PyBuildScripts(build_scripts):
2051 def copy_scripts(self):
2052 outfiles, updated_files = build_scripts.copy_scripts(self)
2053 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2054 minoronly = '.{0[1]}'.format(sys.version_info)
2055 newoutfiles = []
2056 newupdated_files = []
2057 for filename in outfiles:
Vinay Sajip7ded1f02012-05-26 03:45:29 +01002058 if filename.endswith(('2to3', 'pyvenv')):
Georg Brandlff52f762010-12-28 09:51:43 +00002059 newfilename = filename + fullversion
2060 else:
2061 newfilename = filename + minoronly
2062 log.info('renaming {} to {}'.format(filename, newfilename))
2063 os.rename(filename, newfilename)
2064 newoutfiles.append(newfilename)
2065 if filename in updated_files:
2066 newupdated_files.append(newfilename)
2067 return newoutfiles, newupdated_files
2068
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002069SUMMARY = """
2070Python is an interpreted, interactive, object-oriented programming
2071language. It is often compared to Tcl, Perl, Scheme or Java.
2072
2073Python combines remarkable power with very clear syntax. It has
2074modules, classes, exceptions, very high level dynamic data types, and
2075dynamic typing. There are interfaces to many system calls and
2076libraries, as well as to various windowing systems (X11, Motif, Tk,
2077Mac, MFC). New built-in modules are easily written in C or C++. Python
2078is also usable as an extension language for applications that need a
2079programmable interface.
2080
2081The Python implementation is portable: it runs on many brands of UNIX,
2082on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2083listed here, it may still be supported, if there's a C compiler for
2084it. Ask around on comp.lang.python -- or just try compiling Python
2085yourself.
2086"""
2087
2088CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002089Development Status :: 6 - Mature
2090License :: OSI Approved :: Python Software Foundation License
2091Natural Language :: English
2092Programming Language :: C
2093Programming Language :: Python
2094Topic :: Software Development
2095"""
2096
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002097def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002098 # turn off warnings when deprecated modules are imported
2099 import warnings
2100 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002101 setup(# PyPI Metadata (PEP 301)
2102 name = "Python",
2103 version = sys.version.split()[0],
2104 url = "http://www.python.org/%s" % sys.version[:3],
2105 maintainer = "Guido van Rossum and the Python community",
2106 maintainer_email = "python-dev@python.org",
2107 description = "A high-level object-oriented programming language",
2108 long_description = SUMMARY.strip(),
2109 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002110 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002111 platforms = ["Many"],
2112
2113 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002114 cmdclass = {'build_ext': PyBuildExt,
2115 'build_scripts': PyBuildScripts,
2116 'install': PyBuildInstall,
2117 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002118 # The struct module is defined here, because build_ext won't be
2119 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002120 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002121
Georg Brandlff52f762010-12-28 09:51:43 +00002122 # If you change the scripts installed here, you also need to
2123 # check the PyBuildScripts command above, and change the links
2124 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002125 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Éric Araujo859aad62012-06-24 00:07:41 -04002126 "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002127 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002128
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002129# --install-platlib
2130if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002131 main()