blob: 19e6bc366867aa4580f736508b5f10f24fd77807 [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.com93df16b2012-06-30 14:32:08 +020018def get_platform():
19 # Get value of sys.platform
20 if sys.platform.startswith('osf1'):
21 return 'osf1'
22 return sys.platform
23host_platform = get_platform()
24
Gregory P. Smithb04ded42010-01-03 00:38:10 +000025# Were we compiled --with-pydebug or with #define Py_DEBUG?
26COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
27
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000028# This global variable is used to hold the list of modules to be disabled.
29disabled_module_list = []
30
Antoine Pitroue9b428f2010-08-13 22:25:01 +000031# File which contains the directory for shared mods (for sys.path fixup
32# when running from the build dir, see Modules/getpath.c)
33_BUILDDIR_COOKIE = "pybuilddir.txt"
34
Michael W. Hudson39230b32002-01-16 15:26:48 +000035def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000036 """Add the directory 'dir' to the list 'dirlist' (after any relative
37 directories) if:
38
Michael W. Hudson39230b32002-01-16 15:26:48 +000039 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000040 2) 'dir' actually exists, and is a directory.
41 """
42 if dir is None or not os.path.isdir(dir) or dir in dirlist:
43 return
44 for i, path in enumerate(dirlist):
45 if not os.path.isabs(path):
46 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000047 return
48 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +000049
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000050def macosx_sdk_root():
51 """
52 Return the directory of the current OSX SDK,
53 or '/' if no SDK was specified.
54 """
55 cflags = sysconfig.get_config_var('CFLAGS')
56 m = re.search(r'-isysroot\s+(\S+)', cflags)
57 if m is None:
58 sysroot = '/'
59 else:
60 sysroot = m.group(1)
61 return sysroot
62
63def is_macosx_sdk_path(path):
64 """
65 Returns True if 'path' can be located in an OSX SDK
66 """
Ronald Oussorendc969e52010-06-27 12:37:46 +000067 return (path.startswith('/usr/') and not path.startswith('/usr/local')) or path.startswith('/System/')
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000068
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000069def find_file(filename, std_dirs, paths):
70 """Searches for the directory where a given file is located,
71 and returns a possibly-empty list of additional directories, or None
72 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000073
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000074 'filename' is the name of a file, such as readline.h or libcrypto.a.
75 'std_dirs' is the list of standard system directories; if the
76 file is found in one of them, no additional directives are needed.
77 'paths' is a list of additional locations to check; if the file is
78 found in one of them, the resulting list will contain the directory.
79 """
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020080 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000081 # Honor the MacOSX SDK setting when one was specified.
82 # An SDK is a directory with the same structure as a real
83 # system, but with only header files and libraries.
84 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000085
86 # Check the standard locations
87 for dir in std_dirs:
88 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000089
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020090 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000091 f = os.path.join(sysroot, dir[1:], filename)
92
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000093 if os.path.exists(f): return []
94
95 # Check the additional directories
96 for dir in paths:
97 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000098
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020099 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000100 f = os.path.join(sysroot, dir[1:], filename)
101
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000102 if os.path.exists(f):
103 return [dir]
104
105 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000106 return None
107
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000108def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000109 result = compiler.find_library_file(std_dirs + paths, libname)
110 if result is None:
111 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000112
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200113 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000114 sysroot = macosx_sdk_root()
115
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000116 # Check whether the found file is in one of the standard directories
117 dirname = os.path.dirname(result)
118 for p in std_dirs:
119 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000120 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000121
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200122 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000123 if os.path.join(sysroot, p[1:]) == dirname:
124 return [ ]
125
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000126 if p == dirname:
127 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000128
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000129 # Otherwise, it must have been in one of the additional directories,
130 # so we have to figure out which one.
131 for p in paths:
132 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000133 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000134
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200135 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000136 if os.path.join(sysroot, p[1:]) == dirname:
137 return [ p ]
138
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000139 if p == dirname:
140 return [p]
141 else:
142 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000143
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000144def module_enabled(extlist, modname):
145 """Returns whether the module 'modname' is present in the list
146 of extensions 'extlist'."""
147 extlist = [ext for ext in extlist if ext.name == modname]
148 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000149
Jack Jansen144ebcc2001-08-05 22:31:19 +0000150def find_module_file(module, dirlist):
151 """Find a module in a set of possible folders. If it is not found
152 return the unadorned filename"""
153 list = find_file(module, [], dirlist)
154 if not list:
155 return module
156 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000157 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000158 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000159
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000160class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000161
Guido van Rossumd8faa362007-04-27 19:54:29 +0000162 def __init__(self, dist):
163 build_ext.__init__(self, dist)
164 self.failed = []
165
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000166 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000167
168 # Detect which modules should be compiled
Antoine Pitrou327fd402010-09-04 16:28:00 +0000169 old_so = self.compiler.shared_lib_extension
170 # Workaround PEP 3149 stuff
171 self.compiler.shared_lib_extension = os.environ.get("SO", ".so")
172 try:
173 missing = self.detect_modules()
174 finally:
175 self.compiler.shared_lib_extension = old_so
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000176
177 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000178 extensions = [ext for ext in self.extensions
179 if ext.name not in disabled_module_list]
180 # move ctypes to the end, it depends on other modules
181 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
182 if "_ctypes" in ext_map:
183 ctypes = extensions.pop(ext_map["_ctypes"])
184 extensions.append(ctypes)
185 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000186
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000187 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000188 # with Modules/.
189 srcdir = sysconfig.get_config_var('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000190 if not srcdir:
191 # Maybe running on Windows but not using CYGWIN?
192 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer4d491a52009-02-06 00:27:50 +0000193 srcdir = os.path.abspath(srcdir)
Neil Schemenauer014bf282009-02-05 16:35:45 +0000194 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000195
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000196 # Fix up the paths for scripts, too
197 self.distribution.scripts = [os.path.join(srcdir, filename)
198 for filename in self.distribution.scripts]
199
Christian Heimesaf98da12008-01-27 15:18:18 +0000200 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000201 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100202 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000203
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000204 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000205 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000206 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000207 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000208 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000209 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000210 else:
211 ext.depends = []
212 # re-compile extensions if a header file has been changed
213 ext.depends.extend(headers)
214
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000215 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000216 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000217 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000218 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000219
Ronald Oussoren94f25282010-05-05 19:11:21 +0000220 # Parse Modules/Setup and Modules/Setup.local to figure out which
221 # modules are turned on in the file.
222 remove_modules = []
223 for filename in ('Modules/Setup', 'Modules/Setup.local'):
224 input = text_file.TextFile(filename, join_lines=1)
225 while 1:
226 line = input.readline()
227 if not line: break
228 line = line.split()
229 remove_modules.append(line[0])
230 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000231
Ronald Oussoren94f25282010-05-05 19:11:21 +0000232 for ext in self.extensions[:]:
233 if ext.name in remove_modules:
234 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000235
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000236 # When you run "make CC=altcc" or something similar, you really want
237 # those environment variables passed into the setup.py phase. Here's
238 # a small set of useful ones.
239 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000240 args = {}
241 # unfortunately, distutils doesn't let us provide separate C and C++
242 # compilers
243 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000244 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
245 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000246 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000247
Antoine Pitroue9b428f2010-08-13 22:25:01 +0000248 # Not only do we write the builddir cookie, but we manually install
249 # the shared modules directory if it isn't already in sys.path.
250 # Otherwise trying to import the extensions after building them
251 # will fail.
252 with open(_BUILDDIR_COOKIE, "wb") as f:
253 f.write(self.build_lib.encode('utf-8', 'surrogateescape'))
Matthias Klose73117292010-08-23 16:47:09 +0000254 abs_build_lib = os.path.join(os.getcwd(), self.build_lib)
Antoine Pitroue9b428f2010-08-13 22:25:01 +0000255 if abs_build_lib not in sys.path:
256 sys.path.append(abs_build_lib)
257
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000258 build_ext.build_extensions(self)
259
Guido van Rossumd8faa362007-04-27 19:54:29 +0000260 longest = max([len(e.name) for e in self.extensions])
261 if self.failed:
262 longest = max(longest, max([len(name) for name in self.failed]))
263
264 def print_three_column(lst):
265 lst.sort(key=str.lower)
266 # guarantee zip() doesn't drop anything
267 while len(lst) % 3:
268 lst.append("")
269 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
270 print("%-*s %-*s %-*s" % (longest, e, longest, f,
271 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000272
273 if missing:
274 print()
Benjamin Petersonda10d3b2009-01-01 00:23:30 +0000275 print("Python build finished, but the necessary bits to build "
276 "these modules were not found:")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277 print_three_column(missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000278 print("To find the necessary bits, look in setup.py in"
279 " detect_modules() for the module's name.")
280 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000281
282 if self.failed:
283 failed = self.failed[:]
284 print()
285 print("Failed to build these modules:")
286 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000287 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000288
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000289 def build_extension(self, ext):
290
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000291 if ext.name == '_ctypes':
292 if not self.configure_ctypes(ext):
293 return
294
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000295 try:
296 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000297 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000298 self.announce('WARNING: building of extension "%s" failed: %s' %
299 (ext.name, sys.exc_info()[1]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000300 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000301 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000302 # Workaround for Mac OS X: The Carbon-based modules cannot be
303 # reliably imported into a command-line Python
304 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000305 self.announce(
306 'WARNING: skipping import check for Carbon-based "%s"' %
307 ext.name)
308 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000309
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200310 if host_platform == 'darwin' and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000311 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000312 # Don't bother doing an import check when an extension was
313 # build with an explicit '-arch' flag on OSX. That's currently
314 # only used to build 32-bit only extensions in a 4-way
315 # universal build and loading 32-bit code into a 64-bit
316 # process will fail.
317 self.announce(
318 'WARNING: skipping import check for "%s"' %
319 ext.name)
320 return
321
Jason Tishler24cf7762002-05-22 16:46:15 +0000322 # Workaround for Cygwin: Cygwin currently has fork issues when many
323 # modules have been imported
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200324 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000325 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
326 % ext.name)
327 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000328 ext_filename = os.path.join(
329 self.build_lib,
330 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000331
332 # If the build directory didn't exist when setup.py was
333 # started, sys.path_importer_cache has a negative result
334 # cached. Clear that cache before trying to import.
335 sys.path_importer_cache.clear()
336
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000337 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000338 imp.load_dynamic(ext.name, ext_filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000339 except ImportError as why:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000340 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000341 self.announce('*** WARNING: renaming "%s" since importing it'
342 ' failed: %s' % (ext.name, why), level=3)
343 assert not self.inplace
344 basename, tail = os.path.splitext(ext_filename)
345 newname = basename + "_failed" + tail
346 if os.path.exists(newname):
347 os.remove(newname)
348 os.rename(ext_filename, newname)
349
350 # XXX -- This relies on a Vile HACK in
351 # distutils.command.build_ext.build_extension(). The
352 # _built_objects attribute is stored there strictly for
353 # use here.
354 # If there is a failure, _built_objects may not be there,
355 # so catch the AttributeError and move on.
356 try:
357 for filename in self._built_objects:
358 os.remove(filename)
359 except AttributeError:
360 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000361 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000362 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000363 self.announce('*** WARNING: importing extension "%s" '
364 'failed with %s: %s' % (ext.name, exc_type, why),
365 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000366 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000367
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400368 def add_multiarch_paths(self):
369 # Debian/Ubuntu multiarch support.
370 # https://wiki.ubuntu.com/MultiarchSpec
Barry Warsaw88e19452011-04-07 10:40:36 -0400371 if not find_executable('dpkg-architecture'):
372 return
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400373 tmpfile = os.path.join(self.build_temp, 'multiarch')
374 if not os.path.exists(self.build_temp):
375 os.makedirs(self.build_temp)
376 ret = os.system(
377 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
378 tmpfile)
379 try:
380 if ret >> 8 == 0:
381 with open(tmpfile) as fp:
382 multiarch_path_component = fp.readline().strip()
383 add_dir_to_list(self.compiler.library_dirs,
384 '/usr/lib/' + multiarch_path_component)
385 add_dir_to_list(self.compiler.include_dirs,
386 '/usr/include/' + multiarch_path_component)
387 finally:
388 os.unlink(tmpfile)
389
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000390 def detect_modules(self):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000391 # Ensure that /usr/local is always used, but the local build
392 # directories (i.e. '.' and 'Include') must be first. See issue
393 # 10520.
Tarek Ziadé36797272010-07-22 12:50:05 +0000394 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
395 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400396 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000397
Brett Cannon516592f2004-12-07 00:42:59 +0000398 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000399 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000400 # We must get the values from the Makefile and not the environment
401 # directly since an inconsistently reproducible issue comes up where
402 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000403 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000404 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000405 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
406 ('LDFLAGS', '-L', self.compiler.library_dirs),
407 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000408 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000409 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000410 # To prevent optparse from raising an exception about any
Skip Montanaroa5c2a512008-10-07 02:51:48 +0000411 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000412 # all double dashes and any dashes followed by a character
413 # that is not for the option we are dealing with.
414 #
415 # Please note that order of the regex is important! We must
416 # strip out double-dashes first so that we don't end up with
417 # substituting "--Long" to "-Long" and thus lead to "ong" being
418 # used for a library directory.
Guido van Rossum04110fb2007-08-24 16:32:05 +0000419 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
420 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000421 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000422 # Make sure that allowing args interspersed with options is
423 # allowed
424 parser.allow_interspersed_args = True
425 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000426 parser.add_option(arg_name, dest="dirs", action="append")
427 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000428 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000429 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000430 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000431
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100432 if os.path.normpath(sys.base_prefix) != '/usr' \
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000433 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
434 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
435 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
436 # building a framework with different architectures than
437 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000438 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000439 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000440 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000441 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000442
443 # lib_dirs and inc_dirs are used to search for files;
444 # if a file is found in one of those directories, it can
445 # be assumed that no additional -I,-L directives are needed.
Tarek Ziadé36797272010-07-22 12:50:05 +0000446 lib_dirs = self.compiler.library_dirs + [
Martin v. Löwisfba73692004-11-13 11:13:35 +0000447 '/lib64', '/usr/lib64',
448 '/lib', '/usr/lib',
449 ]
Tarek Ziadé36797272010-07-22 12:50:05 +0000450 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000451 exts = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000452 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000453
Brett Cannon4454a1f2005-04-15 20:32:39 +0000454 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000455 with open(config_h) as file:
456 config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000457
Neil Schemenauer014bf282009-02-05 16:35:45 +0000458 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000459
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000460 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200461 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000462 lib_dirs += ['/usr/ccs/lib']
463
Charles-François Natali5739e102012-04-12 19:07:25 +0200464 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200465 if host_platform == 'hp-ux11':
Charles-François Natali5739e102012-04-12 19:07:25 +0200466 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
467
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200468 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +0000469 # This should work on any unixy platform ;-)
470 # If the user has bothered specifying additional -I and -L flags
471 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000472 #
473 # NOTE: using shlex.split would technically be more correct, but
474 # also gives a bootstrap problem. Let's hope nobody uses
475 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000476 cflags, ldflags = sysconfig.get_config_vars(
477 'CFLAGS', 'LDFLAGS')
478 for item in cflags.split():
479 if item.startswith('-I'):
480 inc_dirs.append(item[2:])
481
482 for item in ldflags.split():
483 if item.startswith('-L'):
484 lib_dirs.append(item[2:])
485
Fredrik Lundhade711a2001-01-24 08:00:28 +0000486 # Check for MacOS X, which doesn't need libm.a at all
487 math_libs = ['m']
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200488 if host_platform == 'darwin':
Fredrik Lundhade711a2001-01-24 08:00:28 +0000489 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000490
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000491 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
492
493 #
494 # The following modules are all pretty straightforward, and compile
495 # on pretty much any POSIXish platform.
496 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000497
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000498 # array objects
499 exts.append( Extension('array', ['arraymodule.c']) )
500 # complex math library functions
Mark Dickinsonf3718592009-12-21 15:27:41 +0000501 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
502 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000503 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000504 # math library functions, e.g. sin()
Mark Dickinson664b5112009-12-16 20:23:42 +0000505 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson8a591132009-12-17 08:35:56 +0000506 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000507 libraries=math_libs) )
Victor Stinnere0be4232011-10-25 13:06:09 +0200508
509 # time libraries: librt may be needed for clock_gettime()
510 time_libs = []
511 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
512 if lib:
513 time_libs.append(lib)
514
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000515 # time operations and variables
Victor Stinner5d272cc2012-03-13 13:35:55 +0100516 exts.append( Extension('time', ['timemodule.c'],
Victor Stinnere0be4232011-10-25 13:06:09 +0200517 libraries=time_libs) )
Victor Stinner5d272cc2012-03-13 13:35:55 +0100518 exts.append( Extension('_datetime', ['_datetimemodule.c']) )
Christian Heimesfe337bf2008-03-23 21:54:12 +0000519 # random number generator implemented in C
520 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000521 # bisect
522 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000523 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000524 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000525 # C-optimized pickle replacement
526 exts.append( Extension("_pickle", ["_pickle.c"]) )
Collin Winter670e6922007-03-21 02:57:17 +0000527 # atexit
528 exts.append( Extension("atexit", ["atexitmodule.c"]) )
Christian Heimes90540002008-05-08 14:29:10 +0000529 # _json speedups
530 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000531 # Python C API test module
Mark Dickinsona06f44b2009-02-10 16:18:22 +0000532 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
533 depends=['testcapi_long.h']) )
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100534 # Python PEP-3118 (buffer protocol) test module
535 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
Fred Drake0e474a82007-10-11 18:01:43 +0000536 # profiler (_lsprof is for cProfile.py)
Armin Rigoa871ef22006-02-08 12:53:56 +0000537 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000538 # static Unicode character database
Walter Dörwalde9eaab42007-05-22 16:02:13 +0000539 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000540
541 # Modules with some UNIX dependencies -- on by default:
542 # (If you have a really backward UNIX, select and socket may not be
543 # supported...)
544
545 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000546 libs = []
547 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
548 # May be necessary on AIX for flock function
549 libs = ['bsd']
550 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren94f25282010-05-05 19:11:21 +0000551 # pwd(3)
552 exts.append( Extension('pwd', ['pwdmodule.c']) )
553 # grp(3)
554 exts.append( Extension('grp', ['grpmodule.c']) )
555 # spwd, shadow passwords
556 if (config_h_vars.get('HAVE_GETSPNAM', False) or
557 config_h_vars.get('HAVE_GETSPENT', False)):
558 exts.append( Extension('spwd', ['spwdmodule.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000559 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000560 missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000561
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000562 # select(2); not on ancient System V
563 exts.append( Extension('select', ['selectmodule.c']) )
564
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000565 # Fred Drake's interface to the Python parser
566 exts.append( Extension('parser', ['parsermodule.c']) )
567
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000568 # Memory-mapped files (also works on Win32).
Ronald Oussoren94f25282010-05-05 19:11:21 +0000569 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000570
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000571 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000572 # syslog daemon interface
573 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000574
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000575 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000576 # Here ends the simple stuff. From here on, modules need certain
577 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000578 #
579
580 # Multimedia modules
581 # These don't work for 64-bit platforms!!!
582 # These represent audio samples or images as strings:
583
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000584 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000585 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000586 # 64-bit platforms.
587 exts.append( Extension('audioop', ['audioop.c']) )
588
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000589 # readline
Tarek Ziadé36797272010-07-22 12:50:05 +0000590 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000591 readline_termcap_library = ""
592 curses_library = ""
593 # Determine if readline is already linked against curses or tinfo.
594 if do_readline and find_executable('ldd'):
595 # Cannot use os.popen here in py3k.
596 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
597 if not os.path.exists(self.build_temp):
598 os.makedirs(self.build_temp)
Stefan Krahf4e7a352010-07-17 11:46:52 +0000599 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
600 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000601 with open(tmpfile) as fp:
602 for ln in fp:
603 if 'curses' in ln:
604 readline_termcap_library = re.sub(
605 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
606 ).rstrip()
607 break
608 # termcap interface split out from ncurses
609 if 'tinfo' in ln:
610 readline_termcap_library = 'tinfo'
611 break
Stefan Krah095b2732010-06-08 13:41:44 +0000612 os.unlink(tmpfile)
613 # Issue 7384: If readline is already linked against curses,
614 # use the same library for the readline and curses modules.
615 if 'curses' in readline_termcap_library:
616 curses_library = readline_termcap_library
Tarek Ziadé36797272010-07-22 12:50:05 +0000617 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000618 curses_library = 'ncursesw'
Tarek Ziadé36797272010-07-22 12:50:05 +0000619 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000620 curses_library = 'ncurses'
Tarek Ziadé36797272010-07-22 12:50:05 +0000621 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000622 curses_library = 'curses'
623
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200624 if host_platform == 'darwin':
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000625 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000626 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
627 if dep_target and dep_target.split('.') < ['10', '5']:
628 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000629 if os_release < 9:
630 # MacOSX 10.4 has a broken readline. Don't try to build
631 # the readline module unless the user has installed a fixed
632 # readline package
633 if find_file('readline/rlconf.h', inc_dirs, []) is None:
634 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000635 if do_readline:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200636 if host_platform == 'darwin' and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000637 # In every directory on the search path search for a dynamic
638 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000639 # for dynamic libraries on the entire path.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000640 # This way a staticly linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000641 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000642 readline_extra_link_args = ('-Wl,-search_paths_first',)
643 else:
644 readline_extra_link_args = ()
645
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000646 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000647 if readline_termcap_library:
648 pass # Issue 7384: Already linked against curses or tinfo.
649 elif curses_library:
650 readline_libs.append(curses_library)
Tarek Ziadé36797272010-07-22 12:50:05 +0000651 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000652 ['/usr/lib/termcap'],
653 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000654 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000655 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000656 library_dirs=['/usr/lib/termcap'],
Thomas Wouters477c8d52006-05-27 19:21:47 +0000657 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000658 libraries=readline_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000659 else:
660 missing.append('readline')
661
Ronald Oussoren94f25282010-05-05 19:11:21 +0000662 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000663
Tarek Ziadé36797272010-07-22 12:50:05 +0000664 if self.compiler.find_library_file(lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000665 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000666 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000667 libs = []
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000668 exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000669
Skip Montanaroba9e9782003-03-20 23:34:22 +0000670 # CSV files
671 exts.append( Extension('_csv', ['_csv.c']) )
672
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000673 # POSIX subprocess module helper.
674 exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
675
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000676 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000677 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000678 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000679 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000680 search_for_ssl_incs_in = [
681 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000682 '/usr/contrib/ssl/include/'
683 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000684 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
685 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000686 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000687 if ssl_incs is not None:
688 krb5_h = find_file('krb5.h', inc_dirs,
689 ['/usr/kerberos/include'])
690 if krb5_h:
691 ssl_incs += krb5_h
Tarek Ziadé36797272010-07-22 12:50:05 +0000692 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000693 ['/usr/local/ssl/lib',
694 '/usr/contrib/ssl/lib/'
695 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000696
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000697 if (ssl_incs is not None and
698 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000699 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000700 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000701 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000702 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000703 depends = ['socketmodule.h']), )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000704 else:
705 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000706
Gregory P. Smithade97332005-08-23 21:19:40 +0000707 # find out which version of OpenSSL we have
708 openssl_ver = 0
709 openssl_ver_re = re.compile(
710 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000711
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000712 # look for the openssl version header on the compiler search path.
713 opensslv_h = find_file('openssl/opensslv.h', [],
714 inc_dirs + search_for_ssl_incs_in)
715 if opensslv_h:
716 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200717 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000718 name = os.path.join(macosx_sdk_root(), name[1:])
719 try:
Brett Cannon9f5db072010-10-29 20:19:27 +0000720 with open(name, 'r') as incfile:
721 for line in incfile:
722 m = openssl_ver_re.match(line)
723 if m:
724 openssl_ver = eval(m.group(1))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000725 except IOError as msg:
726 print("IOError while reading opensshv.h:", msg)
727 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000728
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000729 #print('openssl_ver = 0x%08x' % openssl_ver)
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000730 min_openssl_ver = 0x00907000
731 have_any_openssl = ssl_incs is not None and ssl_libs is not None
732 have_usable_openssl = (have_any_openssl and
733 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000734
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000735 if have_any_openssl:
736 if have_usable_openssl:
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000737 # The _hashlib module wraps optimized implementations
738 # of hash functions from the OpenSSL library.
739 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
Gregory P. Smith5af7fba2010-01-03 14:51:13 +0000740 depends = ['hashlib.h'],
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000741 include_dirs = ssl_incs,
742 library_dirs = ssl_libs,
743 libraries = ['ssl', 'crypto']) )
744 else:
745 print("warning: openssl 0x%08x is too old for _hashlib" %
746 openssl_ver)
747 missing.append('_hashlib')
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000748
Antoine Pitrou019ff192012-05-16 16:41:26 +0200749 # We always compile these even when OpenSSL is available (issue #14693).
750 # It's harmless and the object code is tiny (40-50 KB per module,
751 # only loaded when actually used).
752 exts.append( Extension('_sha256', ['sha256module.c'],
753 depends=['hashlib.h']) )
754 exts.append( Extension('_sha512', ['sha512module.c'],
755 depends=['hashlib.h']) )
756 exts.append( Extension('_md5', ['md5module.c'],
757 depends=['hashlib.h']) )
758 exts.append( Extension('_sha1', ['sha1module.c'],
759 depends=['hashlib.h']) )
Gregory P. Smith2f21eb32007-09-09 06:44:34 +0000760
Georg Brandl489cb4f2009-07-11 10:08:49 +0000761 # Modules that provide persistent dictionary-like semantics. You will
762 # probably want to arrange for at least one of them to be available on
763 # your machine, though none are defined by default because of library
764 # dependencies. The Python module dbm/__init__.py provides an
765 # implementation independent wrapper for these; dbm/dumb.py provides
766 # similar functionality (but slower of course) implemented in Python.
767
768 # Sleepycat^WOracle Berkeley DB interface.
769 # http://www.oracle.com/database/berkeley-db/db/index.html
770 #
771 # This requires the Sleepycat^WOracle DB code. The supported versions
772 # are set below. Visit the URL above to download
773 # a release. Most open source OSes come with one or more
774 # versions of BerkeleyDB already installed.
775
Matthias Klose8690ae52010-10-17 13:22:33 +0000776 max_db_ver = (5, 1)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000777 min_db_ver = (3, 3)
778 db_setup_debug = False # verbose debug prints from this script?
779
780 def allow_db_ver(db_ver):
781 """Returns a boolean if the given BerkeleyDB version is acceptable.
782
783 Args:
784 db_ver: A tuple of the version to verify.
785 """
786 if not (min_db_ver <= db_ver <= max_db_ver):
787 return False
788 return True
789
790 def gen_db_minor_ver_nums(major):
791 if major == 4:
792 for x in range(max_db_ver[1]+1):
793 if allow_db_ver((4, x)):
794 yield x
795 elif major == 3:
796 for x in (3,):
797 if allow_db_ver((3, x)):
798 yield x
799 else:
800 raise ValueError("unknown major BerkeleyDB version", major)
801
802 # construct a list of paths to look for the header file in on
803 # top of the normal inc_dirs.
804 db_inc_paths = [
805 '/usr/include/db4',
806 '/usr/local/include/db4',
807 '/opt/sfw/include/db4',
808 '/usr/include/db3',
809 '/usr/local/include/db3',
810 '/opt/sfw/include/db3',
811 # Fink defaults (http://fink.sourceforge.net/)
812 '/sw/include/db4',
813 '/sw/include/db3',
814 ]
815 # 4.x minor number specific paths
816 for x in gen_db_minor_ver_nums(4):
817 db_inc_paths.append('/usr/include/db4%d' % x)
818 db_inc_paths.append('/usr/include/db4.%d' % x)
819 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
820 db_inc_paths.append('/usr/local/include/db4%d' % x)
821 db_inc_paths.append('/pkg/db-4.%d/include' % x)
822 db_inc_paths.append('/opt/db-4.%d/include' % x)
823 # MacPorts default (http://www.macports.org/)
824 db_inc_paths.append('/opt/local/include/db4%d' % x)
825 # 3.x minor number specific paths
826 for x in gen_db_minor_ver_nums(3):
827 db_inc_paths.append('/usr/include/db3%d' % x)
828 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
829 db_inc_paths.append('/usr/local/include/db3%d' % x)
830 db_inc_paths.append('/pkg/db-3.%d/include' % x)
831 db_inc_paths.append('/opt/db-3.%d/include' % x)
832
833 # Add some common subdirectories for Sleepycat DB to the list,
834 # based on the standard include directories. This way DB3/4 gets
835 # picked up when it is installed in a non-standard prefix and
836 # the user has added that prefix into inc_dirs.
837 std_variants = []
838 for dn in inc_dirs:
839 std_variants.append(os.path.join(dn, 'db3'))
840 std_variants.append(os.path.join(dn, 'db4'))
841 for x in gen_db_minor_ver_nums(4):
842 std_variants.append(os.path.join(dn, "db4%d"%x))
843 std_variants.append(os.path.join(dn, "db4.%d"%x))
844 for x in gen_db_minor_ver_nums(3):
845 std_variants.append(os.path.join(dn, "db3%d"%x))
846 std_variants.append(os.path.join(dn, "db3.%d"%x))
847
848 db_inc_paths = std_variants + db_inc_paths
849 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
850
851 db_ver_inc_map = {}
852
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200853 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000854 sysroot = macosx_sdk_root()
855
Georg Brandl489cb4f2009-07-11 10:08:49 +0000856 class db_found(Exception): pass
857 try:
858 # See whether there is a Sleepycat header in the standard
859 # search path.
860 for d in inc_dirs + db_inc_paths:
861 f = os.path.join(d, "db.h")
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200862 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000863 f = os.path.join(sysroot, d[1:], "db.h")
864
Georg Brandl489cb4f2009-07-11 10:08:49 +0000865 if db_setup_debug: print("db: looking for db.h in", f)
866 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +0000867 with open(f, 'rb') as file:
868 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +0000869 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000870 if m:
871 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +0000872 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000873 db_minor = int(m.group(1))
874 db_ver = (db_major, db_minor)
875
876 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
877 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +0000878 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000879 db_patch = int(m.group(1))
880 if db_patch < 21:
881 print("db.h:", db_ver, "patch", db_patch,
882 "being ignored (4.6.x must be >= 4.6.21)")
883 continue
884
885 if ( (db_ver not in db_ver_inc_map) and
886 allow_db_ver(db_ver) ):
887 # save the include directory with the db.h version
888 # (first occurrence only)
889 db_ver_inc_map[db_ver] = d
890 if db_setup_debug:
891 print("db.h: found", db_ver, "in", d)
892 else:
893 # we already found a header for this library version
894 if db_setup_debug: print("db.h: ignoring", d)
895 else:
896 # ignore this header, it didn't contain a version number
897 if db_setup_debug:
898 print("db.h: no version number version in", d)
899
900 db_found_vers = list(db_ver_inc_map.keys())
901 db_found_vers.sort()
902
903 while db_found_vers:
904 db_ver = db_found_vers.pop()
905 db_incdir = db_ver_inc_map[db_ver]
906
907 # check lib directories parallel to the location of the header
908 db_dirs_to_check = [
909 db_incdir.replace("include", 'lib64'),
910 db_incdir.replace("include", 'lib'),
911 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000912
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200913 if host_platform != 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000914 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
915
916 else:
917 # Same as other branch, but takes OSX SDK into account
918 tmp = []
919 for dn in db_dirs_to_check:
920 if is_macosx_sdk_path(dn):
921 if os.path.isdir(os.path.join(sysroot, dn[1:])):
922 tmp.append(dn)
923 else:
924 if os.path.isdir(dn):
925 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +0000926 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000927
928 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +0000929
Ezio Melotti42da6632011-03-15 05:18:48 +0200930 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +0000931 # XXX should we -ever- look for a dbX name? Do any
932 # systems really not name their library by version and
933 # symlink to more general names?
934 for dblib in (('db-%d.%d' % db_ver),
935 ('db%d%d' % db_ver),
936 ('db%d' % db_ver[0])):
937 dblib_file = self.compiler.find_library_file(
938 db_dirs_to_check + lib_dirs, dblib )
939 if dblib_file:
940 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
941 raise db_found
942 else:
943 if db_setup_debug: print("db lib: ", dblib, "not found")
944
945 except db_found:
946 if db_setup_debug:
947 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
948 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
949 db_incs = [db_incdir]
950 dblibs = [dblib]
951 else:
952 if db_setup_debug: print("db: no appropriate library found")
953 db_incs = None
954 dblibs = []
955 dblib_dir = None
956
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000957 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +0000958 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000959
960 # We hunt for #define SQLITE_VERSION "n.n.n"
961 # We need to find >= sqlite version 3.0.8
962 sqlite_incdir = sqlite_libdir = None
963 sqlite_inc_paths = [ '/usr/include',
964 '/usr/include/sqlite',
965 '/usr/include/sqlite3',
966 '/usr/local/include',
967 '/usr/local/include/sqlite',
968 '/usr/local/include/sqlite3',
969 ]
970 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
971 MIN_SQLITE_VERSION = ".".join([str(x)
972 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000973
974 # Scan the default include directories before the SQLite specific
975 # ones. This allows one to override the copy of sqlite on OSX,
976 # where /usr/include contains an old version of sqlite.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200977 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000978 sysroot = macosx_sdk_root()
979
Thomas Wouters477c8d52006-05-27 19:21:47 +0000980 for d in inc_dirs + sqlite_inc_paths:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000981 f = os.path.join(d, "sqlite3.h")
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000982
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200983 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000984 f = os.path.join(sysroot, d[1:], "sqlite3.h")
985
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000986 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +0000987 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +0000988 with open(f) as file:
989 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000990 m = re.search(
991 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
992 if m:
993 sqlite_version = m.group(1)
994 sqlite_version_tuple = tuple([int(x)
995 for x in sqlite_version.split(".")])
996 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
997 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +0000998 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +0000999 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001000 sqlite_incdir = d
1001 break
1002 else:
1003 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001004 print("%s: version %d is too old, need >= %s"%(d,
1005 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001006 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001007 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001008
1009 if sqlite_incdir:
1010 sqlite_dirs_to_check = [
1011 os.path.join(sqlite_incdir, '..', 'lib64'),
1012 os.path.join(sqlite_incdir, '..', 'lib'),
1013 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1014 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1015 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001016 sqlite_libfile = self.compiler.find_library_file(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001017 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001018 if sqlite_libfile:
1019 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001020
1021 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001022 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001023 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001024 '_sqlite/cursor.c',
1025 '_sqlite/microprotocols.c',
1026 '_sqlite/module.c',
1027 '_sqlite/prepare_protocol.c',
1028 '_sqlite/row.c',
1029 '_sqlite/statement.c',
1030 '_sqlite/util.c', ]
1031
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001032 sqlite_defines = []
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001033 if host_platform != "win32":
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001034 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1035 else:
1036 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1037
Benjamin Peterson076ed002010-10-31 17:11:02 +00001038 # Enable support for loadable extensions in the sqlite3 module
1039 # if --enable-loadable-sqlite-extensions configure option is used.
1040 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1041 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001042
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001043 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +00001044 # In every directory on the search path search for a dynamic
1045 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001046 # for dynamic libraries on the entire path.
1047 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001048 # before the dynamic library in /usr/lib.
1049 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1050 else:
1051 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001052
Brett Cannonc5011fe2011-06-06 20:09:10 -07001053 include_dirs = ["Modules/_sqlite"]
1054 # Only include the directory where sqlite was found if it does
1055 # not already exist in set include directories, otherwise you
1056 # can end up with a bad search path order.
1057 if sqlite_incdir not in self.compiler.include_dirs:
1058 include_dirs.append(sqlite_incdir)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001059 exts.append(Extension('_sqlite3', sqlite_srcs,
1060 define_macros=sqlite_defines,
Brett Cannonc5011fe2011-06-06 20:09:10 -07001061 include_dirs=include_dirs,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001062 library_dirs=sqlite_libdir,
1063 runtime_library_dirs=sqlite_libdir,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001064 extra_link_args=sqlite_extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001065 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001066 else:
1067 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001068
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001069 dbm_setup_debug = False # verbose debug prints from this script?
Benjamin Petersond78735d2010-01-01 16:04:23 +00001070 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001071 # The standard Unix dbm module:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001072 if host_platform not in ['cygwin']:
Matthias Klose55708cc2009-04-30 08:06:49 +00001073 config_args = [arg.strip("'")
1074 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersond78735d2010-01-01 16:04:23 +00001075 dbm_args = [arg for arg in config_args
Matthias Klose55708cc2009-04-30 08:06:49 +00001076 if arg.startswith('--with-dbmliborder=')]
1077 if dbm_args:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001078 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001079 else:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001080 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001081 dbmext = None
1082 for cand in dbm_order:
1083 if cand == "ndbm":
1084 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan50f147a2012-06-17 18:27:11 +10001085 # Some systems have -lndbm, others have -lgdbm_compat,
1086 # others don't have either
Tarek Ziadé36797272010-07-22 12:50:05 +00001087 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001088 'ndbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001089 ndbm_libs = ['ndbm']
Nick Coghlan50f147a2012-06-17 18:27:11 +10001090 elif self.compiler.find_library_file(lib_dirs,
1091 'gdbm_compat'):
1092 ndbm_libs = ['gdbm_compat']
Matthias Klose55708cc2009-04-30 08:06:49 +00001093 else:
1094 ndbm_libs = []
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001095 if dbm_setup_debug: print("building dbm using ndbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001096 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1097 define_macros=[
1098 ('HAVE_NDBM_H',None),
1099 ],
1100 libraries=ndbm_libs)
1101 break
1102
1103 elif cand == "gdbm":
Tarek Ziadé36797272010-07-22 12:50:05 +00001104 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001105 gdbm_libs = ['gdbm']
Tarek Ziadé36797272010-07-22 12:50:05 +00001106 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001107 'gdbm_compat'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001108 gdbm_libs.append('gdbm_compat')
1109 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001110 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001111 dbmext = Extension(
1112 '_dbm', ['_dbmmodule.c'],
1113 define_macros=[
1114 ('HAVE_GDBM_NDBM_H', None),
1115 ],
1116 libraries = gdbm_libs)
1117 break
1118 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001119 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001120 dbmext = Extension(
1121 '_dbm', ['_dbmmodule.c'],
1122 define_macros=[
1123 ('HAVE_GDBM_DASH_NDBM_H', None),
1124 ],
1125 libraries = gdbm_libs)
1126 break
Georg Brandl489cb4f2009-07-11 10:08:49 +00001127 elif cand == "bdb":
1128 if db_incs is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001129 if dbm_setup_debug: print("building dbm using bdb")
Georg Brandl489cb4f2009-07-11 10:08:49 +00001130 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1131 library_dirs=dblib_dir,
1132 runtime_library_dirs=dblib_dir,
1133 include_dirs=db_incs,
1134 define_macros=[
1135 ('HAVE_BERKDB_H', None),
1136 ('DB_DBM_HSEARCH', None),
1137 ],
1138 libraries=dblibs)
Matthias Klose55708cc2009-04-30 08:06:49 +00001139 break
1140 if dbmext is not None:
1141 exts.append(dbmext)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001142 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001143 missing.append('_dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001144
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001145 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001146 if ('gdbm' in dbm_order and
Tarek Ziadé36797272010-07-22 12:50:05 +00001147 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001148 exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001149 libraries = ['gdbm'] ) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001150 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001151 missing.append('_gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001152
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001153 # Unix-only modules
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001154 if host_platform != 'win32':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001155 # Steen Lumholt's termios module
1156 exts.append( Extension('termios', ['termios.c']) )
1157 # Jeremy Hylton's rlimit interface
Antoine Pitrou6103ab12009-10-24 20:11:21 +00001158 exts.append( Extension('resource', ['resource.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001159
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001160 # Sun yellow pages. Some systems have the functions in libc.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001161 if (host_platform not in ['cygwin', 'qnx6'] and
Benjamin Peterson588009e2009-12-30 03:03:54 +00001162 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé36797272010-07-22 12:50:05 +00001163 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001164 libs = ['nsl']
1165 else:
1166 libs = []
1167 exts.append( Extension('nis', ['nismodule.c'],
1168 libraries = libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001169 else:
1170 missing.append('nis')
1171 else:
1172 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001173
Skip Montanaro72092942004-02-07 12:50:19 +00001174 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001175 # provided by the ncurses library.
Victor Stinneraa35b002011-11-29 00:08:12 +01001176 curses_defines = []
Victor Stinner756c6ec2011-11-27 00:19:53 +01001177 curses_includes = []
Victor Stinneraa35b002011-11-29 00:08:12 +01001178 panel_library = 'panel'
1179 if curses_library == 'ncursesw':
1180 curses_defines.append(('HAVE_NCURSESW', '1'))
1181 curses_includes.append('/usr/include/ncursesw')
1182 # Bug 1464056: If _curses.so links with ncursesw,
1183 # _curses_panel.so must link with panelw.
1184 panel_library = 'panelw'
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001185 if host_platform == 'darwin':
Ned Deily69192232012-06-20 23:47:14 -07001186 # On OS X, there is no separate /usr/lib/libncursesw nor
1187 # libpanelw. If we are here, we found a locally-supplied
1188 # version of libncursesw. There should be also be a
1189 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1190 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1191 # ncurses wide char support
1192 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001193 elif host_platform == 'darwin' and curses_library == 'ncurses':
Ned Deily69192232012-06-20 23:47:14 -07001194 # Building with the system-suppied combined libncurses/libpanel
1195 curses_defines.append(('HAVE_NCURSESW', '1'))
1196 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Victor Stinneraa35b002011-11-29 00:08:12 +01001197
Stefan Krah095b2732010-06-08 13:41:44 +00001198 if curses_library.startswith('ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001199 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001200 exts.append( Extension('_curses', ['_cursesmodule.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001201 include_dirs=curses_includes,
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001202 define_macros=curses_defines,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001203 libraries = curses_libs) )
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001204 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001205 # OSX has an old Berkeley curses, not good enough for
1206 # the _curses module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001207 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001208 curses_libs = ['curses', 'terminfo']
Tarek Ziadé36797272010-07-22 12:50:05 +00001209 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001210 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001211 else:
1212 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001213
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001214 exts.append( Extension('_curses', ['_cursesmodule.c'],
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001215 define_macros=curses_defines,
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001216 libraries = curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001217 else:
1218 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001219
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001220 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001221 if (module_enabled(exts, '_curses') and
Tarek Ziadé36797272010-07-22 12:50:05 +00001222 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001223 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001224 include_dirs=curses_includes,
Ned Deily69192232012-06-20 23:47:14 -07001225 define_macros=curses_defines,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001226 libraries = [panel_library] + curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001227 else:
1228 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001229
Barry Warsaw259b1e12002-08-13 20:09:26 +00001230 # Andrew Kuchling's zlib module. Note that some versions of zlib
1231 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1232 # http://www.cert.org/advisories/CA-2002-07.html
1233 #
1234 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1235 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1236 # now, we still accept 1.1.3, because we think it's difficult to
1237 # exploit this in Python, and we'd rather make it RedHat's problem
1238 # than our problem <wink>.
1239 #
1240 # You can upgrade zlib to version 1.1.4 yourself by going to
1241 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001242 zlib_inc = find_file('zlib.h', [], inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001243 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001244 if zlib_inc is not None:
1245 zlib_h = zlib_inc[0] + '/zlib.h'
1246 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001247 version_req = '"1.1.3"'
Brett Cannon9f5db072010-10-29 20:19:27 +00001248 with open(zlib_h) as fp:
1249 while 1:
1250 line = fp.readline()
1251 if not line:
1252 break
1253 if line.startswith('#define ZLIB_VERSION'):
1254 version = line.split()[2]
1255 break
Guido van Rossume6970912001-04-15 15:16:12 +00001256 if version >= version_req:
Tarek Ziadé36797272010-07-22 12:50:05 +00001257 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001258 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001259 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1260 else:
1261 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001262 exts.append( Extension('zlib', ['zlibmodule.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001263 libraries = ['z'],
1264 extra_link_args = zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001265 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001266 else:
1267 missing.append('zlib')
1268 else:
1269 missing.append('zlib')
1270 else:
1271 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001272
Christian Heimes1dc54002008-03-24 02:19:29 +00001273 # Helper module for various ascii-encoders. Uses zlib for an optimized
1274 # crc32 if we have it. Otherwise binascii uses its own.
1275 if have_zlib:
1276 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1277 libraries = ['z']
1278 extra_link_args = zlib_extra_link_args
1279 else:
1280 extra_compile_args = []
1281 libraries = []
1282 extra_link_args = []
1283 exts.append( Extension('binascii', ['binascii.c'],
1284 extra_compile_args = extra_compile_args,
1285 libraries = libraries,
1286 extra_link_args = extra_link_args) )
1287
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001288 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001289 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001290 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001291 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1292 else:
1293 bz2_extra_link_args = ()
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001294 exts.append( Extension('_bz2', ['_bz2module.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001295 libraries = ['bz2'],
1296 extra_link_args = bz2_extra_link_args) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001297 else:
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001298 missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001299
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001300 # LZMA compression support.
1301 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1302 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1303 libraries = ['lzma']) )
1304 else:
1305 missing.append('_lzma')
1306
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001307 # Interface to the Expat XML parser
1308 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001309 # Expat was written by James Clark and is now maintained by a group of
1310 # developers on SourceForge; see www.libexpat.org for more information.
1311 # The pyexpat module was written by Paul Prescod after a prototype by
1312 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1313 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001314 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001315 #
1316 # More information on Expat can be found at www.libexpat.org.
1317 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001318 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1319 expat_inc = []
1320 define_macros = []
1321 expat_lib = ['expat']
1322 expat_sources = []
1323 else:
1324 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1325 define_macros = [
1326 ('HAVE_EXPAT_CONFIG_H', '1'),
1327 ]
1328 expat_lib = []
1329 expat_sources = ['expat/xmlparse.c',
1330 'expat/xmlrole.c',
1331 'expat/xmltok.c']
Thomas Wouters477c8d52006-05-27 19:21:47 +00001332
Fred Drake2d59a492003-10-21 15:41:15 +00001333 exts.append(Extension('pyexpat',
1334 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001335 include_dirs = expat_inc,
1336 libraries = expat_lib,
1337 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001338 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001339
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001340 # Fredrik Lundh's cElementTree module. Note that this also
1341 # uses expat (via the CAPI hook in pyexpat).
1342
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001343 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001344 define_macros.append(('USE_PYEXPAT_CAPI', None))
1345 exts.append(Extension('_elementtree',
1346 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001347 include_dirs = expat_inc,
1348 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001349 sources = ['_elementtree.c'],
1350 ))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001351 else:
1352 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001353
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001354 # Hye-Shik Chang's CJKCodecs modules.
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001355 exts.append(Extension('_multibytecodec',
1356 ['cjkcodecs/multibytecodec.c']))
1357 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1358 exts.append(Extension('_codecs_%s' % loc,
1359 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001360
Stefan Krah1919b7e2012-03-21 18:25:23 +01001361 # Stefan Krah's _decimal module
1362 exts.append(self._decimal_ext())
1363
Thomas Hellercf567c12006-03-08 19:51:58 +00001364 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001365 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001366
Benjamin Petersone711caf2008-06-11 16:44:04 +00001367 # Richard Oudkerk's multiprocessing module
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001368 if host_platform == 'win32': # Windows
Benjamin Petersone711caf2008-06-11 16:44:04 +00001369 macros = dict()
1370 libraries = ['ws2_32']
1371
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001372 elif host_platform == 'darwin': # Mac OSX
Benjamin Peterson965ce872009-04-05 21:24:58 +00001373 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001374 libraries = []
1375
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001376 elif host_platform == 'cygwin': # Cygwin
Benjamin Peterson965ce872009-04-05 21:24:58 +00001377 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001378 libraries = []
Benjamin Peterson41181742008-07-02 20:22:54 +00001379
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001380 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Benjamin Peterson41181742008-07-02 20:22:54 +00001381 # FreeBSD's P1003.1b semaphore support is very experimental
1382 # and has many known problems. (as of June 2008)
Benjamin Peterson965ce872009-04-05 21:24:58 +00001383 macros = dict()
Benjamin Peterson41181742008-07-02 20:22:54 +00001384 libraries = []
1385
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001386 elif host_platform.startswith('openbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001387 macros = dict()
Benjamin Petersone5384b02008-10-04 22:00:42 +00001388 libraries = []
1389
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001390 elif host_platform.startswith('netbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001391 macros = dict()
Jesse Noller32d68c22009-03-31 18:48:42 +00001392 libraries = []
1393
Benjamin Petersone711caf2008-06-11 16:44:04 +00001394 else: # Linux and other unices
Benjamin Peterson965ce872009-04-05 21:24:58 +00001395 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001396 libraries = ['rt']
1397
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001398 if host_platform == 'win32':
Benjamin Petersone711caf2008-06-11 16:44:04 +00001399 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1400 '_multiprocessing/semaphore.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001401 ]
1402
1403 else:
1404 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001405 ]
Mark Dickinsona614f042009-11-28 12:48:43 +00001406 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1407 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001408 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1409
Jesse Noller6fd47e22009-01-23 14:09:08 +00001410 if sysconfig.get_config_var('WITH_THREAD'):
1411 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1412 define_macros=list(macros.items()),
1413 include_dirs=["Modules/_multiprocessing"]))
1414 else:
1415 missing.append('_multiprocessing')
Benjamin Petersone711caf2008-06-11 16:44:04 +00001416 # End multiprocessing
Guido van Rossuma9e20242007-03-08 00:43:48 +00001417
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001418 # Platform-specific libraries
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001419 if host_platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001420 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001421 else:
1422 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001423
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001424 if host_platform == 'darwin':
Benjamin Petersonebacd262008-05-29 21:09:51 +00001425 exts.append(
1426 Extension('_gestalt', ['_gestalt.c'],
1427 extra_link_args=['-framework', 'Carbon'])
1428 )
Ronald Oussoren84151202010-04-18 20:46:11 +00001429 exts.append(
1430 Extension('_scproxy', ['_scproxy.c'],
1431 extra_link_args=[
1432 '-framework', 'SystemConfiguration',
1433 '-framework', 'CoreFoundation',
1434 ]))
Benjamin Petersonebacd262008-05-29 21:09:51 +00001435
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001436 self.extensions.extend(exts)
1437
1438 # Call the method for detecting whether _tkinter can be compiled
1439 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001440
Guido van Rossumd8faa362007-04-27 19:54:29 +00001441 if '_tkinter' not in [e.name for e in self.extensions]:
1442 missing.append('_tkinter')
1443
1444 return missing
1445
Jack Jansen0b06be72002-06-21 14:48:38 +00001446 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1447 # The _tkinter module, using frameworks. Since frameworks are quite
1448 # different the UNIX search logic is not sharable.
1449 from os.path import join, exists
1450 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001451 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001452 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001453 join(os.getenv('HOME'), '/Library/Frameworks')
1454 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001455
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001456 sysroot = macosx_sdk_root()
1457
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001458 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001459 # bundles.
1460 # XXX distutils should support -F!
1461 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001462 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001463
1464
Jack Jansen0b06be72002-06-21 14:48:38 +00001465 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001466 if is_macosx_sdk_path(F):
1467 if not exists(join(sysroot, F[1:], fw + '.framework')):
1468 break
1469 else:
1470 if not exists(join(F, fw + '.framework')):
1471 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001472 else:
1473 # ok, F is now directory with both frameworks. Continure
1474 # building
1475 break
1476 else:
1477 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1478 # will now resume.
1479 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001480
Jack Jansen0b06be72002-06-21 14:48:38 +00001481 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1482 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001483 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001484 #
1485 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001486 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001487 for fw in ('Tcl', 'Tk')
1488 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001489 ]
1490
Tim Peters2c60f7a2003-01-29 03:49:43 +00001491 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001492 # complicated search, this is a hard-coded path. It could bail out
1493 # if X11 libs are not found...
1494 include_dirs.append('/usr/X11R6/include')
1495 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1496
Georg Brandlfcaf9102008-07-16 02:17:56 +00001497 # All existing framework builds of Tcl/Tk don't support 64-bit
1498 # architectures.
1499 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1500 archs = re.findall('-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001501
Ronald Oussorend097efe2009-09-15 19:07:58 +00001502 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1503 if not os.path.exists(self.build_temp):
1504 os.makedirs(self.build_temp)
1505
1506 # Note: cannot use os.popen or subprocess here, that
1507 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001508 if is_macosx_sdk_path(F):
1509 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1510 else:
1511 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001512
Brett Cannon9f5db072010-10-29 20:19:27 +00001513 with open(tmpfile) as fp:
1514 detected_archs = []
1515 for ln in fp:
1516 a = ln.split()[-1]
1517 if a in archs:
1518 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001519 os.unlink(tmpfile)
1520
1521 for a in detected_archs:
1522 frameworks.append('-arch')
1523 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001524
Jack Jansen0b06be72002-06-21 14:48:38 +00001525 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1526 define_macros=[('WITH_APPINIT', 1)],
1527 include_dirs = include_dirs,
1528 libraries = [],
Georg Brandlfcaf9102008-07-16 02:17:56 +00001529 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001530 extra_link_args = frameworks,
1531 )
1532 self.extensions.append(ext)
1533 return 1
1534
Tim Peters2c60f7a2003-01-29 03:49:43 +00001535
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001536 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001537 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001538
Jack Jansen0b06be72002-06-21 14:48:38 +00001539 # Rather than complicate the code below, detecting and building
1540 # AquaTk is a separate method. Only one Tkinter will be built on
1541 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001542 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001543 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001544 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001545
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001546 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001547 # The versions with dots are used on Unix, and the versions without
1548 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001549 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001550 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1551 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé36797272010-07-22 12:50:05 +00001552 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001553 'tk' + version)
Tarek Ziadé36797272010-07-22 12:50:05 +00001554 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001555 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001556 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001557 # Exit the loop when we've found the Tcl/Tk libraries
1558 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001559
Fredrik Lundhade711a2001-01-24 08:00:28 +00001560 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001561 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001562 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001563 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001564 dotversion = version
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001565 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001566 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1567 # but the include subdirs are named like .../include/tcl8.3.
1568 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1569 tcl_include_sub = []
1570 tk_include_sub = []
1571 for dir in inc_dirs:
1572 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1573 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1574 tk_include_sub += tcl_include_sub
1575 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1576 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001577
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001578 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001579 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001580 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001581 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001582
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001583 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001584
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001585 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1586 for dir in tcl_includes + tk_includes:
1587 if dir not in include_dirs:
1588 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001589
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001590 # Check for various platform-specific directories
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001591 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001592 include_dirs.append('/usr/openwin/include')
1593 added_lib_dirs.append('/usr/openwin/lib')
1594 elif os.path.exists('/usr/X11R6/include'):
1595 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001596 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001597 added_lib_dirs.append('/usr/X11R6/lib')
1598 elif os.path.exists('/usr/X11R5/include'):
1599 include_dirs.append('/usr/X11R5/include')
1600 added_lib_dirs.append('/usr/X11R5/lib')
1601 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001602 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001603 include_dirs.append('/usr/X11/include')
1604 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001605
Jason Tishler9181c942003-02-05 15:16:17 +00001606 # If Cygwin, then verify that X is installed before proceeding
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001607 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001608 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1609 if x11_inc is None:
1610 return
1611
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001612 # Check for BLT extension
Tarek Ziadé36797272010-07-22 12:50:05 +00001613 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001614 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001615 defs.append( ('WITH_BLT', 1) )
1616 libs.append('BLT8.0')
Tarek Ziadé36797272010-07-22 12:50:05 +00001617 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001618 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001619 defs.append( ('WITH_BLT', 1) )
1620 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001621
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001622 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001623 libs.append('tk'+ version)
1624 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001625
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001626 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001627 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001628
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001629 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001630 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001631 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001632
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001633 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1634 define_macros=[('WITH_APPINIT', 1)] + defs,
1635 include_dirs = include_dirs,
1636 libraries = libs,
1637 library_dirs = added_lib_dirs,
1638 )
1639 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001640
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001641## # Uncomment these lines if you want to play with xxmodule.c
1642## ext = Extension('xx', ['xxmodule.c'])
1643## self.extensions.append(ext)
Antoine Pitrou8c30a712010-12-04 18:36:03 +00001644 if 'd' not in sys.abiflags:
1645 ext = Extension('xxlimited', ['xxlimited.c'],
1646 define_macros=[('Py_LIMITED_API', 1)])
1647 self.extensions.append(ext)
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001648
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001649 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001650 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001651 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001652 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001653 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001654 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001655 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001656
Christian Heimes78644762008-03-04 23:39:23 +00001657 def configure_ctypes_darwin(self, ext):
1658 # Darwin (OS X) uses preconfigured files, in
1659 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauer014bf282009-02-05 16:35:45 +00001660 srcdir = sysconfig.get_config_var('srcdir')
Christian Heimes78644762008-03-04 23:39:23 +00001661 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1662 '_ctypes', 'libffi_osx'))
1663 sources = [os.path.join(ffi_srcdir, p)
1664 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001665 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001666 'x86/x86-darwin.S',
1667 'x86/x86-ffi_darwin.c',
1668 'x86/x86-ffi64.c',
1669 'powerpc/ppc-darwin.S',
1670 'powerpc/ppc-darwin_closure.S',
1671 'powerpc/ppc-ffi_darwin.c',
1672 'powerpc/ppc64-darwin_closure.S',
1673 ]]
1674
1675 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001676 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001677
1678 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1679 os.path.join(ffi_srcdir, 'powerpc')]
1680 ext.include_dirs.extend(include_dirs)
1681 ext.sources.extend(sources)
1682 return True
1683
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001684 def configure_ctypes(self, ext):
1685 if not self.use_system_libffi:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001686 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001687 return self.configure_ctypes_darwin(ext)
1688
Neil Schemenauer014bf282009-02-05 16:35:45 +00001689 srcdir = sysconfig.get_config_var('srcdir')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001690 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1691 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1692 '_ctypes', 'libffi'))
1693 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001694
Thomas Wouters477c8d52006-05-27 19:21:47 +00001695 from distutils.dep_util import newer_group
1696
1697 config_sources = [os.path.join(ffi_srcdir, fname)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001698 for fname in os.listdir(ffi_srcdir)
1699 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001700 if self.force or newer_group(config_sources,
1701 ffi_configfile):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001702 from distutils.dir_util import mkpath
1703 mkpath(ffi_builddir)
1704 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001705
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001706 # Pass empty CFLAGS because we'll just append the resulting
1707 # CFLAGS to Python's; -g or -O2 is to be avoided.
1708 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1709 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001710
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001711 res = os.system(cmd)
1712 if res or not os.path.exists(ffi_configfile):
Guido van Rossum452bf512007-02-09 05:32:43 +00001713 print("Failed to configure _ctypes module")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001714 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001715
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001716 fficonfig = {}
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001717 with open(ffi_configfile) as f:
1718 exec(f.read(), globals(), fficonfig)
Thomas Hellercf567c12006-03-08 19:51:58 +00001719
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001720 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001721 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001722
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001723 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001724 ffi_builddir,
1725 os.path.join(ffi_srcdir, 'src')]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001726 extra_compile_args = fficonfig['ffi_cflags'].split()
1727
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001728 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1729 fficonfig['ffi_sources'])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001730 ext.include_dirs.extend(include_dirs)
1731 ext.extra_compile_args.extend(extra_compile_args)
1732 return True
1733
1734 def detect_ctypes(self, inc_dirs, lib_dirs):
1735 self.use_system_libffi = False
1736 include_dirs = []
1737 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001738 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001739 sources = ['_ctypes/_ctypes.c',
1740 '_ctypes/callbacks.c',
1741 '_ctypes/callproc.c',
1742 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001743 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001744 depends = ['_ctypes/ctypes.h']
1745
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001746 if host_platform == 'darwin':
Ronald Oussoren2decf222010-09-05 18:25:59 +00001747 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001748 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001749 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001750 include_dirs.append('_ctypes/darwin')
1751# XXX Is this still needed?
1752## extra_link_args.extend(['-read_only_relocs', 'warning'])
1753
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001754 elif host_platform == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001755 # XXX This shouldn't be necessary; it appears that some
1756 # of the assembler code is non-PIC (i.e. it has relocations
1757 # when it shouldn't. The proper fix would be to rewrite
1758 # the assembler code to be PIC.
1759 # This only works with GCC; the Sun compiler likely refuses
1760 # this option. If you want to compile ctypes with the Sun
1761 # compiler, please research a proper solution, instead of
1762 # finding some -z option for the Sun compiler.
1763 extra_link_args.append('-mimpure-text')
1764
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001765 elif host_platform.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001766 extra_link_args.append('-fPIC')
1767
Thomas Hellercf567c12006-03-08 19:51:58 +00001768 ext = Extension('_ctypes',
1769 include_dirs=include_dirs,
1770 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001771 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001772 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001773 sources=sources,
1774 depends=depends)
1775 ext_test = Extension('_ctypes_test',
1776 sources=['_ctypes/_ctypes_test.c'])
1777 self.extensions.extend([ext, ext_test])
1778
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001779 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1780 return
1781
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001782 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001783 # OS X 10.5 comes with libffi.dylib; the include files are
1784 # in /usr/include/ffi
1785 inc_dirs.append('/usr/include/ffi')
1786
Benjamin Petersond78735d2010-01-01 16:04:23 +00001787 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001788 if not ffi_inc or ffi_inc[0] == '':
Benjamin Petersond78735d2010-01-01 16:04:23 +00001789 ffi_inc = find_file('ffi.h', [], inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001790 if ffi_inc is not None:
1791 ffi_h = ffi_inc[0] + '/ffi.h'
Brett Cannon9f5db072010-10-29 20:19:27 +00001792 with open(ffi_h) as fp:
1793 while 1:
1794 line = fp.readline()
1795 if not line:
1796 ffi_inc = None
1797 break
1798 if line.startswith('#define LIBFFI_H'):
1799 break
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001800 ffi_lib = None
1801 if ffi_inc is not None:
1802 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé36797272010-07-22 12:50:05 +00001803 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001804 ffi_lib = lib_name
1805 break
1806
1807 if ffi_inc and ffi_lib:
1808 ext.include_dirs.extend(ffi_inc)
1809 ext.libraries.append(ffi_lib)
1810 self.use_system_libffi = True
1811
Stefan Krah1919b7e2012-03-21 18:25:23 +01001812 def _decimal_ext(self):
Stefan Krah60187b52012-03-23 19:06:27 +01001813 extra_compile_args = []
1814 undef_macros=['NDEBUG']
1815 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
1816 include_dirs = []
1817 libraries = ['mpdec']
1818 sources = ['_decimal/_decimal.c']
1819 depends = ['_decimal/docstrings.h']
1820 else:
Ned Deily458a6fb2012-04-01 02:30:46 -07001821 srcdir = sysconfig.get_config_var('srcdir')
1822 include_dirs = [os.path.abspath(os.path.join(srcdir,
1823 'Modules',
1824 '_decimal',
1825 'libmpdec'))]
Stefan Krah60187b52012-03-23 19:06:27 +01001826 libraries = []
1827 sources = [
1828 '_decimal/_decimal.c',
1829 '_decimal/libmpdec/basearith.c',
1830 '_decimal/libmpdec/constants.c',
1831 '_decimal/libmpdec/context.c',
1832 '_decimal/libmpdec/convolute.c',
1833 '_decimal/libmpdec/crt.c',
1834 '_decimal/libmpdec/difradix2.c',
1835 '_decimal/libmpdec/fnt.c',
1836 '_decimal/libmpdec/fourstep.c',
1837 '_decimal/libmpdec/io.c',
1838 '_decimal/libmpdec/memory.c',
1839 '_decimal/libmpdec/mpdecimal.c',
1840 '_decimal/libmpdec/numbertheory.c',
1841 '_decimal/libmpdec/sixstep.c',
1842 '_decimal/libmpdec/transpose.c',
1843 ]
1844 depends = [
1845 '_decimal/docstrings.h',
1846 '_decimal/libmpdec/basearith.h',
1847 '_decimal/libmpdec/bits.h',
1848 '_decimal/libmpdec/constants.h',
1849 '_decimal/libmpdec/convolute.h',
1850 '_decimal/libmpdec/crt.h',
1851 '_decimal/libmpdec/difradix2.h',
1852 '_decimal/libmpdec/fnt.h',
1853 '_decimal/libmpdec/fourstep.h',
1854 '_decimal/libmpdec/io.h',
1855 '_decimal/libmpdec/memory.h',
1856 '_decimal/libmpdec/mpdecimal.h',
1857 '_decimal/libmpdec/numbertheory.h',
1858 '_decimal/libmpdec/sixstep.h',
1859 '_decimal/libmpdec/transpose.h',
1860 '_decimal/libmpdec/typearith.h',
1861 '_decimal/libmpdec/umodarith.h',
1862 ]
1863
Stefan Krah1919b7e2012-03-21 18:25:23 +01001864 config = {
1865 'x64': [('CONFIG_64','1'), ('ASM','1')],
1866 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
1867 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
1868 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
1869 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
1870 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
1871 ('LEGACY_COMPILER','1')],
1872 'universal': [('UNIVERSAL','1')]
1873 }
1874
Stefan Krah1919b7e2012-03-21 18:25:23 +01001875 cc = sysconfig.get_config_var('CC')
1876 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
1877 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
1878
1879 if machine:
1880 # Override automatic configuration to facilitate testing.
1881 define_macros = config[machine]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001882 elif host_platform == 'darwin':
Stefan Krah1919b7e2012-03-21 18:25:23 +01001883 # Universal here means: build with the same options Python
1884 # was built with.
1885 define_macros = config['universal']
1886 elif sizeof_size_t == 8:
1887 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
1888 define_macros = config['x64']
1889 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
1890 define_macros = config['uint128']
1891 else:
1892 define_macros = config['ansi64']
1893 elif sizeof_size_t == 4:
1894 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
1895 if ppro and ('gcc' in cc or 'clang' in cc) and \
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001896 not 'sunos' in host_platform:
Stefan Krah1919b7e2012-03-21 18:25:23 +01001897 # solaris: problems with register allocation.
1898 # icc >= 11.0 works as well.
1899 define_macros = config['ppro']
1900 else:
1901 define_macros = config['ansi32']
1902 else:
1903 raise DistutilsError("_decimal: unsupported architecture")
1904
1905 # Workarounds for toolchain bugs:
1906 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
1907 # Some versions of gcc miscompile inline asm:
1908 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
1909 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
1910 extra_compile_args.append('-fno-ipa-pure-const')
1911 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
1912 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
1913 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
1914 undef_macros.append('_FORTIFY_SOURCE')
1915
1916 # Faster version without thread local contexts:
1917 if not sysconfig.get_config_var('WITH_THREAD'):
1918 define_macros.append(('WITHOUT_THREADS', 1))
1919
1920 # Uncomment for extra functionality:
1921 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
1922 ext = Extension (
1923 '_decimal',
1924 include_dirs=include_dirs,
Stefan Krah60187b52012-03-23 19:06:27 +01001925 libraries=libraries,
Stefan Krah1919b7e2012-03-21 18:25:23 +01001926 define_macros=define_macros,
1927 undef_macros=undef_macros,
1928 extra_compile_args=extra_compile_args,
1929 sources=sources,
1930 depends=depends
1931 )
1932 return ext
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001933
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001934class PyBuildInstall(install):
1935 # Suppress the warning about installation into the lib_dynload
1936 # directory, which is not in sys.path when running Python during
1937 # installation:
1938 def initialize_options (self):
1939 install.initialize_options(self)
1940 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001941
Éric Araujoe6792c12011-06-09 14:07:02 +02001942 # Customize subcommands to not install an egg-info file for Python
1943 sub_commands = [('install_lib', install.has_lib),
1944 ('install_headers', install.has_headers),
1945 ('install_scripts', install.has_scripts),
1946 ('install_data', install.has_data)]
1947
1948
Michael W. Hudson529a5052002-12-17 16:47:17 +00001949class PyBuildInstallLib(install_lib):
1950 # Do exactly what install_lib does but make sure correct access modes get
1951 # set on installed directories and files. All installed files with get
1952 # mode 644 unless they are a shared library in which case they will get
1953 # mode 755. All installed directories will get mode 755.
1954
1955 so_ext = sysconfig.get_config_var("SO")
1956
1957 def install(self):
1958 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001959 self.set_file_modes(outfiles, 0o644, 0o755)
1960 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00001961 return outfiles
1962
1963 def set_file_modes(self, files, defaultMode, sharedLibMode):
1964 if not self.is_chmod_supported(): return
1965 if not files: return
1966
1967 for filename in files:
1968 if os.path.islink(filename): continue
1969 mode = defaultMode
1970 if filename.endswith(self.so_ext): mode = sharedLibMode
1971 log.info("changing mode of %s to %o", filename, mode)
1972 if not self.dry_run: os.chmod(filename, mode)
1973
1974 def set_dir_modes(self, dirname, mode):
1975 if not self.is_chmod_supported(): return
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00001976 for dirpath, dirnames, fnames in os.walk(dirname):
1977 if os.path.islink(dirpath):
1978 continue
1979 log.info("changing mode of %s to %o", dirpath, mode)
1980 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00001981
1982 def is_chmod_supported(self):
1983 return hasattr(os, 'chmod')
1984
Georg Brandlff52f762010-12-28 09:51:43 +00001985class PyBuildScripts(build_scripts):
1986 def copy_scripts(self):
1987 outfiles, updated_files = build_scripts.copy_scripts(self)
1988 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
1989 minoronly = '.{0[1]}'.format(sys.version_info)
1990 newoutfiles = []
1991 newupdated_files = []
1992 for filename in outfiles:
Vinay Sajip7ded1f02012-05-26 03:45:29 +01001993 if filename.endswith(('2to3', 'pyvenv')):
Georg Brandlff52f762010-12-28 09:51:43 +00001994 newfilename = filename + fullversion
1995 else:
1996 newfilename = filename + minoronly
1997 log.info('renaming {} to {}'.format(filename, newfilename))
1998 os.rename(filename, newfilename)
1999 newoutfiles.append(newfilename)
2000 if filename in updated_files:
2001 newupdated_files.append(newfilename)
2002 return newoutfiles, newupdated_files
2003
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002004SUMMARY = """
2005Python is an interpreted, interactive, object-oriented programming
2006language. It is often compared to Tcl, Perl, Scheme or Java.
2007
2008Python combines remarkable power with very clear syntax. It has
2009modules, classes, exceptions, very high level dynamic data types, and
2010dynamic typing. There are interfaces to many system calls and
2011libraries, as well as to various windowing systems (X11, Motif, Tk,
2012Mac, MFC). New built-in modules are easily written in C or C++. Python
2013is also usable as an extension language for applications that need a
2014programmable interface.
2015
2016The Python implementation is portable: it runs on many brands of UNIX,
2017on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2018listed here, it may still be supported, if there's a C compiler for
2019it. Ask around on comp.lang.python -- or just try compiling Python
2020yourself.
2021"""
2022
2023CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002024Development Status :: 6 - Mature
2025License :: OSI Approved :: Python Software Foundation License
2026Natural Language :: English
2027Programming Language :: C
2028Programming Language :: Python
2029Topic :: Software Development
2030"""
2031
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002032def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002033 # turn off warnings when deprecated modules are imported
2034 import warnings
2035 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002036 setup(# PyPI Metadata (PEP 301)
2037 name = "Python",
2038 version = sys.version.split()[0],
2039 url = "http://www.python.org/%s" % sys.version[:3],
2040 maintainer = "Guido van Rossum and the Python community",
2041 maintainer_email = "python-dev@python.org",
2042 description = "A high-level object-oriented programming language",
2043 long_description = SUMMARY.strip(),
2044 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002045 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002046 platforms = ["Many"],
2047
2048 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002049 cmdclass = {'build_ext': PyBuildExt,
2050 'build_scripts': PyBuildScripts,
2051 'install': PyBuildInstall,
2052 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002053 # The struct module is defined here, because build_ext won't be
2054 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002055 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002056
Georg Brandlff52f762010-12-28 09:51:43 +00002057 # If you change the scripts installed here, you also need to
2058 # check the PyBuildScripts command above, and change the links
2059 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002060 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Éric Araujo859aad62012-06-24 00:07:41 -04002061 "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002062 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002063
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002064# --install-platlib
2065if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002066 main()