blob: 720f56844d4511708c79e239038753ab4d5c7220 [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 Cannonca5ff3a2013-06-15 17:52:59 -04004import sys, os, importlib.machinery, re, optparse
Christian Heimesaf98da12008-01-27 15:18:18 +00005from glob import glob
Eric Snow335e14d2014-01-04 15:09:28 -07006import importlib._bootstrap
7import importlib.util
Tarek Ziadéedacea32010-01-29 11:41:03 +00008import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +00009
10from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +000011from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000012from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000013from distutils.core import Extension, setup
14from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000015from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000016from distutils.command.install_lib import install_lib
Georg Brandlff52f762010-12-28 09:51:43 +000017from distutils.command.build_scripts import build_scripts
Stefan Krah095b2732010-06-08 13:41:44 +000018from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000019
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020020cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
21
Benjamin Petersonacb8c522014-08-09 20:01:49 -070022# Add special CFLAGS reserved for building the interpreter and the stdlib
23# modules (Issue #21121).
24cflags = sysconfig.get_config_var('CFLAGS')
25py_cflags_nodist = sysconfig.get_config_var('PY_CFLAGS_NODIST')
26sysconfig.get_config_vars()['CFLAGS'] = cflags + ' ' + py_cflags_nodist
27
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020028class Dummy:
29 """Hack for parallel build"""
30 ProcessPoolExecutor = None
31sys.modules['concurrent.futures.process'] = Dummy
32
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020033def get_platform():
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020034 # cross build
35 if "_PYTHON_HOST_PLATFORM" in os.environ:
36 return os.environ["_PYTHON_HOST_PLATFORM"]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020037 # Get value of sys.platform
38 if sys.platform.startswith('osf1'):
39 return 'osf1'
40 return sys.platform
41host_platform = get_platform()
42
Gregory P. Smithb04ded42010-01-03 00:38:10 +000043# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020044COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithb04ded42010-01-03 00:38:10 +000045
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000046# This global variable is used to hold the list of modules to be disabled.
47disabled_module_list = []
48
Michael W. Hudson39230b32002-01-16 15:26:48 +000049def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000050 """Add the directory 'dir' to the list 'dirlist' (after any relative
51 directories) if:
52
Michael W. Hudson39230b32002-01-16 15:26:48 +000053 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000054 2) 'dir' actually exists, and is a directory.
55 """
56 if dir is None or not os.path.isdir(dir) or dir in dirlist:
57 return
58 for i, path in enumerate(dirlist):
59 if not os.path.isabs(path):
60 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000061 return
62 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +000063
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000064def macosx_sdk_root():
65 """
66 Return the directory of the current OSX SDK,
67 or '/' if no SDK was specified.
68 """
69 cflags = sysconfig.get_config_var('CFLAGS')
70 m = re.search(r'-isysroot\s+(\S+)', cflags)
71 if m is None:
72 sysroot = '/'
73 else:
74 sysroot = m.group(1)
75 return sysroot
76
77def is_macosx_sdk_path(path):
78 """
79 Returns True if 'path' can be located in an OSX SDK
80 """
Ned Deily2910a7b2012-07-30 02:35:58 -070081 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
82 or path.startswith('/System/')
83 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000084
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000085def find_file(filename, std_dirs, paths):
86 """Searches for the directory where a given file is located,
87 and returns a possibly-empty list of additional directories, or None
88 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000089
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000090 'filename' is the name of a file, such as readline.h or libcrypto.a.
91 'std_dirs' is the list of standard system directories; if the
92 file is found in one of them, no additional directives are needed.
93 'paths' is a list of additional locations to check; if the file is
94 found in one of them, the resulting list will contain the directory.
95 """
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020096 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000097 # Honor the MacOSX SDK setting when one was specified.
98 # An SDK is a directory with the same structure as a real
99 # system, but with only header files and libraries.
100 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000101
102 # Check the standard locations
103 for dir in std_dirs:
104 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000105
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200106 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000107 f = os.path.join(sysroot, dir[1:], filename)
108
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000109 if os.path.exists(f): return []
110
111 # Check the additional directories
112 for dir in paths:
113 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000114
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200115 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000116 f = os.path.join(sysroot, dir[1:], filename)
117
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000118 if os.path.exists(f):
119 return [dir]
120
121 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000122 return None
123
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000124def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000125 result = compiler.find_library_file(std_dirs + paths, libname)
126 if result is None:
127 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000128
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200129 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000130 sysroot = macosx_sdk_root()
131
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000132 # Check whether the found file is in one of the standard directories
133 dirname = os.path.dirname(result)
134 for p in std_dirs:
135 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000136 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000137
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200138 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000139 if os.path.join(sysroot, p[1:]) == dirname:
140 return [ ]
141
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000142 if p == dirname:
143 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000144
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000145 # Otherwise, it must have been in one of the additional directories,
146 # so we have to figure out which one.
147 for p in paths:
148 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000149 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000150
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200151 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000152 if os.path.join(sysroot, p[1:]) == dirname:
153 return [ p ]
154
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000155 if p == dirname:
156 return [p]
157 else:
158 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000159
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000160def module_enabled(extlist, modname):
161 """Returns whether the module 'modname' is present in the list
162 of extensions 'extlist'."""
163 extlist = [ext for ext in extlist if ext.name == modname]
164 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000165
Jack Jansen144ebcc2001-08-05 22:31:19 +0000166def find_module_file(module, dirlist):
167 """Find a module in a set of possible folders. If it is not found
168 return the unadorned filename"""
169 list = find_file(module, [], dirlist)
170 if not list:
171 return module
172 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000173 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000174 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000175
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000176class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000177
Guido van Rossumd8faa362007-04-27 19:54:29 +0000178 def __init__(self, dist):
179 build_ext.__init__(self, dist)
180 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400181 self.failed_on_import = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200182 if '-j' in os.environ.get('MAKEFLAGS', ''):
183 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000184
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000185 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000186
187 # Detect which modules should be compiled
doko@ubuntu.comd5537d02013-03-21 13:21:49 -0700188 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000189
190 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000191 extensions = [ext for ext in self.extensions
192 if ext.name not in disabled_module_list]
193 # move ctypes to the end, it depends on other modules
194 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
195 if "_ctypes" in ext_map:
196 ctypes = extensions.pop(ext_map["_ctypes"])
197 extensions.append(ctypes)
198 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000199
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000200 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000201 # with Modules/.
202 srcdir = sysconfig.get_config_var('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000203 if not srcdir:
204 # Maybe running on Windows but not using CYGWIN?
205 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer4d491a52009-02-06 00:27:50 +0000206 srcdir = os.path.abspath(srcdir)
Neil Schemenauer014bf282009-02-05 16:35:45 +0000207 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000208
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000209 # Fix up the paths for scripts, too
210 self.distribution.scripts = [os.path.join(srcdir, filename)
211 for filename in self.distribution.scripts]
212
Christian Heimesaf98da12008-01-27 15:18:18 +0000213 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000214 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100215 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000216
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000217 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000218 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000219 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000220 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000221 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000222 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000223 else:
224 ext.depends = []
225 # re-compile extensions if a header file has been changed
226 ext.depends.extend(headers)
227
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000228 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000229 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000230 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000231 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000232
Ronald Oussoren94f25282010-05-05 19:11:21 +0000233 # Parse Modules/Setup and Modules/Setup.local to figure out which
234 # modules are turned on in the file.
235 remove_modules = []
236 for filename in ('Modules/Setup', 'Modules/Setup.local'):
237 input = text_file.TextFile(filename, join_lines=1)
238 while 1:
239 line = input.readline()
240 if not line: break
241 line = line.split()
242 remove_modules.append(line[0])
243 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000244
Ronald Oussoren94f25282010-05-05 19:11:21 +0000245 for ext in self.extensions[:]:
246 if ext.name in remove_modules:
247 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000248
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000249 # When you run "make CC=altcc" or something similar, you really want
250 # those environment variables passed into the setup.py phase. Here's
251 # a small set of useful ones.
252 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000253 args = {}
254 # unfortunately, distutils doesn't let us provide separate C and C++
255 # compilers
256 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000257 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
258 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000259 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000260
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000261 build_ext.build_extensions(self)
262
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200263 for ext in self.extensions:
264 self.check_extension_import(ext)
265
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300266 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400267 if self.failed or self.failed_on_import:
268 all_failed = self.failed + self.failed_on_import
269 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000270
271 def print_three_column(lst):
272 lst.sort(key=str.lower)
273 # guarantee zip() doesn't drop anything
274 while len(lst) % 3:
275 lst.append("")
276 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
277 print("%-*s %-*s %-*s" % (longest, e, longest, f,
278 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279
280 if missing:
281 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400282 print("Python build finished successfully!")
283 print("The necessary bits to build these optional modules were not "
284 "found:")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000285 print_three_column(missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000286 print("To find the necessary bits, look in setup.py in"
287 " detect_modules() for the module's name.")
288 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000289
290 if self.failed:
291 failed = self.failed[:]
292 print()
293 print("Failed to build these modules:")
294 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000295 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000296
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400297 if self.failed_on_import:
298 failed = self.failed_on_import[:]
299 print()
300 print("Following modules built successfully"
301 " but were removed because they could not be imported:")
302 print_three_column(failed)
303 print()
304
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000305 def build_extension(self, ext):
306
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000307 if ext.name == '_ctypes':
308 if not self.configure_ctypes(ext):
309 return
310
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000311 try:
312 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000313 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000314 self.announce('WARNING: building of extension "%s" failed: %s' %
315 (ext.name, sys.exc_info()[1]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000316 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000317 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200318
319 def check_extension_import(self, ext):
320 # Don't try to import an extension that has failed to compile
321 if ext.name in self.failed:
322 self.announce(
323 'WARNING: skipping import check for failed build "%s"' %
324 ext.name, level=1)
325 return
326
Jack Jansenf49c6f92001-11-01 14:44:15 +0000327 # Workaround for Mac OS X: The Carbon-based modules cannot be
328 # reliably imported into a command-line Python
329 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000330 self.announce(
331 'WARNING: skipping import check for Carbon-based "%s"' %
332 ext.name)
333 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000334
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200335 if host_platform == 'darwin' and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000336 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000337 # Don't bother doing an import check when an extension was
338 # build with an explicit '-arch' flag on OSX. That's currently
339 # only used to build 32-bit only extensions in a 4-way
340 # universal build and loading 32-bit code into a 64-bit
341 # process will fail.
342 self.announce(
343 'WARNING: skipping import check for "%s"' %
344 ext.name)
345 return
346
Jason Tishler24cf7762002-05-22 16:46:15 +0000347 # Workaround for Cygwin: Cygwin currently has fork issues when many
348 # modules have been imported
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200349 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000350 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
351 % ext.name)
352 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000353 ext_filename = os.path.join(
354 self.build_lib,
355 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000356
357 # If the build directory didn't exist when setup.py was
358 # started, sys.path_importer_cache has a negative result
359 # cached. Clear that cache before trying to import.
360 sys.path_importer_cache.clear()
361
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200362 # Don't try to load extensions for cross builds
363 if cross_compiling:
364 return
365
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400366 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700367 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
368 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000369 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400370 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000371 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400372 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000373 self.announce('*** WARNING: renaming "%s" since importing it'
374 ' failed: %s' % (ext.name, why), level=3)
375 assert not self.inplace
376 basename, tail = os.path.splitext(ext_filename)
377 newname = basename + "_failed" + tail
378 if os.path.exists(newname):
379 os.remove(newname)
380 os.rename(ext_filename, newname)
381
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000382 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000383 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000384 self.announce('*** WARNING: importing extension "%s" '
385 'failed with %s: %s' % (ext.name, exc_type, why),
386 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000387 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000388
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400389 def add_multiarch_paths(self):
390 # Debian/Ubuntu multiarch support.
391 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200392 cc = sysconfig.get_config_var('CC')
393 tmpfile = os.path.join(self.build_temp, 'multiarch')
394 if not os.path.exists(self.build_temp):
395 os.makedirs(self.build_temp)
396 ret = os.system(
397 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
398 multiarch_path_component = ''
399 try:
400 if ret >> 8 == 0:
401 with open(tmpfile) as fp:
402 multiarch_path_component = fp.readline().strip()
403 finally:
404 os.unlink(tmpfile)
405
406 if multiarch_path_component != '':
407 add_dir_to_list(self.compiler.library_dirs,
408 '/usr/lib/' + multiarch_path_component)
409 add_dir_to_list(self.compiler.include_dirs,
410 '/usr/include/' + multiarch_path_component)
411 return
412
Barry Warsaw88e19452011-04-07 10:40:36 -0400413 if not find_executable('dpkg-architecture'):
414 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200415 opt = ''
416 if cross_compiling:
417 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400418 tmpfile = os.path.join(self.build_temp, 'multiarch')
419 if not os.path.exists(self.build_temp):
420 os.makedirs(self.build_temp)
421 ret = os.system(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200422 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
423 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400424 try:
425 if ret >> 8 == 0:
426 with open(tmpfile) as fp:
427 multiarch_path_component = fp.readline().strip()
428 add_dir_to_list(self.compiler.library_dirs,
429 '/usr/lib/' + multiarch_path_component)
430 add_dir_to_list(self.compiler.include_dirs,
431 '/usr/include/' + multiarch_path_component)
432 finally:
433 os.unlink(tmpfile)
434
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200435 def add_gcc_paths(self):
436 gcc = sysconfig.get_config_var('CC')
437 tmpfile = os.path.join(self.build_temp, 'gccpaths')
438 if not os.path.exists(self.build_temp):
439 os.makedirs(self.build_temp)
440 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
441 is_gcc = False
442 in_incdirs = False
443 inc_dirs = []
444 lib_dirs = []
445 try:
446 if ret >> 8 == 0:
447 with open(tmpfile) as fp:
448 for line in fp.readlines():
449 if line.startswith("gcc version"):
450 is_gcc = True
451 elif line.startswith("#include <...>"):
452 in_incdirs = True
453 elif line.startswith("End of search list"):
454 in_incdirs = False
455 elif is_gcc and line.startswith("LIBRARY_PATH"):
456 for d in line.strip().split("=")[1].split(":"):
457 d = os.path.normpath(d)
458 if '/gcc/' not in d:
459 add_dir_to_list(self.compiler.library_dirs,
460 d)
461 elif is_gcc and in_incdirs and '/gcc/' not in line:
462 add_dir_to_list(self.compiler.include_dirs,
463 line.strip())
464 finally:
465 os.unlink(tmpfile)
466
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000467 def detect_modules(self):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000468 # Ensure that /usr/local is always used, but the local build
469 # directories (i.e. '.' and 'Include') must be first. See issue
470 # 10520.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200471 if not cross_compiling:
472 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
473 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200474 # only change this for cross builds for 3.3, issues on Mageia
475 if cross_compiling:
476 self.add_gcc_paths()
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400477 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000478
Brett Cannon516592f2004-12-07 00:42:59 +0000479 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000480 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000481 # We must get the values from the Makefile and not the environment
482 # directly since an inconsistently reproducible issue comes up where
483 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000484 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000485 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000486 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
487 ('LDFLAGS', '-L', self.compiler.library_dirs),
488 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000489 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000490 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000491 # To prevent optparse from raising an exception about any
Skip Montanaroa5c2a512008-10-07 02:51:48 +0000492 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000493 # all double dashes and any dashes followed by a character
494 # that is not for the option we are dealing with.
495 #
496 # Please note that order of the regex is important! We must
497 # strip out double-dashes first so that we don't end up with
498 # substituting "--Long" to "-Long" and thus lead to "ong" being
499 # used for a library directory.
Guido van Rossum04110fb2007-08-24 16:32:05 +0000500 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
501 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000502 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000503 # Make sure that allowing args interspersed with options is
504 # allowed
505 parser.allow_interspersed_args = True
506 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000507 parser.add_option(arg_name, dest="dirs", action="append")
508 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000509 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000510 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000511 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000512
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100513 if os.path.normpath(sys.base_prefix) != '/usr' \
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000514 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
515 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
516 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
517 # building a framework with different architectures than
518 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000519 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000520 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000521 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000522 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000523
524 # lib_dirs and inc_dirs are used to search for files;
525 # if a file is found in one of those directories, it can
526 # be assumed that no additional -I,-L directives are needed.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200527 if not cross_compiling:
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200528 lib_dirs = self.compiler.library_dirs + [
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200529 '/lib64', '/usr/lib64',
530 '/lib', '/usr/lib',
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200531 ]
532 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Christian Heimesf19529c2012-12-12 12:41:00 +0100533 else:
Christian Heimesd7832612012-12-12 12:56:51 +0100534 lib_dirs = self.compiler.library_dirs[:]
535 inc_dirs = self.compiler.include_dirs[:]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000536 exts = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000537 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000538
Brett Cannon4454a1f2005-04-15 20:32:39 +0000539 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000540 with open(config_h) as file:
541 config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000542
Neil Schemenauer014bf282009-02-05 16:35:45 +0000543 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000544
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000545 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200546 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000547 lib_dirs += ['/usr/ccs/lib']
548
Charles-François Natali5739e102012-04-12 19:07:25 +0200549 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200550 if host_platform == 'hp-ux11':
Charles-François Natali5739e102012-04-12 19:07:25 +0200551 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
552
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200553 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +0000554 # This should work on any unixy platform ;-)
555 # If the user has bothered specifying additional -I and -L flags
556 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000557 #
558 # NOTE: using shlex.split would technically be more correct, but
559 # also gives a bootstrap problem. Let's hope nobody uses
560 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000561 cflags, ldflags = sysconfig.get_config_vars(
562 'CFLAGS', 'LDFLAGS')
563 for item in cflags.split():
564 if item.startswith('-I'):
565 inc_dirs.append(item[2:])
566
567 for item in ldflags.split():
568 if item.startswith('-L'):
569 lib_dirs.append(item[2:])
570
Fredrik Lundhade711a2001-01-24 08:00:28 +0000571 # Check for MacOS X, which doesn't need libm.a at all
572 math_libs = ['m']
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200573 if host_platform == 'darwin':
Fredrik Lundhade711a2001-01-24 08:00:28 +0000574 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000575
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000576 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
577
578 #
579 # The following modules are all pretty straightforward, and compile
580 # on pretty much any POSIXish platform.
581 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000582
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000583 # array objects
584 exts.append( Extension('array', ['arraymodule.c']) )
Martin Panterc9deece2016-02-03 05:19:44 +0000585
586 shared_math = 'Modules/_math.o'
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000587 # complex math library functions
Martin Panterc9deece2016-02-03 05:19:44 +0000588 exts.append( Extension('cmath', ['cmathmodule.c'],
589 extra_objects=[shared_math],
590 depends=['_math.h', shared_math],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000591 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000592 # math library functions, e.g. sin()
Martin Panterc9deece2016-02-03 05:19:44 +0000593 exts.append( Extension('math', ['mathmodule.c'],
594 extra_objects=[shared_math],
595 depends=['_math.h', shared_math],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000596 libraries=math_libs) )
Victor Stinnere0be4232011-10-25 13:06:09 +0200597
598 # time libraries: librt may be needed for clock_gettime()
599 time_libs = []
600 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
601 if lib:
602 time_libs.append(lib)
603
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000604 # time operations and variables
Victor Stinner5d272cc2012-03-13 13:35:55 +0100605 exts.append( Extension('time', ['timemodule.c'],
Victor Stinnere0be4232011-10-25 13:06:09 +0200606 libraries=time_libs) )
Victor Stinner5d272cc2012-03-13 13:35:55 +0100607 exts.append( Extension('_datetime', ['_datetimemodule.c']) )
Christian Heimesfe337bf2008-03-23 21:54:12 +0000608 # random number generator implemented in C
609 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000610 # bisect
611 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000612 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000613 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000614 # C-optimized pickle replacement
615 exts.append( Extension("_pickle", ["_pickle.c"]) )
Collin Winter670e6922007-03-21 02:57:17 +0000616 # atexit
617 exts.append( Extension("atexit", ["atexitmodule.c"]) )
Christian Heimes90540002008-05-08 14:29:10 +0000618 # _json speedups
619 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000620 # Python C API test module
Mark Dickinsona06f44b2009-02-10 16:18:22 +0000621 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
622 depends=['testcapi_long.h']) )
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100623 # Python PEP-3118 (buffer protocol) test module
624 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200625 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
626 exts.append( Extension('_testimportmultiple', ['_testimportmultiple.c']) )
Nick Coghland5cacbb2015-05-23 22:24:10 +1000627 # Test multi-phase extension module init (PEP 489)
628 exts.append( Extension('_testmultiphase', ['_testmultiphase.c']) )
Fred Drake0e474a82007-10-11 18:01:43 +0000629 # profiler (_lsprof is for cProfile.py)
Armin Rigoa871ef22006-02-08 12:53:56 +0000630 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000631 # static Unicode character database
Walter Dörwalde9eaab42007-05-22 16:02:13 +0000632 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Larry Hastings3a907972013-11-23 14:49:22 -0800633 # _opcode module
634 exts.append( Extension('_opcode', ['_opcode.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000635
636 # Modules with some UNIX dependencies -- on by default:
637 # (If you have a really backward UNIX, select and socket may not be
638 # supported...)
639
640 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000641 libs = []
642 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
643 # May be necessary on AIX for flock function
644 libs = ['bsd']
645 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren94f25282010-05-05 19:11:21 +0000646 # pwd(3)
647 exts.append( Extension('pwd', ['pwdmodule.c']) )
648 # grp(3)
649 exts.append( Extension('grp', ['grpmodule.c']) )
650 # spwd, shadow passwords
651 if (config_h_vars.get('HAVE_GETSPNAM', False) or
652 config_h_vars.get('HAVE_GETSPENT', False)):
653 exts.append( Extension('spwd', ['spwdmodule.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000654 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000655 missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000656
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000657 # select(2); not on ancient System V
658 exts.append( Extension('select', ['selectmodule.c']) )
659
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000660 # Fred Drake's interface to the Python parser
661 exts.append( Extension('parser', ['parsermodule.c']) )
662
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000663 # Memory-mapped files (also works on Win32).
Ronald Oussoren94f25282010-05-05 19:11:21 +0000664 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000665
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000666 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000667 # syslog daemon interface
668 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000669
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000670 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000671 # Here ends the simple stuff. From here on, modules need certain
672 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000673 #
674
675 # Multimedia modules
676 # These don't work for 64-bit platforms!!!
677 # These represent audio samples or images as strings:
678
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000679 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000680 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000681 # 64-bit platforms.
682 exts.append( Extension('audioop', ['audioop.c']) )
683
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000684 # readline
Tarek Ziadé36797272010-07-22 12:50:05 +0000685 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000686 readline_termcap_library = ""
687 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200688 # Cannot use os.popen here in py3k.
689 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
690 if not os.path.exists(self.build_temp):
691 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000692 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200693 if do_readline:
694 if cross_compiling:
695 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
696 % (sysconfig.get_config_var('READELF'),
697 do_readline, tmpfile))
698 elif find_executable('ldd'):
699 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
700 else:
701 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200702 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000703 with open(tmpfile) as fp:
704 for ln in fp:
705 if 'curses' in ln:
706 readline_termcap_library = re.sub(
707 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
708 ).rstrip()
709 break
710 # termcap interface split out from ncurses
711 if 'tinfo' in ln:
712 readline_termcap_library = 'tinfo'
713 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200714 if os.path.exists(tmpfile):
715 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000716 # Issue 7384: If readline is already linked against curses,
717 # use the same library for the readline and curses modules.
718 if 'curses' in readline_termcap_library:
719 curses_library = readline_termcap_library
Tarek Ziadé36797272010-07-22 12:50:05 +0000720 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000721 curses_library = 'ncursesw'
Tarek Ziadé36797272010-07-22 12:50:05 +0000722 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000723 curses_library = 'ncurses'
Tarek Ziadé36797272010-07-22 12:50:05 +0000724 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000725 curses_library = 'curses'
726
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200727 if host_platform == 'darwin':
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000728 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000729 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -0700730 if (dep_target and
731 (tuple(int(n) for n in dep_target.split('.')[0:2])
732 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +0000733 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000734 if os_release < 9:
735 # MacOSX 10.4 has a broken readline. Don't try to build
736 # the readline module unless the user has installed a fixed
737 # readline package
738 if find_file('readline/rlconf.h', inc_dirs, []) is None:
739 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000740 if do_readline:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200741 if host_platform == 'darwin' and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000742 # In every directory on the search path search for a dynamic
743 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000744 # for dynamic libraries on the entire path.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000745 # This way a staticly linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000746 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000747 readline_extra_link_args = ('-Wl,-search_paths_first',)
748 else:
749 readline_extra_link_args = ()
750
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000751 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000752 if readline_termcap_library:
753 pass # Issue 7384: Already linked against curses or tinfo.
754 elif curses_library:
755 readline_libs.append(curses_library)
Tarek Ziadé36797272010-07-22 12:50:05 +0000756 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000757 ['/usr/lib/termcap'],
758 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000759 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000760 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000761 library_dirs=['/usr/lib/termcap'],
Thomas Wouters477c8d52006-05-27 19:21:47 +0000762 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000763 libraries=readline_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000764 else:
765 missing.append('readline')
766
Ronald Oussoren94f25282010-05-05 19:11:21 +0000767 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000768
Tarek Ziadé36797272010-07-22 12:50:05 +0000769 if self.compiler.find_library_file(lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000770 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000771 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000772 libs = []
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000773 exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000774
Skip Montanaroba9e9782003-03-20 23:34:22 +0000775 # CSV files
776 exts.append( Extension('_csv', ['_csv.c']) )
777
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000778 # POSIX subprocess module helper.
779 exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
780
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000781 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000782 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000783 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000784 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000785 search_for_ssl_incs_in = [
786 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000787 '/usr/contrib/ssl/include/'
788 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000789 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
790 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000791 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000792 if ssl_incs is not None:
793 krb5_h = find_file('krb5.h', inc_dirs,
794 ['/usr/kerberos/include'])
795 if krb5_h:
796 ssl_incs += krb5_h
Tarek Ziadé36797272010-07-22 12:50:05 +0000797 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000798 ['/usr/local/ssl/lib',
799 '/usr/contrib/ssl/lib/'
800 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000801
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000802 if (ssl_incs is not None and
803 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000804 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000805 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000806 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000807 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000808 depends = ['socketmodule.h']), )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000809 else:
810 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000811
Gregory P. Smithade97332005-08-23 21:19:40 +0000812 # find out which version of OpenSSL we have
813 openssl_ver = 0
814 openssl_ver_re = re.compile(
815 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000816
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000817 # look for the openssl version header on the compiler search path.
818 opensslv_h = find_file('openssl/opensslv.h', [],
819 inc_dirs + search_for_ssl_incs_in)
820 if opensslv_h:
821 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200822 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000823 name = os.path.join(macosx_sdk_root(), name[1:])
824 try:
Brett Cannon9f5db072010-10-29 20:19:27 +0000825 with open(name, 'r') as incfile:
826 for line in incfile:
827 m = openssl_ver_re.match(line)
828 if m:
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100829 openssl_ver = int(m.group(1), 16)
830 break
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000831 except IOError as msg:
832 print("IOError while reading opensshv.h:", msg)
Gregory P. Smithade97332005-08-23 21:19:40 +0000833
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000834 #print('openssl_ver = 0x%08x' % openssl_ver)
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000835 min_openssl_ver = 0x00907000
836 have_any_openssl = ssl_incs is not None and ssl_libs is not None
837 have_usable_openssl = (have_any_openssl and
838 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000839
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000840 if have_any_openssl:
841 if have_usable_openssl:
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000842 # The _hashlib module wraps optimized implementations
843 # of hash functions from the OpenSSL library.
844 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
Gregory P. Smith5af7fba2010-01-03 14:51:13 +0000845 depends = ['hashlib.h'],
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000846 include_dirs = ssl_incs,
847 library_dirs = ssl_libs,
848 libraries = ['ssl', 'crypto']) )
849 else:
850 print("warning: openssl 0x%08x is too old for _hashlib" %
851 openssl_ver)
852 missing.append('_hashlib')
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000853
Antoine Pitrou019ff192012-05-16 16:41:26 +0200854 # We always compile these even when OpenSSL is available (issue #14693).
855 # It's harmless and the object code is tiny (40-50 KB per module,
856 # only loaded when actually used).
857 exts.append( Extension('_sha256', ['sha256module.c'],
858 depends=['hashlib.h']) )
859 exts.append( Extension('_sha512', ['sha512module.c'],
860 depends=['hashlib.h']) )
861 exts.append( Extension('_md5', ['md5module.c'],
862 depends=['hashlib.h']) )
863 exts.append( Extension('_sha1', ['sha1module.c'],
864 depends=['hashlib.h']) )
Gregory P. Smith2f21eb32007-09-09 06:44:34 +0000865
Georg Brandl489cb4f2009-07-11 10:08:49 +0000866 # Modules that provide persistent dictionary-like semantics. You will
867 # probably want to arrange for at least one of them to be available on
868 # your machine, though none are defined by default because of library
869 # dependencies. The Python module dbm/__init__.py provides an
870 # implementation independent wrapper for these; dbm/dumb.py provides
871 # similar functionality (but slower of course) implemented in Python.
872
873 # Sleepycat^WOracle Berkeley DB interface.
874 # http://www.oracle.com/database/berkeley-db/db/index.html
875 #
876 # This requires the Sleepycat^WOracle DB code. The supported versions
877 # are set below. Visit the URL above to download
878 # a release. Most open source OSes come with one or more
879 # versions of BerkeleyDB already installed.
880
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +0200881 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000882 min_db_ver = (3, 3)
883 db_setup_debug = False # verbose debug prints from this script?
884
885 def allow_db_ver(db_ver):
886 """Returns a boolean if the given BerkeleyDB version is acceptable.
887
888 Args:
889 db_ver: A tuple of the version to verify.
890 """
891 if not (min_db_ver <= db_ver <= max_db_ver):
892 return False
893 return True
894
895 def gen_db_minor_ver_nums(major):
896 if major == 4:
897 for x in range(max_db_ver[1]+1):
898 if allow_db_ver((4, x)):
899 yield x
900 elif major == 3:
901 for x in (3,):
902 if allow_db_ver((3, x)):
903 yield x
904 else:
905 raise ValueError("unknown major BerkeleyDB version", major)
906
907 # construct a list of paths to look for the header file in on
908 # top of the normal inc_dirs.
909 db_inc_paths = [
910 '/usr/include/db4',
911 '/usr/local/include/db4',
912 '/opt/sfw/include/db4',
913 '/usr/include/db3',
914 '/usr/local/include/db3',
915 '/opt/sfw/include/db3',
916 # Fink defaults (http://fink.sourceforge.net/)
917 '/sw/include/db4',
918 '/sw/include/db3',
919 ]
920 # 4.x minor number specific paths
921 for x in gen_db_minor_ver_nums(4):
922 db_inc_paths.append('/usr/include/db4%d' % x)
923 db_inc_paths.append('/usr/include/db4.%d' % x)
924 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
925 db_inc_paths.append('/usr/local/include/db4%d' % x)
926 db_inc_paths.append('/pkg/db-4.%d/include' % x)
927 db_inc_paths.append('/opt/db-4.%d/include' % x)
928 # MacPorts default (http://www.macports.org/)
929 db_inc_paths.append('/opt/local/include/db4%d' % x)
930 # 3.x minor number specific paths
931 for x in gen_db_minor_ver_nums(3):
932 db_inc_paths.append('/usr/include/db3%d' % x)
933 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
934 db_inc_paths.append('/usr/local/include/db3%d' % x)
935 db_inc_paths.append('/pkg/db-3.%d/include' % x)
936 db_inc_paths.append('/opt/db-3.%d/include' % x)
937
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200938 if cross_compiling:
939 db_inc_paths = []
940
Georg Brandl489cb4f2009-07-11 10:08:49 +0000941 # Add some common subdirectories for Sleepycat DB to the list,
942 # based on the standard include directories. This way DB3/4 gets
943 # picked up when it is installed in a non-standard prefix and
944 # the user has added that prefix into inc_dirs.
945 std_variants = []
946 for dn in inc_dirs:
947 std_variants.append(os.path.join(dn, 'db3'))
948 std_variants.append(os.path.join(dn, 'db4'))
949 for x in gen_db_minor_ver_nums(4):
950 std_variants.append(os.path.join(dn, "db4%d"%x))
951 std_variants.append(os.path.join(dn, "db4.%d"%x))
952 for x in gen_db_minor_ver_nums(3):
953 std_variants.append(os.path.join(dn, "db3%d"%x))
954 std_variants.append(os.path.join(dn, "db3.%d"%x))
955
956 db_inc_paths = std_variants + db_inc_paths
957 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
958
959 db_ver_inc_map = {}
960
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200961 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000962 sysroot = macosx_sdk_root()
963
Georg Brandl489cb4f2009-07-11 10:08:49 +0000964 class db_found(Exception): pass
965 try:
966 # See whether there is a Sleepycat header in the standard
967 # search path.
968 for d in inc_dirs + db_inc_paths:
969 f = os.path.join(d, "db.h")
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200970 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000971 f = os.path.join(sysroot, d[1:], "db.h")
972
Georg Brandl489cb4f2009-07-11 10:08:49 +0000973 if db_setup_debug: print("db: looking for db.h in", f)
974 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +0000975 with open(f, 'rb') as file:
976 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +0000977 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000978 if m:
979 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +0000980 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000981 db_minor = int(m.group(1))
982 db_ver = (db_major, db_minor)
983
984 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
985 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +0000986 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000987 db_patch = int(m.group(1))
988 if db_patch < 21:
989 print("db.h:", db_ver, "patch", db_patch,
990 "being ignored (4.6.x must be >= 4.6.21)")
991 continue
992
993 if ( (db_ver not in db_ver_inc_map) and
994 allow_db_ver(db_ver) ):
995 # save the include directory with the db.h version
996 # (first occurrence only)
997 db_ver_inc_map[db_ver] = d
998 if db_setup_debug:
999 print("db.h: found", db_ver, "in", d)
1000 else:
1001 # we already found a header for this library version
1002 if db_setup_debug: print("db.h: ignoring", d)
1003 else:
1004 # ignore this header, it didn't contain a version number
1005 if db_setup_debug:
1006 print("db.h: no version number version in", d)
1007
1008 db_found_vers = list(db_ver_inc_map.keys())
1009 db_found_vers.sort()
1010
1011 while db_found_vers:
1012 db_ver = db_found_vers.pop()
1013 db_incdir = db_ver_inc_map[db_ver]
1014
1015 # check lib directories parallel to the location of the header
1016 db_dirs_to_check = [
1017 db_incdir.replace("include", 'lib64'),
1018 db_incdir.replace("include", 'lib'),
1019 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001020
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001021 if host_platform != 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001022 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1023
1024 else:
1025 # Same as other branch, but takes OSX SDK into account
1026 tmp = []
1027 for dn in db_dirs_to_check:
1028 if is_macosx_sdk_path(dn):
1029 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1030 tmp.append(dn)
1031 else:
1032 if os.path.isdir(dn):
1033 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001034 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001035
1036 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001037
Ezio Melotti42da6632011-03-15 05:18:48 +02001038 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001039 # XXX should we -ever- look for a dbX name? Do any
1040 # systems really not name their library by version and
1041 # symlink to more general names?
1042 for dblib in (('db-%d.%d' % db_ver),
1043 ('db%d%d' % db_ver),
1044 ('db%d' % db_ver[0])):
1045 dblib_file = self.compiler.find_library_file(
1046 db_dirs_to_check + lib_dirs, dblib )
1047 if dblib_file:
1048 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1049 raise db_found
1050 else:
1051 if db_setup_debug: print("db lib: ", dblib, "not found")
1052
1053 except db_found:
1054 if db_setup_debug:
1055 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1056 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001057 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001058 # Only add the found library and include directories if they aren't
1059 # already being searched. This avoids an explicit runtime library
1060 # dependency.
1061 if db_incdir in inc_dirs:
1062 db_incs = None
1063 else:
1064 db_incs = [db_incdir]
1065 if dblib_dir[0] in lib_dirs:
1066 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001067 else:
1068 if db_setup_debug: print("db: no appropriate library found")
1069 db_incs = None
1070 dblibs = []
1071 dblib_dir = None
1072
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001073 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001074 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001075
1076 # We hunt for #define SQLITE_VERSION "n.n.n"
1077 # We need to find >= sqlite version 3.0.8
1078 sqlite_incdir = sqlite_libdir = None
1079 sqlite_inc_paths = [ '/usr/include',
1080 '/usr/include/sqlite',
1081 '/usr/include/sqlite3',
1082 '/usr/local/include',
1083 '/usr/local/include/sqlite',
1084 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001085 ]
1086 if cross_compiling:
1087 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1089 MIN_SQLITE_VERSION = ".".join([str(x)
1090 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001091
1092 # Scan the default include directories before the SQLite specific
1093 # ones. This allows one to override the copy of sqlite on OSX,
1094 # where /usr/include contains an old version of sqlite.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001095 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001096 sysroot = macosx_sdk_root()
1097
Ned Deily9b635832012-08-05 15:13:33 -07001098 for d_ in inc_dirs + sqlite_inc_paths:
1099 d = d_
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001100 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001101 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001102
Ned Deily9b635832012-08-05 15:13:33 -07001103 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001104 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001105 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001106 with open(f) as file:
1107 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001108 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001109 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001110 if m:
1111 sqlite_version = m.group(1)
1112 sqlite_version_tuple = tuple([int(x)
1113 for x in sqlite_version.split(".")])
1114 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1115 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001116 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001117 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001118 sqlite_incdir = d
1119 break
1120 else:
1121 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001122 print("%s: version %d is too old, need >= %s"%(d,
1123 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001124 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001125 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001126
1127 if sqlite_incdir:
1128 sqlite_dirs_to_check = [
1129 os.path.join(sqlite_incdir, '..', 'lib64'),
1130 os.path.join(sqlite_incdir, '..', 'lib'),
1131 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1132 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1133 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001134 sqlite_libfile = self.compiler.find_library_file(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001135 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001136 if sqlite_libfile:
1137 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001138
1139 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001140 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001141 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001142 '_sqlite/cursor.c',
1143 '_sqlite/microprotocols.c',
1144 '_sqlite/module.c',
1145 '_sqlite/prepare_protocol.c',
1146 '_sqlite/row.c',
1147 '_sqlite/statement.c',
1148 '_sqlite/util.c', ]
1149
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001150 sqlite_defines = []
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001151 if host_platform != "win32":
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001152 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1153 else:
1154 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1155
Benjamin Peterson076ed002010-10-31 17:11:02 +00001156 # Enable support for loadable extensions in the sqlite3 module
1157 # if --enable-loadable-sqlite-extensions configure option is used.
1158 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1159 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001160
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001161 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +00001162 # In every directory on the search path search for a dynamic
1163 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001164 # for dynamic libraries on the entire path.
1165 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001166 # before the dynamic library in /usr/lib.
1167 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1168 else:
1169 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001170
Brett Cannonc5011fe2011-06-06 20:09:10 -07001171 include_dirs = ["Modules/_sqlite"]
1172 # Only include the directory where sqlite was found if it does
1173 # not already exist in set include directories, otherwise you
1174 # can end up with a bad search path order.
1175 if sqlite_incdir not in self.compiler.include_dirs:
1176 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001177 # avoid a runtime library path for a system library dir
1178 if sqlite_libdir and sqlite_libdir[0] in lib_dirs:
1179 sqlite_libdir = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180 exts.append(Extension('_sqlite3', sqlite_srcs,
1181 define_macros=sqlite_defines,
Brett Cannonc5011fe2011-06-06 20:09:10 -07001182 include_dirs=include_dirs,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001183 library_dirs=sqlite_libdir,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001184 extra_link_args=sqlite_extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001185 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001186 else:
1187 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001188
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001189 dbm_setup_debug = False # verbose debug prints from this script?
Benjamin Petersond78735d2010-01-01 16:04:23 +00001190 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001191 # The standard Unix dbm module:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001192 if host_platform not in ['cygwin']:
Matthias Klose55708cc2009-04-30 08:06:49 +00001193 config_args = [arg.strip("'")
1194 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersond78735d2010-01-01 16:04:23 +00001195 dbm_args = [arg for arg in config_args
Matthias Klose55708cc2009-04-30 08:06:49 +00001196 if arg.startswith('--with-dbmliborder=')]
1197 if dbm_args:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001198 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001199 else:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001200 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001201 dbmext = None
1202 for cand in dbm_order:
1203 if cand == "ndbm":
1204 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan50f147a2012-06-17 18:27:11 +10001205 # Some systems have -lndbm, others have -lgdbm_compat,
1206 # others don't have either
Tarek Ziadé36797272010-07-22 12:50:05 +00001207 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001208 'ndbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001209 ndbm_libs = ['ndbm']
Nick Coghlan50f147a2012-06-17 18:27:11 +10001210 elif self.compiler.find_library_file(lib_dirs,
1211 'gdbm_compat'):
1212 ndbm_libs = ['gdbm_compat']
Matthias Klose55708cc2009-04-30 08:06:49 +00001213 else:
1214 ndbm_libs = []
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001215 if dbm_setup_debug: print("building dbm using ndbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001216 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1217 define_macros=[
1218 ('HAVE_NDBM_H',None),
1219 ],
1220 libraries=ndbm_libs)
1221 break
1222
1223 elif cand == "gdbm":
Tarek Ziadé36797272010-07-22 12:50:05 +00001224 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001225 gdbm_libs = ['gdbm']
Tarek Ziadé36797272010-07-22 12:50:05 +00001226 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001227 'gdbm_compat'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001228 gdbm_libs.append('gdbm_compat')
1229 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001230 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001231 dbmext = Extension(
1232 '_dbm', ['_dbmmodule.c'],
1233 define_macros=[
1234 ('HAVE_GDBM_NDBM_H', None),
1235 ],
1236 libraries = gdbm_libs)
1237 break
1238 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001239 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001240 dbmext = Extension(
1241 '_dbm', ['_dbmmodule.c'],
1242 define_macros=[
1243 ('HAVE_GDBM_DASH_NDBM_H', None),
1244 ],
1245 libraries = gdbm_libs)
1246 break
Georg Brandl489cb4f2009-07-11 10:08:49 +00001247 elif cand == "bdb":
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001248 if dblibs:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001249 if dbm_setup_debug: print("building dbm using bdb")
Georg Brandl489cb4f2009-07-11 10:08:49 +00001250 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1251 library_dirs=dblib_dir,
1252 runtime_library_dirs=dblib_dir,
1253 include_dirs=db_incs,
1254 define_macros=[
1255 ('HAVE_BERKDB_H', None),
1256 ('DB_DBM_HSEARCH', None),
1257 ],
1258 libraries=dblibs)
Matthias Klose55708cc2009-04-30 08:06:49 +00001259 break
1260 if dbmext is not None:
1261 exts.append(dbmext)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001262 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001263 missing.append('_dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001264
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001265 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001266 if ('gdbm' in dbm_order and
Tarek Ziadé36797272010-07-22 12:50:05 +00001267 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001268 exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001269 libraries = ['gdbm'] ) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001270 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001271 missing.append('_gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001272
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001273 # Unix-only modules
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001274 if host_platform != 'win32':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001275 # Steen Lumholt's termios module
1276 exts.append( Extension('termios', ['termios.c']) )
1277 # Jeremy Hylton's rlimit interface
Antoine Pitrou6103ab12009-10-24 20:11:21 +00001278 exts.append( Extension('resource', ['resource.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001279
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001280 # Sun yellow pages. Some systems have the functions in libc.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001281 if (host_platform not in ['cygwin', 'qnx6'] and
Benjamin Peterson588009e2009-12-30 03:03:54 +00001282 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé36797272010-07-22 12:50:05 +00001283 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001284 libs = ['nsl']
1285 else:
1286 libs = []
1287 exts.append( Extension('nis', ['nismodule.c'],
1288 libraries = libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001289 else:
1290 missing.append('nis')
1291 else:
1292 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001293
Skip Montanaro72092942004-02-07 12:50:19 +00001294 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001295 # provided by the ncurses library.
Victor Stinneraa35b002011-11-29 00:08:12 +01001296 curses_defines = []
Victor Stinner756c6ec2011-11-27 00:19:53 +01001297 curses_includes = []
Victor Stinneraa35b002011-11-29 00:08:12 +01001298 panel_library = 'panel'
1299 if curses_library == 'ncursesw':
1300 curses_defines.append(('HAVE_NCURSESW', '1'))
1301 curses_includes.append('/usr/include/ncursesw')
1302 # Bug 1464056: If _curses.so links with ncursesw,
1303 # _curses_panel.so must link with panelw.
1304 panel_library = 'panelw'
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001305 if host_platform == 'darwin':
Ned Deily69192232012-06-20 23:47:14 -07001306 # On OS X, there is no separate /usr/lib/libncursesw nor
1307 # libpanelw. If we are here, we found a locally-supplied
1308 # version of libncursesw. There should be also be a
1309 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1310 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1311 # ncurses wide char support
1312 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001313 elif host_platform == 'darwin' and curses_library == 'ncurses':
Ned Deily69192232012-06-20 23:47:14 -07001314 # Building with the system-suppied combined libncurses/libpanel
1315 curses_defines.append(('HAVE_NCURSESW', '1'))
1316 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Victor Stinneraa35b002011-11-29 00:08:12 +01001317
Stefan Krah095b2732010-06-08 13:41:44 +00001318 if curses_library.startswith('ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001319 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001320 exts.append( Extension('_curses', ['_cursesmodule.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001321 include_dirs=curses_includes,
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001322 define_macros=curses_defines,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001323 libraries = curses_libs) )
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001324 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001325 # OSX has an old Berkeley curses, not good enough for
1326 # the _curses module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001327 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001328 curses_libs = ['curses', 'terminfo']
Tarek Ziadé36797272010-07-22 12:50:05 +00001329 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001330 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001331 else:
1332 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001333
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001334 exts.append( Extension('_curses', ['_cursesmodule.c'],
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001335 define_macros=curses_defines,
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001336 libraries = curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001337 else:
1338 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001339
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001340 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001341 if (module_enabled(exts, '_curses') and
Tarek Ziadé36797272010-07-22 12:50:05 +00001342 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001343 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001344 include_dirs=curses_includes,
Ned Deily69192232012-06-20 23:47:14 -07001345 define_macros=curses_defines,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001346 libraries = [panel_library] + curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001347 else:
1348 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001349
Barry Warsaw259b1e12002-08-13 20:09:26 +00001350 # Andrew Kuchling's zlib module. Note that some versions of zlib
1351 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1352 # http://www.cert.org/advisories/CA-2002-07.html
1353 #
1354 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1355 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1356 # now, we still accept 1.1.3, because we think it's difficult to
1357 # exploit this in Python, and we'd rather make it RedHat's problem
1358 # than our problem <wink>.
1359 #
1360 # You can upgrade zlib to version 1.1.4 yourself by going to
1361 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001362 zlib_inc = find_file('zlib.h', [], inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001363 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001364 if zlib_inc is not None:
1365 zlib_h = zlib_inc[0] + '/zlib.h'
1366 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001367 version_req = '"1.1.3"'
Ned Deily507c5912013-10-18 21:32:00 -07001368 if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
1369 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001370 with open(zlib_h) as fp:
1371 while 1:
1372 line = fp.readline()
1373 if not line:
1374 break
1375 if line.startswith('#define ZLIB_VERSION'):
1376 version = line.split()[2]
1377 break
Guido van Rossume6970912001-04-15 15:16:12 +00001378 if version >= version_req:
Tarek Ziadé36797272010-07-22 12:50:05 +00001379 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001380 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001381 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1382 else:
1383 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001384 exts.append( Extension('zlib', ['zlibmodule.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001385 libraries = ['z'],
1386 extra_link_args = zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001387 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001388 else:
1389 missing.append('zlib')
1390 else:
1391 missing.append('zlib')
1392 else:
1393 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001394
Christian Heimes1dc54002008-03-24 02:19:29 +00001395 # Helper module for various ascii-encoders. Uses zlib for an optimized
1396 # crc32 if we have it. Otherwise binascii uses its own.
1397 if have_zlib:
1398 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1399 libraries = ['z']
1400 extra_link_args = zlib_extra_link_args
1401 else:
1402 extra_compile_args = []
1403 libraries = []
1404 extra_link_args = []
1405 exts.append( Extension('binascii', ['binascii.c'],
1406 extra_compile_args = extra_compile_args,
1407 libraries = libraries,
1408 extra_link_args = extra_link_args) )
1409
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001410 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001411 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001412 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001413 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1414 else:
1415 bz2_extra_link_args = ()
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001416 exts.append( Extension('_bz2', ['_bz2module.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001417 libraries = ['bz2'],
1418 extra_link_args = bz2_extra_link_args) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001419 else:
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001420 missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001421
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001422 # LZMA compression support.
1423 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1424 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1425 libraries = ['lzma']) )
1426 else:
1427 missing.append('_lzma')
1428
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001429 # Interface to the Expat XML parser
1430 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001431 # Expat was written by James Clark and is now maintained by a group of
1432 # developers on SourceForge; see www.libexpat.org for more information.
1433 # The pyexpat module was written by Paul Prescod after a prototype by
1434 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1435 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001436 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001437 #
1438 # More information on Expat can be found at www.libexpat.org.
1439 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001440 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1441 expat_inc = []
1442 define_macros = []
1443 expat_lib = ['expat']
1444 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001445 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001446 else:
1447 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1448 define_macros = [
1449 ('HAVE_EXPAT_CONFIG_H', '1'),
1450 ]
1451 expat_lib = []
1452 expat_sources = ['expat/xmlparse.c',
1453 'expat/xmlrole.c',
1454 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001455 expat_depends = ['expat/ascii.h',
1456 'expat/asciitab.h',
1457 'expat/expat.h',
1458 'expat/expat_config.h',
1459 'expat/expat_external.h',
1460 'expat/internal.h',
1461 'expat/latin1tab.h',
1462 'expat/utf8tab.h',
1463 'expat/xmlrole.h',
1464 'expat/xmltok.h',
1465 'expat/xmltok_impl.h'
1466 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001467
Fred Drake2d59a492003-10-21 15:41:15 +00001468 exts.append(Extension('pyexpat',
1469 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001470 include_dirs = expat_inc,
1471 libraries = expat_lib,
Christian Heimesd489c7a2013-02-09 17:02:06 +01001472 sources = ['pyexpat.c'] + expat_sources,
1473 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001474 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001475
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001476 # Fredrik Lundh's cElementTree module. Note that this also
1477 # uses expat (via the CAPI hook in pyexpat).
1478
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001479 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001480 define_macros.append(('USE_PYEXPAT_CAPI', None))
1481 exts.append(Extension('_elementtree',
1482 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001483 include_dirs = expat_inc,
1484 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001485 sources = ['_elementtree.c'],
Christian Heimesd489c7a2013-02-09 17:02:06 +01001486 depends = ['pyexpat.c'] + expat_sources +
1487 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001488 ))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001489 else:
1490 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001491
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001492 # Hye-Shik Chang's CJKCodecs modules.
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001493 exts.append(Extension('_multibytecodec',
1494 ['cjkcodecs/multibytecodec.c']))
1495 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1496 exts.append(Extension('_codecs_%s' % loc,
1497 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001498
Stefan Krah1919b7e2012-03-21 18:25:23 +01001499 # Stefan Krah's _decimal module
1500 exts.append(self._decimal_ext())
1501
Thomas Hellercf567c12006-03-08 19:51:58 +00001502 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001504
Benjamin Petersone711caf2008-06-11 16:44:04 +00001505 # Richard Oudkerk's multiprocessing module
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001506 if host_platform == 'win32': # Windows
Benjamin Petersone711caf2008-06-11 16:44:04 +00001507 macros = dict()
1508 libraries = ['ws2_32']
1509
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001510 elif host_platform == 'darwin': # Mac OSX
Benjamin Peterson965ce872009-04-05 21:24:58 +00001511 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001512 libraries = []
1513
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001514 elif host_platform == 'cygwin': # Cygwin
Benjamin Peterson965ce872009-04-05 21:24:58 +00001515 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001516 libraries = []
Benjamin Peterson41181742008-07-02 20:22:54 +00001517
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001518 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Benjamin Peterson41181742008-07-02 20:22:54 +00001519 # FreeBSD's P1003.1b semaphore support is very experimental
1520 # and has many known problems. (as of June 2008)
Benjamin Peterson965ce872009-04-05 21:24:58 +00001521 macros = dict()
Benjamin Peterson41181742008-07-02 20:22:54 +00001522 libraries = []
1523
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001524 elif host_platform.startswith('openbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001525 macros = dict()
Benjamin Petersone5384b02008-10-04 22:00:42 +00001526 libraries = []
1527
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001528 elif host_platform.startswith('netbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001529 macros = dict()
Jesse Noller32d68c22009-03-31 18:48:42 +00001530 libraries = []
1531
Benjamin Petersone711caf2008-06-11 16:44:04 +00001532 else: # Linux and other unices
Benjamin Peterson965ce872009-04-05 21:24:58 +00001533 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001534 libraries = ['rt']
1535
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001536 if host_platform == 'win32':
Benjamin Petersone711caf2008-06-11 16:44:04 +00001537 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1538 '_multiprocessing/semaphore.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001539 ]
1540
1541 else:
1542 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001543 ]
Mark Dickinsona614f042009-11-28 12:48:43 +00001544 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1545 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001546 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1547
Jesse Noller6fd47e22009-01-23 14:09:08 +00001548 if sysconfig.get_config_var('WITH_THREAD'):
1549 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1550 define_macros=list(macros.items()),
1551 include_dirs=["Modules/_multiprocessing"]))
1552 else:
1553 missing.append('_multiprocessing')
Benjamin Petersone711caf2008-06-11 16:44:04 +00001554 # End multiprocessing
Guido van Rossuma9e20242007-03-08 00:43:48 +00001555
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001556 # Platform-specific libraries
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001557 if host_platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001558 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001559 else:
1560 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001561
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001562 if host_platform == 'darwin':
Benjamin Petersonebacd262008-05-29 21:09:51 +00001563 exts.append(
Ronald Oussoren84151202010-04-18 20:46:11 +00001564 Extension('_scproxy', ['_scproxy.c'],
1565 extra_link_args=[
1566 '-framework', 'SystemConfiguration',
1567 '-framework', 'CoreFoundation',
1568 ]))
Benjamin Petersonebacd262008-05-29 21:09:51 +00001569
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001570 self.extensions.extend(exts)
1571
1572 # Call the method for detecting whether _tkinter can be compiled
1573 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001574
Guido van Rossumd8faa362007-04-27 19:54:29 +00001575 if '_tkinter' not in [e.name for e in self.extensions]:
1576 missing.append('_tkinter')
1577
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001578## # Uncomment these lines if you want to play with xxmodule.c
1579## ext = Extension('xx', ['xxmodule.c'])
1580## self.extensions.append(ext)
1581
1582 if 'd' not in sys.abiflags:
1583 ext = Extension('xxlimited', ['xxlimited.c'],
Benjamin Peterson24ac8772015-06-03 00:04:46 -05001584 define_macros=[('Py_LIMITED_API', '0x03050000')])
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001585 self.extensions.append(ext)
1586
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587 return missing
1588
Ned Deilyd819b932013-09-06 01:07:05 -07001589 def detect_tkinter_explicitly(self):
1590 # Build _tkinter using explicit locations for Tcl/Tk.
1591 #
1592 # This is enabled when both arguments are given to ./configure:
1593 #
1594 # --with-tcltk-includes="-I/path/to/tclincludes \
1595 # -I/path/to/tkincludes"
1596 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1597 # -L/path/to/tklibs -ltkm.n"
1598 #
1599 # These values can also be specified or overriden via make:
1600 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1601 #
1602 # This can be useful for building and testing tkinter with multiple
1603 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1604 # build of Tcl so you need to specify both arguments and use care when
1605 # overriding.
1606
1607 # The _TCLTK variables are created in the Makefile sharedmods target.
1608 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1609 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1610 if not (tcltk_includes and tcltk_libs):
1611 # Resume default configuration search.
1612 return 0
1613
1614 extra_compile_args = tcltk_includes.split()
1615 extra_link_args = tcltk_libs.split()
1616 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1617 define_macros=[('WITH_APPINIT', 1)],
1618 extra_compile_args = extra_compile_args,
1619 extra_link_args = extra_link_args,
1620 )
1621 self.extensions.append(ext)
1622 return 1
1623
Jack Jansen0b06be72002-06-21 14:48:38 +00001624 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1625 # The _tkinter module, using frameworks. Since frameworks are quite
1626 # different the UNIX search logic is not sharable.
1627 from os.path import join, exists
1628 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001629 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001630 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001631 join(os.getenv('HOME'), '/Library/Frameworks')
1632 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001633
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001634 sysroot = macosx_sdk_root()
1635
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001636 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001637 # bundles.
1638 # XXX distutils should support -F!
1639 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001640 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001641
1642
Jack Jansen0b06be72002-06-21 14:48:38 +00001643 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001644 if is_macosx_sdk_path(F):
1645 if not exists(join(sysroot, F[1:], fw + '.framework')):
1646 break
1647 else:
1648 if not exists(join(F, fw + '.framework')):
1649 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001650 else:
1651 # ok, F is now directory with both frameworks. Continure
1652 # building
1653 break
1654 else:
1655 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1656 # will now resume.
1657 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001658
Jack Jansen0b06be72002-06-21 14:48:38 +00001659 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1660 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001661 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001662 #
1663 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001664 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001665 for fw in ('Tcl', 'Tk')
1666 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001667 ]
1668
Tim Peters2c60f7a2003-01-29 03:49:43 +00001669 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001670 # complicated search, this is a hard-coded path. It could bail out
1671 # if X11 libs are not found...
1672 include_dirs.append('/usr/X11R6/include')
1673 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1674
Georg Brandlfcaf9102008-07-16 02:17:56 +00001675 # All existing framework builds of Tcl/Tk don't support 64-bit
1676 # architectures.
1677 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1678 archs = re.findall('-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001679
Ronald Oussorend097efe2009-09-15 19:07:58 +00001680 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1681 if not os.path.exists(self.build_temp):
1682 os.makedirs(self.build_temp)
1683
1684 # Note: cannot use os.popen or subprocess here, that
1685 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001686 if is_macosx_sdk_path(F):
1687 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1688 else:
1689 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001690
Brett Cannon9f5db072010-10-29 20:19:27 +00001691 with open(tmpfile) as fp:
1692 detected_archs = []
1693 for ln in fp:
1694 a = ln.split()[-1]
1695 if a in archs:
1696 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001697 os.unlink(tmpfile)
1698
1699 for a in detected_archs:
1700 frameworks.append('-arch')
1701 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001702
Jack Jansen0b06be72002-06-21 14:48:38 +00001703 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1704 define_macros=[('WITH_APPINIT', 1)],
1705 include_dirs = include_dirs,
1706 libraries = [],
Georg Brandlfcaf9102008-07-16 02:17:56 +00001707 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001708 extra_link_args = frameworks,
1709 )
1710 self.extensions.append(ext)
1711 return 1
1712
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001713 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001714 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001715
Ned Deilyd819b932013-09-06 01:07:05 -07001716 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1717 # configured or passed into the make target. If so, use these values
1718 # to build tkinter and bypass the searches for Tcl and TK in standard
1719 # locations.
1720 if self.detect_tkinter_explicitly():
1721 return
1722
Jack Jansen0b06be72002-06-21 14:48:38 +00001723 # Rather than complicate the code below, detecting and building
1724 # AquaTk is a separate method. Only one Tkinter will be built on
1725 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001726 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001727 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001728 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001729
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001730 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001731 # The versions with dots are used on Unix, and the versions without
1732 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001733 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001734 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1735 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé36797272010-07-22 12:50:05 +00001736 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001737 'tk' + version)
Tarek Ziadé36797272010-07-22 12:50:05 +00001738 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001739 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001740 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001741 # Exit the loop when we've found the Tcl/Tk libraries
1742 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001743
Fredrik Lundhade711a2001-01-24 08:00:28 +00001744 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001745 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001746 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001747 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001748 dotversion = version
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001749 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001750 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1751 # but the include subdirs are named like .../include/tcl8.3.
1752 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1753 tcl_include_sub = []
1754 tk_include_sub = []
1755 for dir in inc_dirs:
1756 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1757 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1758 tk_include_sub += tcl_include_sub
1759 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1760 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001761
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001762 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001763 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001764 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001765 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001766
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001767 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001768
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001769 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1770 for dir in tcl_includes + tk_includes:
1771 if dir not in include_dirs:
1772 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001773
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001774 # Check for various platform-specific directories
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001775 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001776 include_dirs.append('/usr/openwin/include')
1777 added_lib_dirs.append('/usr/openwin/lib')
1778 elif os.path.exists('/usr/X11R6/include'):
1779 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001780 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001781 added_lib_dirs.append('/usr/X11R6/lib')
1782 elif os.path.exists('/usr/X11R5/include'):
1783 include_dirs.append('/usr/X11R5/include')
1784 added_lib_dirs.append('/usr/X11R5/lib')
1785 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001786 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001787 include_dirs.append('/usr/X11/include')
1788 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001789
Jason Tishler9181c942003-02-05 15:16:17 +00001790 # If Cygwin, then verify that X is installed before proceeding
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001791 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001792 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1793 if x11_inc is None:
1794 return
1795
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001796 # Check for BLT extension
Tarek Ziadé36797272010-07-22 12:50:05 +00001797 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001798 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001799 defs.append( ('WITH_BLT', 1) )
1800 libs.append('BLT8.0')
Tarek Ziadé36797272010-07-22 12:50:05 +00001801 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001802 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001803 defs.append( ('WITH_BLT', 1) )
1804 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001805
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001806 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001807 libs.append('tk'+ version)
1808 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001809
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001810 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001811 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001812
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001813 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001814 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001815 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001816
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001817 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1818 define_macros=[('WITH_APPINIT', 1)] + defs,
1819 include_dirs = include_dirs,
1820 libraries = libs,
1821 library_dirs = added_lib_dirs,
1822 )
1823 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001824
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001825 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001826 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001827 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001828 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001829 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001830 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001831 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001832
Christian Heimes78644762008-03-04 23:39:23 +00001833 def configure_ctypes_darwin(self, ext):
1834 # Darwin (OS X) uses preconfigured files, in
1835 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauer014bf282009-02-05 16:35:45 +00001836 srcdir = sysconfig.get_config_var('srcdir')
Christian Heimes78644762008-03-04 23:39:23 +00001837 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1838 '_ctypes', 'libffi_osx'))
1839 sources = [os.path.join(ffi_srcdir, p)
1840 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001841 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001842 'x86/x86-darwin.S',
1843 'x86/x86-ffi_darwin.c',
1844 'x86/x86-ffi64.c',
1845 'powerpc/ppc-darwin.S',
1846 'powerpc/ppc-darwin_closure.S',
1847 'powerpc/ppc-ffi_darwin.c',
1848 'powerpc/ppc64-darwin_closure.S',
1849 ]]
1850
1851 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001852 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001853
1854 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1855 os.path.join(ffi_srcdir, 'powerpc')]
1856 ext.include_dirs.extend(include_dirs)
1857 ext.sources.extend(sources)
1858 return True
1859
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001860 def configure_ctypes(self, ext):
1861 if not self.use_system_libffi:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001862 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001863 return self.configure_ctypes_darwin(ext)
1864
Neil Schemenauer014bf282009-02-05 16:35:45 +00001865 srcdir = sysconfig.get_config_var('srcdir')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001866 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1867 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1868 '_ctypes', 'libffi'))
1869 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001870
Thomas Wouters477c8d52006-05-27 19:21:47 +00001871 from distutils.dep_util import newer_group
1872
1873 config_sources = [os.path.join(ffi_srcdir, fname)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001874 for fname in os.listdir(ffi_srcdir)
1875 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001876 if self.force or newer_group(config_sources,
1877 ffi_configfile):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001878 from distutils.dir_util import mkpath
1879 mkpath(ffi_builddir)
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001880 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
1881 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes7dd06e12012-09-06 18:02:49 +02001882 if not self.verbose:
1883 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00001884
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001885 # Pass empty CFLAGS because we'll just append the resulting
1886 # CFLAGS to Python's; -g or -O2 is to be avoided.
1887 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1888 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001889
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001890 res = os.system(cmd)
1891 if res or not os.path.exists(ffi_configfile):
Guido van Rossum452bf512007-02-09 05:32:43 +00001892 print("Failed to configure _ctypes module")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001893 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001894
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001895 fficonfig = {}
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001896 with open(ffi_configfile) as f:
1897 exec(f.read(), globals(), fficonfig)
Thomas Hellercf567c12006-03-08 19:51:58 +00001898
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001899 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001900 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001901
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001902 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001903 ffi_builddir,
1904 os.path.join(ffi_srcdir, 'src')]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001905 extra_compile_args = fficonfig['ffi_cflags'].split()
1906
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001907 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1908 fficonfig['ffi_sources'])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001909 ext.include_dirs.extend(include_dirs)
1910 ext.extra_compile_args.extend(extra_compile_args)
1911 return True
1912
1913 def detect_ctypes(self, inc_dirs, lib_dirs):
1914 self.use_system_libffi = False
1915 include_dirs = []
1916 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001917 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001918 sources = ['_ctypes/_ctypes.c',
1919 '_ctypes/callbacks.c',
1920 '_ctypes/callproc.c',
1921 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001922 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001923 depends = ['_ctypes/ctypes.h']
1924
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001925 if host_platform == 'darwin':
Ronald Oussoren2decf222010-09-05 18:25:59 +00001926 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001927 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001928 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001929 include_dirs.append('_ctypes/darwin')
1930# XXX Is this still needed?
1931## extra_link_args.extend(['-read_only_relocs', 'warning'])
1932
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001933 elif host_platform == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001934 # XXX This shouldn't be necessary; it appears that some
1935 # of the assembler code is non-PIC (i.e. it has relocations
1936 # when it shouldn't. The proper fix would be to rewrite
1937 # the assembler code to be PIC.
1938 # This only works with GCC; the Sun compiler likely refuses
1939 # this option. If you want to compile ctypes with the Sun
1940 # compiler, please research a proper solution, instead of
1941 # finding some -z option for the Sun compiler.
1942 extra_link_args.append('-mimpure-text')
1943
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001944 elif host_platform.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001945 extra_link_args.append('-fPIC')
1946
Thomas Hellercf567c12006-03-08 19:51:58 +00001947 ext = Extension('_ctypes',
1948 include_dirs=include_dirs,
1949 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001950 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001951 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001952 sources=sources,
1953 depends=depends)
1954 ext_test = Extension('_ctypes_test',
1955 sources=['_ctypes/_ctypes_test.c'])
1956 self.extensions.extend([ext, ext_test])
1957
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001958 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1959 return
1960
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001961 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001962 # OS X 10.5 comes with libffi.dylib; the include files are
1963 # in /usr/include/ffi
1964 inc_dirs.append('/usr/include/ffi')
1965
Benjamin Petersond78735d2010-01-01 16:04:23 +00001966 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001967 if not ffi_inc or ffi_inc[0] == '':
Benjamin Petersond78735d2010-01-01 16:04:23 +00001968 ffi_inc = find_file('ffi.h', [], inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001969 if ffi_inc is not None:
1970 ffi_h = ffi_inc[0] + '/ffi.h'
Brett Cannon9f5db072010-10-29 20:19:27 +00001971 with open(ffi_h) as fp:
1972 while 1:
1973 line = fp.readline()
1974 if not line:
1975 ffi_inc = None
1976 break
1977 if line.startswith('#define LIBFFI_H'):
1978 break
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001979 ffi_lib = None
1980 if ffi_inc is not None:
1981 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé36797272010-07-22 12:50:05 +00001982 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001983 ffi_lib = lib_name
1984 break
1985
1986 if ffi_inc and ffi_lib:
1987 ext.include_dirs.extend(ffi_inc)
1988 ext.libraries.append(ffi_lib)
1989 self.use_system_libffi = True
1990
Stefan Krah1919b7e2012-03-21 18:25:23 +01001991 def _decimal_ext(self):
Stefan Krah60187b52012-03-23 19:06:27 +01001992 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02001993 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01001994 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
1995 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01001996 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01001997 sources = ['_decimal/_decimal.c']
1998 depends = ['_decimal/docstrings.h']
1999 else:
Ned Deily458a6fb2012-04-01 02:30:46 -07002000 srcdir = sysconfig.get_config_var('srcdir')
2001 include_dirs = [os.path.abspath(os.path.join(srcdir,
2002 'Modules',
2003 '_decimal',
2004 'libmpdec'))]
Stefan Krah60187b52012-03-23 19:06:27 +01002005 libraries = []
2006 sources = [
2007 '_decimal/_decimal.c',
2008 '_decimal/libmpdec/basearith.c',
2009 '_decimal/libmpdec/constants.c',
2010 '_decimal/libmpdec/context.c',
2011 '_decimal/libmpdec/convolute.c',
2012 '_decimal/libmpdec/crt.c',
2013 '_decimal/libmpdec/difradix2.c',
2014 '_decimal/libmpdec/fnt.c',
2015 '_decimal/libmpdec/fourstep.c',
2016 '_decimal/libmpdec/io.c',
2017 '_decimal/libmpdec/memory.c',
2018 '_decimal/libmpdec/mpdecimal.c',
2019 '_decimal/libmpdec/numbertheory.c',
2020 '_decimal/libmpdec/sixstep.c',
2021 '_decimal/libmpdec/transpose.c',
2022 ]
2023 depends = [
2024 '_decimal/docstrings.h',
2025 '_decimal/libmpdec/basearith.h',
2026 '_decimal/libmpdec/bits.h',
2027 '_decimal/libmpdec/constants.h',
2028 '_decimal/libmpdec/convolute.h',
2029 '_decimal/libmpdec/crt.h',
2030 '_decimal/libmpdec/difradix2.h',
2031 '_decimal/libmpdec/fnt.h',
2032 '_decimal/libmpdec/fourstep.h',
2033 '_decimal/libmpdec/io.h',
2034 '_decimal/libmpdec/memory.h',
2035 '_decimal/libmpdec/mpdecimal.h',
2036 '_decimal/libmpdec/numbertheory.h',
2037 '_decimal/libmpdec/sixstep.h',
2038 '_decimal/libmpdec/transpose.h',
2039 '_decimal/libmpdec/typearith.h',
2040 '_decimal/libmpdec/umodarith.h',
2041 ]
2042
Stefan Krah1919b7e2012-03-21 18:25:23 +01002043 config = {
2044 'x64': [('CONFIG_64','1'), ('ASM','1')],
2045 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2046 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2047 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2048 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2049 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2050 ('LEGACY_COMPILER','1')],
2051 'universal': [('UNIVERSAL','1')]
2052 }
2053
Stefan Krah1919b7e2012-03-21 18:25:23 +01002054 cc = sysconfig.get_config_var('CC')
2055 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2056 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2057
2058 if machine:
2059 # Override automatic configuration to facilitate testing.
2060 define_macros = config[machine]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02002061 elif host_platform == 'darwin':
Stefan Krah1919b7e2012-03-21 18:25:23 +01002062 # Universal here means: build with the same options Python
2063 # was built with.
2064 define_macros = config['universal']
2065 elif sizeof_size_t == 8:
2066 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2067 define_macros = config['x64']
2068 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2069 define_macros = config['uint128']
2070 else:
2071 define_macros = config['ansi64']
2072 elif sizeof_size_t == 4:
2073 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2074 if ppro and ('gcc' in cc or 'clang' in cc) and \
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02002075 not 'sunos' in host_platform:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002076 # solaris: problems with register allocation.
2077 # icc >= 11.0 works as well.
2078 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002079 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002080 else:
2081 define_macros = config['ansi32']
2082 else:
2083 raise DistutilsError("_decimal: unsupported architecture")
2084
2085 # Workarounds for toolchain bugs:
2086 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2087 # Some versions of gcc miscompile inline asm:
2088 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2089 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2090 extra_compile_args.append('-fno-ipa-pure-const')
2091 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2092 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2093 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2094 undef_macros.append('_FORTIFY_SOURCE')
2095
2096 # Faster version without thread local contexts:
2097 if not sysconfig.get_config_var('WITH_THREAD'):
2098 define_macros.append(('WITHOUT_THREADS', 1))
2099
Stefan Krahce55f082013-01-16 14:45:16 +01002100 # Increase warning level for gcc:
2101 if 'gcc' in cc:
Stefan Krah4f197442013-03-07 01:12:03 +01002102 cmd = ("echo '' | %s -Wextra -Wno-missing-field-initializers -E - "
2103 "> /dev/null 2>&1" % cc)
Stefan Krah13fe6d12013-01-17 12:49:34 +01002104 ret = os.system(cmd)
2105 if ret >> 8 == 0:
2106 extra_compile_args.extend(['-Wextra',
2107 '-Wno-missing-field-initializers'])
Stefan Krahce55f082013-01-16 14:45:16 +01002108
Stefan Krah1919b7e2012-03-21 18:25:23 +01002109 # Uncomment for extra functionality:
2110 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
2111 ext = Extension (
2112 '_decimal',
2113 include_dirs=include_dirs,
Stefan Krah60187b52012-03-23 19:06:27 +01002114 libraries=libraries,
Stefan Krah1919b7e2012-03-21 18:25:23 +01002115 define_macros=define_macros,
2116 undef_macros=undef_macros,
2117 extra_compile_args=extra_compile_args,
2118 sources=sources,
2119 depends=depends
2120 )
2121 return ext
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002122
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002123class PyBuildInstall(install):
2124 # Suppress the warning about installation into the lib_dynload
2125 # directory, which is not in sys.path when running Python during
2126 # installation:
2127 def initialize_options (self):
2128 install.initialize_options(self)
2129 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002130
Éric Araujoe6792c12011-06-09 14:07:02 +02002131 # Customize subcommands to not install an egg-info file for Python
2132 sub_commands = [('install_lib', install.has_lib),
2133 ('install_headers', install.has_headers),
2134 ('install_scripts', install.has_scripts),
2135 ('install_data', install.has_data)]
2136
2137
Michael W. Hudson529a5052002-12-17 16:47:17 +00002138class PyBuildInstallLib(install_lib):
2139 # Do exactly what install_lib does but make sure correct access modes get
2140 # set on installed directories and files. All installed files with get
2141 # mode 644 unless they are a shared library in which case they will get
2142 # mode 755. All installed directories will get mode 755.
2143
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002144 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2145 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002146
2147 def install(self):
2148 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002149 self.set_file_modes(outfiles, 0o644, 0o755)
2150 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002151 return outfiles
2152
2153 def set_file_modes(self, files, defaultMode, sharedLibMode):
2154 if not self.is_chmod_supported(): return
2155 if not files: return
2156
2157 for filename in files:
2158 if os.path.islink(filename): continue
2159 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002160 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002161 log.info("changing mode of %s to %o", filename, mode)
2162 if not self.dry_run: os.chmod(filename, mode)
2163
2164 def set_dir_modes(self, dirname, mode):
2165 if not self.is_chmod_supported(): return
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002166 for dirpath, dirnames, fnames in os.walk(dirname):
2167 if os.path.islink(dirpath):
2168 continue
2169 log.info("changing mode of %s to %o", dirpath, mode)
2170 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002171
2172 def is_chmod_supported(self):
2173 return hasattr(os, 'chmod')
2174
Georg Brandlff52f762010-12-28 09:51:43 +00002175class PyBuildScripts(build_scripts):
2176 def copy_scripts(self):
2177 outfiles, updated_files = build_scripts.copy_scripts(self)
2178 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2179 minoronly = '.{0[1]}'.format(sys.version_info)
2180 newoutfiles = []
2181 newupdated_files = []
2182 for filename in outfiles:
Vinay Sajip7ded1f02012-05-26 03:45:29 +01002183 if filename.endswith(('2to3', 'pyvenv')):
Georg Brandlff52f762010-12-28 09:51:43 +00002184 newfilename = filename + fullversion
2185 else:
2186 newfilename = filename + minoronly
2187 log.info('renaming {} to {}'.format(filename, newfilename))
2188 os.rename(filename, newfilename)
2189 newoutfiles.append(newfilename)
2190 if filename in updated_files:
2191 newupdated_files.append(newfilename)
2192 return newoutfiles, newupdated_files
2193
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002194SUMMARY = """
2195Python is an interpreted, interactive, object-oriented programming
2196language. It is often compared to Tcl, Perl, Scheme or Java.
2197
2198Python combines remarkable power with very clear syntax. It has
2199modules, classes, exceptions, very high level dynamic data types, and
2200dynamic typing. There are interfaces to many system calls and
2201libraries, as well as to various windowing systems (X11, Motif, Tk,
2202Mac, MFC). New built-in modules are easily written in C or C++. Python
2203is also usable as an extension language for applications that need a
2204programmable interface.
2205
2206The Python implementation is portable: it runs on many brands of UNIX,
Jesus Ceaf1af7052012-10-05 02:48:46 +02002207on Windows, DOS, Mac, Amiga... If your favorite system isn't
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002208listed here, it may still be supported, if there's a C compiler for
2209it. Ask around on comp.lang.python -- or just try compiling Python
2210yourself.
2211"""
2212
2213CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002214Development Status :: 6 - Mature
2215License :: OSI Approved :: Python Software Foundation License
2216Natural Language :: English
2217Programming Language :: C
2218Programming Language :: Python
2219Topic :: Software Development
2220"""
2221
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002222def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002223 # turn off warnings when deprecated modules are imported
2224 import warnings
2225 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002226 setup(# PyPI Metadata (PEP 301)
2227 name = "Python",
2228 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002229 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002230 maintainer = "Guido van Rossum and the Python community",
2231 maintainer_email = "python-dev@python.org",
2232 description = "A high-level object-oriented programming language",
2233 long_description = SUMMARY.strip(),
2234 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002235 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002236 platforms = ["Many"],
2237
2238 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002239 cmdclass = {'build_ext': PyBuildExt,
2240 'build_scripts': PyBuildScripts,
2241 'install': PyBuildInstall,
2242 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002243 # The struct module is defined here, because build_ext won't be
2244 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002245 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002246
Georg Brandlff52f762010-12-28 09:51:43 +00002247 # If you change the scripts installed here, you also need to
2248 # check the PyBuildScripts command above, and change the links
2249 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002250 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Éric Araujo859aad62012-06-24 00:07:41 -04002251 "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002252 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002253
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002254# --install-platlib
2255if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002256 main()