blob: b4357e39cf195dabe0ddf0692f80a311579648f3 [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
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000011from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000012from distutils.core import Extension, setup
13from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000014from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000015from distutils.command.install_lib import install_lib
Georg Brandlff52f762010-12-28 09:51:43 +000016from distutils.command.build_scripts import build_scripts
Stefan Krah095b2732010-06-08 13:41:44 +000017from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000018
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020019cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
20
Victor Stinnerf14087a2018-12-20 16:03:01 +010021# Set common compiler and linker flags derived from the Makefile,
22# reserved for building the interpreter and the stdlib modules.
23# See bpo-21121 and bpo-35257
24def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
25 flags = sysconfig.get_config_var(compiler_flags)
26 py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
27 sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
28
29set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
30set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
Benjamin Petersonacb8c522014-08-09 20:01:49 -070031
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020032class Dummy:
33 """Hack for parallel build"""
34 ProcessPoolExecutor = None
35sys.modules['concurrent.futures.process'] = Dummy
36
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020037def get_platform():
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020038 # cross build
39 if "_PYTHON_HOST_PLATFORM" in os.environ:
40 return os.environ["_PYTHON_HOST_PLATFORM"]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020041 # Get value of sys.platform
42 if sys.platform.startswith('osf1'):
43 return 'osf1'
44 return sys.platform
45host_platform = get_platform()
46
Gregory P. Smithb04ded42010-01-03 00:38:10 +000047# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020048COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithb04ded42010-01-03 00:38:10 +000049
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000050# This global variable is used to hold the list of modules to be disabled.
51disabled_module_list = []
52
Michael W. Hudson39230b32002-01-16 15:26:48 +000053def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000054 """Add the directory 'dir' to the list 'dirlist' (after any relative
55 directories) if:
56
Michael W. Hudson39230b32002-01-16 15:26:48 +000057 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000058 2) 'dir' actually exists, and is a directory.
59 """
60 if dir is None or not os.path.isdir(dir) or dir in dirlist:
61 return
62 for i, path in enumerate(dirlist):
63 if not os.path.isabs(path):
64 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000065 return
66 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +000067
xdegaye77f51392017-11-25 17:25:30 +010068def sysroot_paths(make_vars, subdirs):
69 """Get the paths of sysroot sub-directories.
70
71 * make_vars: a sequence of names of variables of the Makefile where
72 sysroot may be set.
73 * subdirs: a sequence of names of subdirectories used as the location for
74 headers or libraries.
75 """
76
77 dirs = []
78 for var_name in make_vars:
79 var = sysconfig.get_config_var(var_name)
80 if var is not None:
81 m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
82 if m is not None:
83 sysroot = m.group(1).strip('"')
84 for subdir in subdirs:
85 if os.path.isabs(subdir):
86 subdir = subdir[1:]
87 path = os.path.join(sysroot, subdir)
88 if os.path.isdir(path):
89 dirs.append(path)
90 break
91 return dirs
92
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000093def macosx_sdk_root():
94 """
95 Return the directory of the current OSX SDK,
96 or '/' if no SDK was specified.
97 """
98 cflags = sysconfig.get_config_var('CFLAGS')
99 m = re.search(r'-isysroot\s+(\S+)', cflags)
100 if m is None:
101 sysroot = '/'
102 else:
103 sysroot = m.group(1)
104 return sysroot
105
106def is_macosx_sdk_path(path):
107 """
108 Returns True if 'path' can be located in an OSX SDK
109 """
Ned Deily2910a7b2012-07-30 02:35:58 -0700110 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
111 or path.startswith('/System/')
112 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000113
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000114def find_file(filename, std_dirs, paths):
115 """Searches for the directory where a given file is located,
116 and returns a possibly-empty list of additional directories, or None
117 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +0000118
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000119 'filename' is the name of a file, such as readline.h or libcrypto.a.
120 'std_dirs' is the list of standard system directories; if the
121 file is found in one of them, no additional directives are needed.
122 'paths' is a list of additional locations to check; if the file is
123 found in one of them, the resulting list will contain the directory.
124 """
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200125 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000126 # Honor the MacOSX SDK setting when one was specified.
127 # An SDK is a directory with the same structure as a real
128 # system, but with only header files and libraries.
129 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000130
131 # Check the standard locations
132 for dir in std_dirs:
133 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000134
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200135 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000136 f = os.path.join(sysroot, dir[1:], filename)
137
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000138 if os.path.exists(f): return []
139
140 # Check the additional directories
141 for dir in paths:
142 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000143
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200144 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000145 f = os.path.join(sysroot, dir[1:], filename)
146
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000147 if os.path.exists(f):
148 return [dir]
149
150 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000151 return None
152
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000153def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000154 result = compiler.find_library_file(std_dirs + paths, libname)
155 if result is None:
156 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000157
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200158 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000159 sysroot = macosx_sdk_root()
160
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000161 # Check whether the found file is in one of the standard directories
162 dirname = os.path.dirname(result)
163 for p in std_dirs:
164 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000165 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000166
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200167 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ned Deily020250f2016-02-25 00:56:38 +1100168 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
169 # libraries with .tbd extensions rather than the normal .dylib
170 # shared libraries installed in /. The Apple compiler tool
171 # chain handles this transparently but it can cause problems
172 # for programs that are being built with an SDK and searching
173 # for specific libraries. Distutils find_library_file() now
174 # knows to also search for and return .tbd files. But callers
175 # of find_library_file need to keep in mind that the base filename
176 # of the returned SDK library file might have a different extension
177 # from that of the library file installed on the running system,
178 # for example:
179 # /Applications/Xcode.app/Contents/Developer/Platforms/
180 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
181 # usr/lib/libedit.tbd
182 # vs
183 # /usr/lib/libedit.dylib
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000184 if os.path.join(sysroot, p[1:]) == dirname:
185 return [ ]
186
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000187 if p == dirname:
188 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000189
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000190 # Otherwise, it must have been in one of the additional directories,
191 # so we have to figure out which one.
192 for p in paths:
193 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000194 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000195
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200196 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000197 if os.path.join(sysroot, p[1:]) == dirname:
198 return [ p ]
199
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000200 if p == dirname:
201 return [p]
202 else:
203 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000204
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000205def module_enabled(extlist, modname):
206 """Returns whether the module 'modname' is present in the list
207 of extensions 'extlist'."""
208 extlist = [ext for ext in extlist if ext.name == modname]
209 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000210
Jack Jansen144ebcc2001-08-05 22:31:19 +0000211def find_module_file(module, dirlist):
212 """Find a module in a set of possible folders. If it is not found
213 return the unadorned filename"""
214 list = find_file(module, [], dirlist)
215 if not list:
216 return module
217 if len(list) > 1:
Vinay Sajipdd917f82016-08-31 08:22:29 +0100218 log.info("WARNING: multiple copies of %s found", module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000219 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000220
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000221class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000222
Guido van Rossumd8faa362007-04-27 19:54:29 +0000223 def __init__(self, dist):
224 build_ext.__init__(self, dist)
225 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400226 self.failed_on_import = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200227 if '-j' in os.environ.get('MAKEFLAGS', ''):
228 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000229
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000230 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000231
232 # Detect which modules should be compiled
doko@ubuntu.comd5537d02013-03-21 13:21:49 -0700233 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000234
235 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000236 extensions = [ext for ext in self.extensions
237 if ext.name not in disabled_module_list]
238 # move ctypes to the end, it depends on other modules
239 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
240 if "_ctypes" in ext_map:
241 ctypes = extensions.pop(ext_map["_ctypes"])
242 extensions.append(ctypes)
243 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000244
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000245 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000246 # with Modules/.
247 srcdir = sysconfig.get_config_var('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000248 if not srcdir:
249 # Maybe running on Windows but not using CYGWIN?
250 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer4d491a52009-02-06 00:27:50 +0000251 srcdir = os.path.abspath(srcdir)
Neil Schemenauer014bf282009-02-05 16:35:45 +0000252 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000253
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000254 # Fix up the paths for scripts, too
255 self.distribution.scripts = [os.path.join(srcdir, filename)
256 for filename in self.distribution.scripts]
257
Christian Heimesaf98da12008-01-27 15:18:18 +0000258 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000259 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100260 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000261
xdegayec0364fc2017-05-27 18:25:03 +0200262 # The sysconfig variables built by makesetup that list the already
263 # built modules and the disabled modules as configured by the Setup
264 # files.
265 sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
266 sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200267
xdegayec0364fc2017-05-27 18:25:03 +0200268 mods_built = []
269 mods_disabled = []
Xavier de Gaye84968b72016-10-29 16:57:20 +0200270 for ext in self.extensions:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000271 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000272 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000273 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000274 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000275 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000276 else:
277 ext.depends = []
278 # re-compile extensions if a header file has been changed
279 ext.depends.extend(headers)
280
xdegayec0364fc2017-05-27 18:25:03 +0200281 # If a module has already been built or has been disabled in the
282 # Setup files, don't build it here.
283 if ext.name in sysconf_built:
284 mods_built.append(ext)
285 if ext.name in sysconf_dis:
286 mods_disabled.append(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000287
xdegayec0364fc2017-05-27 18:25:03 +0200288 mods_configured = mods_built + mods_disabled
289 if mods_configured:
Xavier de Gaye84968b72016-10-29 16:57:20 +0200290 self.extensions = [x for x in self.extensions if x not in
xdegayec0364fc2017-05-27 18:25:03 +0200291 mods_configured]
292 # Remove the shared libraries built by a previous build.
293 for ext in mods_configured:
294 fullpath = self.get_ext_fullpath(ext.name)
295 if os.path.exists(fullpath):
296 os.unlink(fullpath)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000297
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000298 # When you run "make CC=altcc" or something similar, you really want
299 # those environment variables passed into the setup.py phase. Here's
300 # a small set of useful ones.
301 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000302 args = {}
303 # unfortunately, distutils doesn't let us provide separate C and C++
304 # compilers
305 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000306 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
307 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000308 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000309
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000310 build_ext.build_extensions(self)
311
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200312 for ext in self.extensions:
313 self.check_extension_import(ext)
314
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300315 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400316 if self.failed or self.failed_on_import:
317 all_failed = self.failed + self.failed_on_import
318 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000319
320 def print_three_column(lst):
321 lst.sort(key=str.lower)
322 # guarantee zip() doesn't drop anything
323 while len(lst) % 3:
324 lst.append("")
325 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
326 print("%-*s %-*s %-*s" % (longest, e, longest, f,
327 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000328
329 if missing:
330 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400331 print("Python build finished successfully!")
332 print("The necessary bits to build these optional modules were not "
333 "found:")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000334 print_three_column(missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000335 print("To find the necessary bits, look in setup.py in"
336 " detect_modules() for the module's name.")
337 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000338
xdegayec0364fc2017-05-27 18:25:03 +0200339 if mods_built:
340 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200341 print("The following modules found by detect_modules() in"
342 " setup.py, have been")
343 print("built by the Makefile instead, as configured by the"
344 " Setup files:")
xdegayec0364fc2017-05-27 18:25:03 +0200345 print_three_column([ext.name for ext in mods_built])
346 print()
347
348 if mods_disabled:
349 print()
350 print("The following modules found by detect_modules() in"
351 " setup.py have not")
352 print("been built, they are *disabled* in the Setup files:")
353 print_three_column([ext.name for ext in mods_disabled])
354 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200355
Guido van Rossumd8faa362007-04-27 19:54:29 +0000356 if self.failed:
357 failed = self.failed[:]
358 print()
359 print("Failed to build these modules:")
360 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000361 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000362
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400363 if self.failed_on_import:
364 failed = self.failed_on_import[:]
365 print()
366 print("Following modules built successfully"
367 " but were removed because they could not be imported:")
368 print_three_column(failed)
369 print()
370
Christian Heimes61d478c2018-01-27 15:51:38 +0100371 if any('_ssl' in l
372 for l in (missing, self.failed, self.failed_on_import)):
373 print()
374 print("Could not build the ssl module!")
375 print("Python requires an OpenSSL 1.0.2 or 1.1 compatible "
376 "libssl with X509_VERIFY_PARAM_set1_host().")
377 print("LibreSSL 2.6.4 and earlier do not provide the necessary "
378 "APIs, https://github.com/libressl-portable/portable/issues/381")
379 print()
380
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000381 def build_extension(self, ext):
382
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000383 if ext.name == '_ctypes':
384 if not self.configure_ctypes(ext):
Zachary Waref40d4dd2016-09-17 01:25:24 -0500385 self.failed.append(ext.name)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000386 return
387
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000388 try:
389 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000390 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000391 self.announce('WARNING: building of extension "%s" failed: %s' %
392 (ext.name, sys.exc_info()[1]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000393 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000394 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200395
396 def check_extension_import(self, ext):
397 # Don't try to import an extension that has failed to compile
398 if ext.name in self.failed:
399 self.announce(
400 'WARNING: skipping import check for failed build "%s"' %
401 ext.name, level=1)
402 return
403
Jack Jansenf49c6f92001-11-01 14:44:15 +0000404 # Workaround for Mac OS X: The Carbon-based modules cannot be
405 # reliably imported into a command-line Python
406 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000407 self.announce(
408 'WARNING: skipping import check for Carbon-based "%s"' %
409 ext.name)
410 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000411
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200412 if host_platform == 'darwin' and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000413 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000414 # Don't bother doing an import check when an extension was
415 # build with an explicit '-arch' flag on OSX. That's currently
416 # only used to build 32-bit only extensions in a 4-way
417 # universal build and loading 32-bit code into a 64-bit
418 # process will fail.
419 self.announce(
420 'WARNING: skipping import check for "%s"' %
421 ext.name)
422 return
423
Jason Tishler24cf7762002-05-22 16:46:15 +0000424 # Workaround for Cygwin: Cygwin currently has fork issues when many
425 # modules have been imported
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200426 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000427 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
428 % ext.name)
429 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000430 ext_filename = os.path.join(
431 self.build_lib,
432 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000433
434 # If the build directory didn't exist when setup.py was
435 # started, sys.path_importer_cache has a negative result
436 # cached. Clear that cache before trying to import.
437 sys.path_importer_cache.clear()
438
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200439 # Don't try to load extensions for cross builds
440 if cross_compiling:
441 return
442
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400443 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700444 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
445 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000446 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400447 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000448 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400449 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000450 self.announce('*** WARNING: renaming "%s" since importing it'
451 ' failed: %s' % (ext.name, why), level=3)
452 assert not self.inplace
453 basename, tail = os.path.splitext(ext_filename)
454 newname = basename + "_failed" + tail
455 if os.path.exists(newname):
456 os.remove(newname)
457 os.rename(ext_filename, newname)
458
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000459 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000460 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000461 self.announce('*** WARNING: importing extension "%s" '
462 'failed with %s: %s' % (ext.name, exc_type, why),
463 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000464 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000465
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400466 def add_multiarch_paths(self):
467 # Debian/Ubuntu multiarch support.
468 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200469 cc = sysconfig.get_config_var('CC')
470 tmpfile = os.path.join(self.build_temp, 'multiarch')
471 if not os.path.exists(self.build_temp):
472 os.makedirs(self.build_temp)
473 ret = os.system(
474 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
475 multiarch_path_component = ''
476 try:
477 if ret >> 8 == 0:
478 with open(tmpfile) as fp:
479 multiarch_path_component = fp.readline().strip()
480 finally:
481 os.unlink(tmpfile)
482
483 if multiarch_path_component != '':
484 add_dir_to_list(self.compiler.library_dirs,
485 '/usr/lib/' + multiarch_path_component)
486 add_dir_to_list(self.compiler.include_dirs,
487 '/usr/include/' + multiarch_path_component)
488 return
489
Barry Warsaw88e19452011-04-07 10:40:36 -0400490 if not find_executable('dpkg-architecture'):
491 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200492 opt = ''
493 if cross_compiling:
494 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400495 tmpfile = os.path.join(self.build_temp, 'multiarch')
496 if not os.path.exists(self.build_temp):
497 os.makedirs(self.build_temp)
498 ret = os.system(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200499 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
500 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400501 try:
502 if ret >> 8 == 0:
503 with open(tmpfile) as fp:
504 multiarch_path_component = fp.readline().strip()
505 add_dir_to_list(self.compiler.library_dirs,
506 '/usr/lib/' + multiarch_path_component)
507 add_dir_to_list(self.compiler.include_dirs,
508 '/usr/include/' + multiarch_path_component)
509 finally:
510 os.unlink(tmpfile)
511
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200512 def add_gcc_paths(self):
513 gcc = sysconfig.get_config_var('CC')
514 tmpfile = os.path.join(self.build_temp, 'gccpaths')
515 if not os.path.exists(self.build_temp):
516 os.makedirs(self.build_temp)
517 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
518 is_gcc = False
519 in_incdirs = False
520 inc_dirs = []
521 lib_dirs = []
522 try:
523 if ret >> 8 == 0:
524 with open(tmpfile) as fp:
525 for line in fp.readlines():
526 if line.startswith("gcc version"):
527 is_gcc = True
528 elif line.startswith("#include <...>"):
529 in_incdirs = True
530 elif line.startswith("End of search list"):
531 in_incdirs = False
532 elif is_gcc and line.startswith("LIBRARY_PATH"):
533 for d in line.strip().split("=")[1].split(":"):
534 d = os.path.normpath(d)
535 if '/gcc/' not in d:
536 add_dir_to_list(self.compiler.library_dirs,
537 d)
538 elif is_gcc and in_incdirs and '/gcc/' not in line:
539 add_dir_to_list(self.compiler.include_dirs,
540 line.strip())
541 finally:
542 os.unlink(tmpfile)
543
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000544 def detect_modules(self):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000545 # Ensure that /usr/local is always used, but the local build
546 # directories (i.e. '.' and 'Include') must be first. See issue
547 # 10520.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200548 if not cross_compiling:
549 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
550 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200551 # only change this for cross builds for 3.3, issues on Mageia
552 if cross_compiling:
553 self.add_gcc_paths()
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400554 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000555
Brett Cannon516592f2004-12-07 00:42:59 +0000556 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000557 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000558 # We must get the values from the Makefile and not the environment
559 # directly since an inconsistently reproducible issue comes up where
560 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000561 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000562 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000563 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
564 ('LDFLAGS', '-L', self.compiler.library_dirs),
565 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000566 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000567 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000568 # To prevent optparse from raising an exception about any
Skip Montanaroa5c2a512008-10-07 02:51:48 +0000569 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000570 # all double dashes and any dashes followed by a character
571 # that is not for the option we are dealing with.
572 #
573 # Please note that order of the regex is important! We must
574 # strip out double-dashes first so that we don't end up with
575 # substituting "--Long" to "-Long" and thus lead to "ong" being
576 # used for a library directory.
Guido van Rossum04110fb2007-08-24 16:32:05 +0000577 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
578 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000579 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000580 # Make sure that allowing args interspersed with options is
581 # allowed
582 parser.allow_interspersed_args = True
583 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000584 parser.add_option(arg_name, dest="dirs", action="append")
585 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000586 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000587 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000588 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000589
Xavier de Gaye1351c312016-12-14 11:14:33 +0100590 if (not cross_compiling and
591 os.path.normpath(sys.base_prefix) != '/usr' and
592 not sysconfig.get_config_var('PYTHONFRAMEWORK')):
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000593 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
594 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
595 # building a framework with different architectures than
596 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000597 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000598 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000599 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000600 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000601
xdegaye77f51392017-11-25 17:25:30 +0100602 system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
603 system_include_dirs = ['/usr/include']
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000604 # lib_dirs and inc_dirs are used to search for files;
605 # if a file is found in one of those directories, it can
606 # be assumed that no additional -I,-L directives are needed.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200607 if not cross_compiling:
xdegaye77f51392017-11-25 17:25:30 +0100608 lib_dirs = self.compiler.library_dirs + system_lib_dirs
609 inc_dirs = self.compiler.include_dirs + system_include_dirs
Christian Heimesf19529c2012-12-12 12:41:00 +0100610 else:
xdegaye77f51392017-11-25 17:25:30 +0100611 # Add the sysroot paths. 'sysroot' is a compiler option used to
612 # set the logical path of the standard system headers and
613 # libraries.
614 lib_dirs = (self.compiler.library_dirs +
615 sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs))
616 inc_dirs = (self.compiler.include_dirs +
617 sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'),
618 system_include_dirs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000619 exts = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000620 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000621
Brett Cannon4454a1f2005-04-15 20:32:39 +0000622 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000623 with open(config_h) as file:
624 config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000625
Neil Schemenauer014bf282009-02-05 16:35:45 +0000626 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000627
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000628 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200629 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000630 lib_dirs += ['/usr/ccs/lib']
631
Charles-François Natali5739e102012-04-12 19:07:25 +0200632 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200633 if host_platform == 'hp-ux11':
Charles-François Natali5739e102012-04-12 19:07:25 +0200634 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
635
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200636 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +0000637 # This should work on any unixy platform ;-)
638 # If the user has bothered specifying additional -I and -L flags
639 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000640 #
641 # NOTE: using shlex.split would technically be more correct, but
642 # also gives a bootstrap problem. Let's hope nobody uses
643 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000644 cflags, ldflags = sysconfig.get_config_vars(
645 'CFLAGS', 'LDFLAGS')
646 for item in cflags.split():
647 if item.startswith('-I'):
648 inc_dirs.append(item[2:])
649
650 for item in ldflags.split():
651 if item.startswith('-L'):
652 lib_dirs.append(item[2:])
653
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000654 #
655 # The following modules are all pretty straightforward, and compile
656 # on pretty much any POSIXish platform.
657 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000658
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000659 # array objects
660 exts.append( Extension('array', ['arraymodule.c']) )
Martin Panterc9deece2016-02-03 05:19:44 +0000661
Yury Selivanovf23746a2018-01-22 19:11:18 -0500662 # Context Variables
663 exts.append( Extension('_contextvars', ['_contextvarsmodule.c']) )
664
Martin Panterc9deece2016-02-03 05:19:44 +0000665 shared_math = 'Modules/_math.o'
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000666 # complex math library functions
Martin Panterc9deece2016-02-03 05:19:44 +0000667 exts.append( Extension('cmath', ['cmathmodule.c'],
668 extra_objects=[shared_math],
669 depends=['_math.h', shared_math],
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800670 libraries=['m']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000671 # math library functions, e.g. sin()
Martin Panterc9deece2016-02-03 05:19:44 +0000672 exts.append( Extension('math', ['mathmodule.c'],
673 extra_objects=[shared_math],
674 depends=['_math.h', shared_math],
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800675 libraries=['m']) )
Victor Stinnere0be4232011-10-25 13:06:09 +0200676
677 # time libraries: librt may be needed for clock_gettime()
678 time_libs = []
679 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
680 if lib:
681 time_libs.append(lib)
682
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000683 # time operations and variables
Victor Stinner5d272cc2012-03-13 13:35:55 +0100684 exts.append( Extension('time', ['timemodule.c'],
Victor Stinnere0be4232011-10-25 13:06:09 +0200685 libraries=time_libs) )
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800686 # libm is needed by delta_new() that uses round() and by accum() that
687 # uses modf().
Victor Stinnerdef80722016-04-19 15:58:11 +0200688 exts.append( Extension('_datetime', ['_datetimemodule.c'],
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800689 libraries=['m']) )
Christian Heimesfe337bf2008-03-23 21:54:12 +0000690 # random number generator implemented in C
691 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000692 # bisect
693 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000694 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000695 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000696 # C-optimized pickle replacement
697 exts.append( Extension("_pickle", ["_pickle.c"]) )
Collin Winter670e6922007-03-21 02:57:17 +0000698 # atexit
699 exts.append( Extension("atexit", ["atexitmodule.c"]) )
Christian Heimes90540002008-05-08 14:29:10 +0000700 # _json speedups
701 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000702 # Python C API test module
Mark Dickinsona06f44b2009-02-10 16:18:22 +0000703 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
704 depends=['testcapi_long.h']) )
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100705 # Python PEP-3118 (buffer protocol) test module
706 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200707 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
708 exts.append( Extension('_testimportmultiple', ['_testimportmultiple.c']) )
Nick Coghland5cacbb2015-05-23 22:24:10 +1000709 # Test multi-phase extension module init (PEP 489)
710 exts.append( Extension('_testmultiphase', ['_testmultiphase.c']) )
Fred Drake0e474a82007-10-11 18:01:43 +0000711 # profiler (_lsprof is for cProfile.py)
Armin Rigoa871ef22006-02-08 12:53:56 +0000712 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000713 # static Unicode character database
Benjamin Peterson67752312016-09-14 23:53:47 -0700714 exts.append( Extension('unicodedata', ['unicodedata.c'],
715 depends=['unicodedata_db.h', 'unicodename_db.h']) )
Larry Hastings3a907972013-11-23 14:49:22 -0800716 # _opcode module
717 exts.append( Extension('_opcode', ['_opcode.c']) )
INADA Naoki9f2ce252016-10-15 15:39:19 +0900718 # asyncio speedups
719 exts.append( Extension("_asyncio", ["_asynciomodule.c"]) )
Ivan Levkivskyi38928992018-02-18 17:39:43 +0000720 # _abc speedups
721 exts.append( Extension("_abc", ["_abc.c"]) )
Antoine Pitrou94e16962018-01-16 00:27:16 +0100722 # _queue module
723 exts.append( Extension("_queue", ["_queuemodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000724
725 # Modules with some UNIX dependencies -- on by default:
726 # (If you have a really backward UNIX, select and socket may not be
727 # supported...)
728
729 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000730 libs = []
731 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
732 # May be necessary on AIX for flock function
733 libs = ['bsd']
734 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren94f25282010-05-05 19:11:21 +0000735 # pwd(3)
736 exts.append( Extension('pwd', ['pwdmodule.c']) )
737 # grp(3)
738 exts.append( Extension('grp', ['grpmodule.c']) )
739 # spwd, shadow passwords
740 if (config_h_vars.get('HAVE_GETSPNAM', False) or
741 config_h_vars.get('HAVE_GETSPENT', False)):
742 exts.append( Extension('spwd', ['spwdmodule.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000743 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000744 missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000745
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000746 # select(2); not on ancient System V
747 exts.append( Extension('select', ['selectmodule.c']) )
748
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000749 # Fred Drake's interface to the Python parser
750 exts.append( Extension('parser', ['parsermodule.c']) )
751
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000752 # Memory-mapped files (also works on Win32).
Ronald Oussoren94f25282010-05-05 19:11:21 +0000753 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000754
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000755 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000756 # syslog daemon interface
757 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000758
Devin Jeanpierrec5bace22017-09-06 11:15:35 -0700759 # Fuzz tests.
760 exts.append( Extension(
761 '_xxtestfuzz',
762 ['_xxtestfuzz/_xxtestfuzz.c', '_xxtestfuzz/fuzzer.c'])
763 )
764
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000765 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000766 # Here ends the simple stuff. From here on, modules need certain
767 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000768 #
769
770 # Multimedia modules
771 # These don't work for 64-bit platforms!!!
772 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200773 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000774 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000775 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000776 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200777 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800778 # audioop needs libm for floor() in multiple functions.
Victor Stinnerdef80722016-04-19 15:58:11 +0200779 exts.append( Extension('audioop', ['audioop.c'],
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800780 libraries=['m']) )
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000781
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000782 # readline
Tarek Ziadé36797272010-07-22 12:50:05 +0000783 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000784 readline_termcap_library = ""
785 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200786 # Cannot use os.popen here in py3k.
787 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
788 if not os.path.exists(self.build_temp):
789 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000790 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200791 if do_readline:
792 if cross_compiling:
793 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
794 % (sysconfig.get_config_var('READELF'),
795 do_readline, tmpfile))
796 elif find_executable('ldd'):
797 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
798 else:
799 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200800 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000801 with open(tmpfile) as fp:
802 for ln in fp:
803 if 'curses' in ln:
804 readline_termcap_library = re.sub(
805 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
806 ).rstrip()
807 break
808 # termcap interface split out from ncurses
809 if 'tinfo' in ln:
810 readline_termcap_library = 'tinfo'
811 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200812 if os.path.exists(tmpfile):
813 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000814 # Issue 7384: If readline is already linked against curses,
815 # use the same library for the readline and curses modules.
816 if 'curses' in readline_termcap_library:
817 curses_library = readline_termcap_library
Tarek Ziadé36797272010-07-22 12:50:05 +0000818 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000819 curses_library = 'ncursesw'
Tarek Ziadé36797272010-07-22 12:50:05 +0000820 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000821 curses_library = 'ncurses'
Tarek Ziadé36797272010-07-22 12:50:05 +0000822 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000823 curses_library = 'curses'
824
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200825 if host_platform == 'darwin':
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000826 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000827 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -0700828 if (dep_target and
829 (tuple(int(n) for n in dep_target.split('.')[0:2])
830 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +0000831 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000832 if os_release < 9:
833 # MacOSX 10.4 has a broken readline. Don't try to build
834 # the readline module unless the user has installed a fixed
835 # readline package
836 if find_file('readline/rlconf.h', inc_dirs, []) is None:
837 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000838 if do_readline:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200839 if host_platform == 'darwin' and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000840 # In every directory on the search path search for a dynamic
841 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000842 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +0000843 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000844 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845 readline_extra_link_args = ('-Wl,-search_paths_first',)
846 else:
847 readline_extra_link_args = ()
848
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000849 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000850 if readline_termcap_library:
851 pass # Issue 7384: Already linked against curses or tinfo.
852 elif curses_library:
853 readline_libs.append(curses_library)
Tarek Ziadé36797272010-07-22 12:50:05 +0000854 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000855 ['/usr/lib/termcap'],
856 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000857 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000858 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000859 library_dirs=['/usr/lib/termcap'],
Thomas Wouters477c8d52006-05-27 19:21:47 +0000860 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000861 libraries=readline_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000862 else:
863 missing.append('readline')
864
Ronald Oussoren94f25282010-05-05 19:11:21 +0000865 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000866
Tarek Ziadé36797272010-07-22 12:50:05 +0000867 if self.compiler.find_library_file(lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000868 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000869 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000870 libs = []
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000871 exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000872
Skip Montanaroba9e9782003-03-20 23:34:22 +0000873 # CSV files
874 exts.append( Extension('_csv', ['_csv.c']) )
875
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000876 # POSIX subprocess module helper.
877 exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
878
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000879 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000880 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000881 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000882 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +0100883 ssl_ext, hashlib_ext = self._detect_openssl(inc_dirs, lib_dirs)
884 if ssl_ext is not None:
885 exts.append(ssl_ext)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000886 else:
887 missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +0100888 if hashlib_ext is not None:
889 exts.append(hashlib_ext)
890 else:
891 missing.append('_hashlib')
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000892
Antoine Pitrou019ff192012-05-16 16:41:26 +0200893 # We always compile these even when OpenSSL is available (issue #14693).
Victor Stinner8c663fd2017-11-08 14:44:44 -0800894 # It's harmless and the object code is tiny (40-50 KiB per module,
Antoine Pitrou019ff192012-05-16 16:41:26 +0200895 # only loaded when actually used).
896 exts.append( Extension('_sha256', ['sha256module.c'],
897 depends=['hashlib.h']) )
898 exts.append( Extension('_sha512', ['sha512module.c'],
899 depends=['hashlib.h']) )
900 exts.append( Extension('_md5', ['md5module.c'],
901 depends=['hashlib.h']) )
902 exts.append( Extension('_sha1', ['sha1module.c'],
903 depends=['hashlib.h']) )
Gregory P. Smith2f21eb32007-09-09 06:44:34 +0000904
Christian Heimes3c397e42016-09-06 22:35:14 +0200905 blake2_deps = glob(os.path.join(os.getcwd(), srcdir,
906 'Modules/_blake2/impl/*'))
Christian Heimes121b9482016-09-06 22:03:25 +0200907 blake2_deps.append('hashlib.h')
908
Christian Heimes121b9482016-09-06 22:03:25 +0200909 exts.append( Extension('_blake2',
910 ['_blake2/blake2module.c',
911 '_blake2/blake2b_impl.c',
912 '_blake2/blake2s_impl.c'],
Christian Heimes121b9482016-09-06 22:03:25 +0200913 depends=blake2_deps) )
914
Christian Heimes6fe2a752016-09-07 11:58:24 +0200915 sha3_deps = glob(os.path.join(os.getcwd(), srcdir,
916 'Modules/_sha3/kcp/*'))
917 sha3_deps.append('hashlib.h')
918 exts.append( Extension('_sha3',
919 ['_sha3/sha3module.c'],
920 depends=sha3_deps))
921
Georg Brandl489cb4f2009-07-11 10:08:49 +0000922 # Modules that provide persistent dictionary-like semantics. You will
923 # probably want to arrange for at least one of them to be available on
924 # your machine, though none are defined by default because of library
925 # dependencies. The Python module dbm/__init__.py provides an
926 # implementation independent wrapper for these; dbm/dumb.py provides
927 # similar functionality (but slower of course) implemented in Python.
928
929 # Sleepycat^WOracle Berkeley DB interface.
930 # http://www.oracle.com/database/berkeley-db/db/index.html
931 #
932 # This requires the Sleepycat^WOracle DB code. The supported versions
933 # are set below. Visit the URL above to download
934 # a release. Most open source OSes come with one or more
935 # versions of BerkeleyDB already installed.
936
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +0200937 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000938 min_db_ver = (3, 3)
939 db_setup_debug = False # verbose debug prints from this script?
940
941 def allow_db_ver(db_ver):
942 """Returns a boolean if the given BerkeleyDB version is acceptable.
943
944 Args:
945 db_ver: A tuple of the version to verify.
946 """
947 if not (min_db_ver <= db_ver <= max_db_ver):
948 return False
949 return True
950
951 def gen_db_minor_ver_nums(major):
952 if major == 4:
953 for x in range(max_db_ver[1]+1):
954 if allow_db_ver((4, x)):
955 yield x
956 elif major == 3:
957 for x in (3,):
958 if allow_db_ver((3, x)):
959 yield x
960 else:
961 raise ValueError("unknown major BerkeleyDB version", major)
962
963 # construct a list of paths to look for the header file in on
964 # top of the normal inc_dirs.
965 db_inc_paths = [
966 '/usr/include/db4',
967 '/usr/local/include/db4',
968 '/opt/sfw/include/db4',
969 '/usr/include/db3',
970 '/usr/local/include/db3',
971 '/opt/sfw/include/db3',
972 # Fink defaults (http://fink.sourceforge.net/)
973 '/sw/include/db4',
974 '/sw/include/db3',
975 ]
976 # 4.x minor number specific paths
977 for x in gen_db_minor_ver_nums(4):
978 db_inc_paths.append('/usr/include/db4%d' % x)
979 db_inc_paths.append('/usr/include/db4.%d' % x)
980 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
981 db_inc_paths.append('/usr/local/include/db4%d' % x)
982 db_inc_paths.append('/pkg/db-4.%d/include' % x)
983 db_inc_paths.append('/opt/db-4.%d/include' % x)
984 # MacPorts default (http://www.macports.org/)
985 db_inc_paths.append('/opt/local/include/db4%d' % x)
986 # 3.x minor number specific paths
987 for x in gen_db_minor_ver_nums(3):
988 db_inc_paths.append('/usr/include/db3%d' % x)
989 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
990 db_inc_paths.append('/usr/local/include/db3%d' % x)
991 db_inc_paths.append('/pkg/db-3.%d/include' % x)
992 db_inc_paths.append('/opt/db-3.%d/include' % x)
993
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200994 if cross_compiling:
995 db_inc_paths = []
996
Georg Brandl489cb4f2009-07-11 10:08:49 +0000997 # Add some common subdirectories for Sleepycat DB to the list,
998 # based on the standard include directories. This way DB3/4 gets
999 # picked up when it is installed in a non-standard prefix and
1000 # the user has added that prefix into inc_dirs.
1001 std_variants = []
1002 for dn in inc_dirs:
1003 std_variants.append(os.path.join(dn, 'db3'))
1004 std_variants.append(os.path.join(dn, 'db4'))
1005 for x in gen_db_minor_ver_nums(4):
1006 std_variants.append(os.path.join(dn, "db4%d"%x))
1007 std_variants.append(os.path.join(dn, "db4.%d"%x))
1008 for x in gen_db_minor_ver_nums(3):
1009 std_variants.append(os.path.join(dn, "db3%d"%x))
1010 std_variants.append(os.path.join(dn, "db3.%d"%x))
1011
1012 db_inc_paths = std_variants + db_inc_paths
1013 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1014
1015 db_ver_inc_map = {}
1016
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001017 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001018 sysroot = macosx_sdk_root()
1019
Georg Brandl489cb4f2009-07-11 10:08:49 +00001020 class db_found(Exception): pass
1021 try:
1022 # See whether there is a Sleepycat header in the standard
1023 # search path.
1024 for d in inc_dirs + db_inc_paths:
1025 f = os.path.join(d, "db.h")
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001026 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001027 f = os.path.join(sysroot, d[1:], "db.h")
1028
Georg Brandl489cb4f2009-07-11 10:08:49 +00001029 if db_setup_debug: print("db: looking for db.h in", f)
1030 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001031 with open(f, 'rb') as file:
1032 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001033 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001034 if m:
1035 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001036 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001037 db_minor = int(m.group(1))
1038 db_ver = (db_major, db_minor)
1039
1040 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1041 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001042 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001043 db_patch = int(m.group(1))
1044 if db_patch < 21:
1045 print("db.h:", db_ver, "patch", db_patch,
1046 "being ignored (4.6.x must be >= 4.6.21)")
1047 continue
1048
1049 if ( (db_ver not in db_ver_inc_map) and
1050 allow_db_ver(db_ver) ):
1051 # save the include directory with the db.h version
1052 # (first occurrence only)
1053 db_ver_inc_map[db_ver] = d
1054 if db_setup_debug:
1055 print("db.h: found", db_ver, "in", d)
1056 else:
1057 # we already found a header for this library version
1058 if db_setup_debug: print("db.h: ignoring", d)
1059 else:
1060 # ignore this header, it didn't contain a version number
1061 if db_setup_debug:
1062 print("db.h: no version number version in", d)
1063
1064 db_found_vers = list(db_ver_inc_map.keys())
1065 db_found_vers.sort()
1066
1067 while db_found_vers:
1068 db_ver = db_found_vers.pop()
1069 db_incdir = db_ver_inc_map[db_ver]
1070
1071 # check lib directories parallel to the location of the header
1072 db_dirs_to_check = [
1073 db_incdir.replace("include", 'lib64'),
1074 db_incdir.replace("include", 'lib'),
1075 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001076
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001077 if host_platform != 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001078 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1079
1080 else:
1081 # Same as other branch, but takes OSX SDK into account
1082 tmp = []
1083 for dn in db_dirs_to_check:
1084 if is_macosx_sdk_path(dn):
1085 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1086 tmp.append(dn)
1087 else:
1088 if os.path.isdir(dn):
1089 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001090 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001091
1092 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001093
Ezio Melotti42da6632011-03-15 05:18:48 +02001094 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001095 # XXX should we -ever- look for a dbX name? Do any
1096 # systems really not name their library by version and
1097 # symlink to more general names?
1098 for dblib in (('db-%d.%d' % db_ver),
1099 ('db%d%d' % db_ver),
1100 ('db%d' % db_ver[0])):
1101 dblib_file = self.compiler.find_library_file(
1102 db_dirs_to_check + lib_dirs, dblib )
1103 if dblib_file:
1104 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1105 raise db_found
1106 else:
1107 if db_setup_debug: print("db lib: ", dblib, "not found")
1108
1109 except db_found:
1110 if db_setup_debug:
1111 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1112 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001113 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001114 # Only add the found library and include directories if they aren't
1115 # already being searched. This avoids an explicit runtime library
1116 # dependency.
1117 if db_incdir in inc_dirs:
1118 db_incs = None
1119 else:
1120 db_incs = [db_incdir]
1121 if dblib_dir[0] in lib_dirs:
1122 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001123 else:
1124 if db_setup_debug: print("db: no appropriate library found")
1125 db_incs = None
1126 dblibs = []
1127 dblib_dir = None
1128
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001129 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001130 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001131
1132 # We hunt for #define SQLITE_VERSION "n.n.n"
1133 # We need to find >= sqlite version 3.0.8
1134 sqlite_incdir = sqlite_libdir = None
1135 sqlite_inc_paths = [ '/usr/include',
1136 '/usr/include/sqlite',
1137 '/usr/include/sqlite3',
1138 '/usr/local/include',
1139 '/usr/local/include/sqlite',
1140 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001141 ]
1142 if cross_compiling:
1143 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001144 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1145 MIN_SQLITE_VERSION = ".".join([str(x)
1146 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001147
1148 # Scan the default include directories before the SQLite specific
1149 # ones. This allows one to override the copy of sqlite on OSX,
1150 # where /usr/include contains an old version of sqlite.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001151 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001152 sysroot = macosx_sdk_root()
1153
Ned Deily9b635832012-08-05 15:13:33 -07001154 for d_ in inc_dirs + sqlite_inc_paths:
1155 d = d_
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001156 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001157 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001158
Ned Deily9b635832012-08-05 15:13:33 -07001159 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001160 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001161 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001162 with open(f) as file:
1163 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001164 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001165 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001166 if m:
1167 sqlite_version = m.group(1)
1168 sqlite_version_tuple = tuple([int(x)
1169 for x in sqlite_version.split(".")])
1170 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1171 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001172 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001173 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001174 sqlite_incdir = d
1175 break
1176 else:
1177 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001178 print("%s: version %d is too old, need >= %s"%(d,
1179 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001180 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001181 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001182
1183 if sqlite_incdir:
1184 sqlite_dirs_to_check = [
1185 os.path.join(sqlite_incdir, '..', 'lib64'),
1186 os.path.join(sqlite_incdir, '..', 'lib'),
1187 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1188 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1189 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001190 sqlite_libfile = self.compiler.find_library_file(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001191 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001192 if sqlite_libfile:
1193 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001194
1195 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001196 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001197 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001198 '_sqlite/cursor.c',
1199 '_sqlite/microprotocols.c',
1200 '_sqlite/module.c',
1201 '_sqlite/prepare_protocol.c',
1202 '_sqlite/row.c',
1203 '_sqlite/statement.c',
1204 '_sqlite/util.c', ]
1205
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001206 sqlite_defines = []
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001207 if host_platform != "win32":
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001208 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1209 else:
1210 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1211
Benjamin Peterson076ed002010-10-31 17:11:02 +00001212 # Enable support for loadable extensions in the sqlite3 module
1213 # if --enable-loadable-sqlite-extensions configure option is used.
1214 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1215 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001216
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001217 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +00001218 # In every directory on the search path search for a dynamic
1219 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001220 # for dynamic libraries on the entire path.
1221 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001222 # before the dynamic library in /usr/lib.
1223 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1224 else:
1225 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001226
Brett Cannonc5011fe2011-06-06 20:09:10 -07001227 include_dirs = ["Modules/_sqlite"]
1228 # Only include the directory where sqlite was found if it does
1229 # not already exist in set include directories, otherwise you
1230 # can end up with a bad search path order.
1231 if sqlite_incdir not in self.compiler.include_dirs:
1232 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001233 # avoid a runtime library path for a system library dir
1234 if sqlite_libdir and sqlite_libdir[0] in lib_dirs:
1235 sqlite_libdir = None
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001236 exts.append(Extension('_sqlite3', sqlite_srcs,
1237 define_macros=sqlite_defines,
Brett Cannonc5011fe2011-06-06 20:09:10 -07001238 include_dirs=include_dirs,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001239 library_dirs=sqlite_libdir,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001240 extra_link_args=sqlite_extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001241 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001242 else:
1243 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001244
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001245 dbm_setup_debug = False # verbose debug prints from this script?
Benjamin Petersond78735d2010-01-01 16:04:23 +00001246 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001247 # The standard Unix dbm module:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001248 if host_platform not in ['cygwin']:
Matthias Klose55708cc2009-04-30 08:06:49 +00001249 config_args = [arg.strip("'")
1250 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersond78735d2010-01-01 16:04:23 +00001251 dbm_args = [arg for arg in config_args
Matthias Klose55708cc2009-04-30 08:06:49 +00001252 if arg.startswith('--with-dbmliborder=')]
1253 if dbm_args:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001254 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001255 else:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001256 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001257 dbmext = None
1258 for cand in dbm_order:
1259 if cand == "ndbm":
1260 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan50f147a2012-06-17 18:27:11 +10001261 # Some systems have -lndbm, others have -lgdbm_compat,
1262 # others don't have either
Tarek Ziadé36797272010-07-22 12:50:05 +00001263 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001264 'ndbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001265 ndbm_libs = ['ndbm']
Nick Coghlan50f147a2012-06-17 18:27:11 +10001266 elif self.compiler.find_library_file(lib_dirs,
1267 'gdbm_compat'):
1268 ndbm_libs = ['gdbm_compat']
Matthias Klose55708cc2009-04-30 08:06:49 +00001269 else:
1270 ndbm_libs = []
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001271 if dbm_setup_debug: print("building dbm using ndbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001272 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1273 define_macros=[
1274 ('HAVE_NDBM_H',None),
1275 ],
1276 libraries=ndbm_libs)
1277 break
1278
1279 elif cand == "gdbm":
Tarek Ziadé36797272010-07-22 12:50:05 +00001280 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001281 gdbm_libs = ['gdbm']
Tarek Ziadé36797272010-07-22 12:50:05 +00001282 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001283 'gdbm_compat'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001284 gdbm_libs.append('gdbm_compat')
1285 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001286 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001287 dbmext = Extension(
1288 '_dbm', ['_dbmmodule.c'],
1289 define_macros=[
1290 ('HAVE_GDBM_NDBM_H', None),
1291 ],
1292 libraries = gdbm_libs)
1293 break
1294 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001295 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001296 dbmext = Extension(
1297 '_dbm', ['_dbmmodule.c'],
1298 define_macros=[
1299 ('HAVE_GDBM_DASH_NDBM_H', None),
1300 ],
1301 libraries = gdbm_libs)
1302 break
Georg Brandl489cb4f2009-07-11 10:08:49 +00001303 elif cand == "bdb":
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001304 if dblibs:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001305 if dbm_setup_debug: print("building dbm using bdb")
Georg Brandl489cb4f2009-07-11 10:08:49 +00001306 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1307 library_dirs=dblib_dir,
1308 runtime_library_dirs=dblib_dir,
1309 include_dirs=db_incs,
1310 define_macros=[
1311 ('HAVE_BERKDB_H', None),
1312 ('DB_DBM_HSEARCH', None),
1313 ],
1314 libraries=dblibs)
Matthias Klose55708cc2009-04-30 08:06:49 +00001315 break
1316 if dbmext is not None:
1317 exts.append(dbmext)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001318 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001319 missing.append('_dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001320
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001321 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001322 if ('gdbm' in dbm_order and
Tarek Ziadé36797272010-07-22 12:50:05 +00001323 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001324 exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001325 libraries = ['gdbm'] ) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001326 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001327 missing.append('_gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001328
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001329 # Unix-only modules
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001330 if host_platform != 'win32':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001331 # Steen Lumholt's termios module
1332 exts.append( Extension('termios', ['termios.c']) )
1333 # Jeremy Hylton's rlimit interface
Antoine Pitrou6103ab12009-10-24 20:11:21 +00001334 exts.append( Extension('resource', ['resource.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001335 else:
Christian Heimes29a7df72018-01-26 23:28:46 +01001336 missing.extend(['resource', 'termios'])
1337
1338 nis = self._detect_nis(inc_dirs, lib_dirs)
1339 if nis is not None:
1340 exts.append(nis)
1341 else:
1342 missing.append('nis')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001343
Skip Montanaro72092942004-02-07 12:50:19 +00001344 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001345 # provided by the ncurses library.
Victor Stinneraa35b002011-11-29 00:08:12 +01001346 curses_defines = []
Victor Stinner756c6ec2011-11-27 00:19:53 +01001347 curses_includes = []
Victor Stinneraa35b002011-11-29 00:08:12 +01001348 panel_library = 'panel'
1349 if curses_library == 'ncursesw':
1350 curses_defines.append(('HAVE_NCURSESW', '1'))
Xavier de Gayee13c3202016-12-13 16:04:14 +01001351 if not cross_compiling:
1352 curses_includes.append('/usr/include/ncursesw')
Victor Stinneraa35b002011-11-29 00:08:12 +01001353 # Bug 1464056: If _curses.so links with ncursesw,
1354 # _curses_panel.so must link with panelw.
1355 panel_library = 'panelw'
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001356 if host_platform == 'darwin':
Ned Deily69192232012-06-20 23:47:14 -07001357 # On OS X, there is no separate /usr/lib/libncursesw nor
1358 # libpanelw. If we are here, we found a locally-supplied
Mike53f7a7c2017-12-14 14:04:53 +03001359 # version of libncursesw. There should also be a
Ned Deily69192232012-06-20 23:47:14 -07001360 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1361 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1362 # ncurses wide char support
1363 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001364 elif host_platform == 'darwin' and curses_library == 'ncurses':
Ned Deily69192232012-06-20 23:47:14 -07001365 # Building with the system-suppied combined libncurses/libpanel
1366 curses_defines.append(('HAVE_NCURSESW', '1'))
1367 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Victor Stinneraa35b002011-11-29 00:08:12 +01001368
Stefan Krah095b2732010-06-08 13:41:44 +00001369 if curses_library.startswith('ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001370 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001371 exts.append( Extension('_curses', ['_cursesmodule.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001372 include_dirs=curses_includes,
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001373 define_macros=curses_defines,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001374 libraries = curses_libs) )
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001375 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001376 # OSX has an old Berkeley curses, not good enough for
1377 # the _curses module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001378 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001379 curses_libs = ['curses', 'terminfo']
Tarek Ziadé36797272010-07-22 12:50:05 +00001380 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001381 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001382 else:
1383 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001384
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001385 exts.append( Extension('_curses', ['_cursesmodule.c'],
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001386 define_macros=curses_defines,
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001387 libraries = curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001388 else:
1389 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001390
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001391 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001392 if (module_enabled(exts, '_curses') and
Tarek Ziadé36797272010-07-22 12:50:05 +00001393 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001394 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001395 include_dirs=curses_includes,
Ned Deily69192232012-06-20 23:47:14 -07001396 define_macros=curses_defines,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001397 libraries = [panel_library] + curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001398 else:
1399 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001400
Barry Warsaw259b1e12002-08-13 20:09:26 +00001401 # Andrew Kuchling's zlib module. Note that some versions of zlib
1402 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1403 # http://www.cert.org/advisories/CA-2002-07.html
1404 #
1405 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1406 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1407 # now, we still accept 1.1.3, because we think it's difficult to
1408 # exploit this in Python, and we'd rather make it RedHat's problem
1409 # than our problem <wink>.
1410 #
1411 # You can upgrade zlib to version 1.1.4 yourself by going to
1412 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001413 zlib_inc = find_file('zlib.h', [], inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001414 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001415 if zlib_inc is not None:
1416 zlib_h = zlib_inc[0] + '/zlib.h'
1417 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001418 version_req = '"1.1.3"'
Ned Deily507c5912013-10-18 21:32:00 -07001419 if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
1420 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001421 with open(zlib_h) as fp:
1422 while 1:
1423 line = fp.readline()
1424 if not line:
1425 break
1426 if line.startswith('#define ZLIB_VERSION'):
1427 version = line.split()[2]
1428 break
Guido van Rossume6970912001-04-15 15:16:12 +00001429 if version >= version_req:
Tarek Ziadé36797272010-07-22 12:50:05 +00001430 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001431 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001432 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1433 else:
1434 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001435 exts.append( Extension('zlib', ['zlibmodule.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001436 libraries = ['z'],
1437 extra_link_args = zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001438 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001439 else:
1440 missing.append('zlib')
1441 else:
1442 missing.append('zlib')
1443 else:
1444 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001445
Christian Heimes1dc54002008-03-24 02:19:29 +00001446 # Helper module for various ascii-encoders. Uses zlib for an optimized
1447 # crc32 if we have it. Otherwise binascii uses its own.
1448 if have_zlib:
1449 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1450 libraries = ['z']
1451 extra_link_args = zlib_extra_link_args
1452 else:
1453 extra_compile_args = []
1454 libraries = []
1455 extra_link_args = []
1456 exts.append( Extension('binascii', ['binascii.c'],
1457 extra_compile_args = extra_compile_args,
1458 libraries = libraries,
1459 extra_link_args = extra_link_args) )
1460
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001461 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001462 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001463 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001464 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1465 else:
1466 bz2_extra_link_args = ()
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001467 exts.append( Extension('_bz2', ['_bz2module.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001468 libraries = ['bz2'],
1469 extra_link_args = bz2_extra_link_args) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001470 else:
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001471 missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001472
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001473 # LZMA compression support.
1474 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1475 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1476 libraries = ['lzma']) )
1477 else:
1478 missing.append('_lzma')
1479
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001480 # Interface to the Expat XML parser
1481 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001482 # Expat was written by James Clark and is now maintained by a group of
1483 # developers on SourceForge; see www.libexpat.org for more information.
1484 # The pyexpat module was written by Paul Prescod after a prototype by
1485 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1486 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001487 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001488 #
1489 # More information on Expat can be found at www.libexpat.org.
1490 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001491 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1492 expat_inc = []
1493 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001494 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001495 expat_lib = ['expat']
1496 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001497 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001498 else:
1499 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1500 define_macros = [
1501 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001502 # bpo-30947: Python uses best available entropy sources to
1503 # call XML_SetHashSalt(), expat entropy sources are not needed
1504 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001505 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001506 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001507 expat_lib = []
1508 expat_sources = ['expat/xmlparse.c',
1509 'expat/xmlrole.c',
1510 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001511 expat_depends = ['expat/ascii.h',
1512 'expat/asciitab.h',
1513 'expat/expat.h',
1514 'expat/expat_config.h',
1515 'expat/expat_external.h',
1516 'expat/internal.h',
1517 'expat/latin1tab.h',
1518 'expat/utf8tab.h',
1519 'expat/xmlrole.h',
1520 'expat/xmltok.h',
1521 'expat/xmltok_impl.h'
1522 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001523
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001524 cc = sysconfig.get_config_var('CC').split()[0]
1525 ret = os.system(
1526 '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc)
1527 if ret >> 8 == 0:
1528 extra_compile_args.append('-Wno-implicit-fallthrough')
1529
Fred Drake2d59a492003-10-21 15:41:15 +00001530 exts.append(Extension('pyexpat',
1531 define_macros = define_macros,
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001532 extra_compile_args = extra_compile_args,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001533 include_dirs = expat_inc,
1534 libraries = expat_lib,
Christian Heimesd489c7a2013-02-09 17:02:06 +01001535 sources = ['pyexpat.c'] + expat_sources,
1536 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001537 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001538
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001539 # Fredrik Lundh's cElementTree module. Note that this also
1540 # uses expat (via the CAPI hook in pyexpat).
1541
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001543 define_macros.append(('USE_PYEXPAT_CAPI', None))
1544 exts.append(Extension('_elementtree',
1545 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001546 include_dirs = expat_inc,
1547 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001548 sources = ['_elementtree.c'],
Christian Heimesd489c7a2013-02-09 17:02:06 +01001549 depends = ['pyexpat.c'] + expat_sources +
1550 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001551 ))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001552 else:
1553 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001554
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001555 # Hye-Shik Chang's CJKCodecs modules.
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001556 exts.append(Extension('_multibytecodec',
1557 ['cjkcodecs/multibytecodec.c']))
1558 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1559 exts.append(Extension('_codecs_%s' % loc,
1560 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001561
Stefan Krah1919b7e2012-03-21 18:25:23 +01001562 # Stefan Krah's _decimal module
1563 exts.append(self._decimal_ext())
1564
Thomas Hellercf567c12006-03-08 19:51:58 +00001565 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001566 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001567
Benjamin Petersone711caf2008-06-11 16:44:04 +00001568 # Richard Oudkerk's multiprocessing module
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001569 if host_platform == 'win32': # Windows
Benjamin Petersone711caf2008-06-11 16:44:04 +00001570 macros = dict()
1571 libraries = ['ws2_32']
1572
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001573 elif host_platform == 'darwin': # Mac OSX
Benjamin Peterson965ce872009-04-05 21:24:58 +00001574 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001575 libraries = []
1576
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001577 elif host_platform == 'cygwin': # Cygwin
Benjamin Peterson965ce872009-04-05 21:24:58 +00001578 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001579 libraries = []
Benjamin Peterson41181742008-07-02 20:22:54 +00001580
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001581 elif host_platform.startswith('openbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001582 macros = dict()
Benjamin Petersone5384b02008-10-04 22:00:42 +00001583 libraries = []
1584
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001585 elif host_platform.startswith('netbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001586 macros = dict()
Jesse Noller32d68c22009-03-31 18:48:42 +00001587 libraries = []
1588
Benjamin Petersone711caf2008-06-11 16:44:04 +00001589 else: # Linux and other unices
Benjamin Peterson965ce872009-04-05 21:24:58 +00001590 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001591 libraries = ['rt']
1592
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001593 if host_platform == 'win32':
Benjamin Petersone711caf2008-06-11 16:44:04 +00001594 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1595 '_multiprocessing/semaphore.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001596 ]
1597
1598 else:
1599 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001600 ]
Mark Dickinsona614f042009-11-28 12:48:43 +00001601 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1602 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001603 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1604
Antoine Pitroua6a4dc82017-09-07 18:56:24 +02001605 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1606 define_macros=list(macros.items()),
1607 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001608 # End multiprocessing
Guido van Rossuma9e20242007-03-08 00:43:48 +00001609
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001610 # Platform-specific libraries
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001611 if host_platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001612 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 else:
1614 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001615
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001616 if host_platform == 'darwin':
Benjamin Petersonebacd262008-05-29 21:09:51 +00001617 exts.append(
Ronald Oussoren84151202010-04-18 20:46:11 +00001618 Extension('_scproxy', ['_scproxy.c'],
1619 extra_link_args=[
1620 '-framework', 'SystemConfiguration',
1621 '-framework', 'CoreFoundation',
1622 ]))
Benjamin Petersonebacd262008-05-29 21:09:51 +00001623
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001624 self.extensions.extend(exts)
1625
1626 # Call the method for detecting whether _tkinter can be compiled
1627 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001628
Guido van Rossumd8faa362007-04-27 19:54:29 +00001629 if '_tkinter' not in [e.name for e in self.extensions]:
1630 missing.append('_tkinter')
1631
Antoine Pitroua106aec2017-09-28 23:03:06 +02001632 # Build the _uuid module if possible
1633 uuid_incs = find_file("uuid.h", inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001634 if uuid_incs is not None:
Antoine Pitroua106aec2017-09-28 23:03:06 +02001635 if self.compiler.find_library_file(lib_dirs, 'uuid'):
1636 uuid_libs = ['uuid']
1637 else:
1638 uuid_libs = []
Antoine Pitroua106aec2017-09-28 23:03:06 +02001639 self.extensions.append(Extension('_uuid', ['_uuidmodule.c'],
1640 libraries=uuid_libs,
1641 include_dirs=uuid_incs))
1642 else:
1643 missing.append('_uuid')
1644
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001645## # Uncomment these lines if you want to play with xxmodule.c
1646## ext = Extension('xx', ['xxmodule.c'])
1647## self.extensions.append(ext)
1648
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001649 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001650 ext = Extension('xxlimited', ['xxlimited.c'],
Benjamin Peterson24ac8772015-06-03 00:04:46 -05001651 define_macros=[('Py_LIMITED_API', '0x03050000')])
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001652 self.extensions.append(ext)
1653
Guido van Rossumd8faa362007-04-27 19:54:29 +00001654 return missing
1655
Ned Deilyd819b932013-09-06 01:07:05 -07001656 def detect_tkinter_explicitly(self):
1657 # Build _tkinter using explicit locations for Tcl/Tk.
1658 #
1659 # This is enabled when both arguments are given to ./configure:
1660 #
1661 # --with-tcltk-includes="-I/path/to/tclincludes \
1662 # -I/path/to/tkincludes"
1663 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1664 # -L/path/to/tklibs -ltkm.n"
1665 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001666 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001667 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1668 #
1669 # This can be useful for building and testing tkinter with multiple
1670 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1671 # build of Tcl so you need to specify both arguments and use care when
1672 # overriding.
1673
1674 # The _TCLTK variables are created in the Makefile sharedmods target.
1675 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1676 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1677 if not (tcltk_includes and tcltk_libs):
1678 # Resume default configuration search.
1679 return 0
1680
1681 extra_compile_args = tcltk_includes.split()
1682 extra_link_args = tcltk_libs.split()
1683 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1684 define_macros=[('WITH_APPINIT', 1)],
1685 extra_compile_args = extra_compile_args,
1686 extra_link_args = extra_link_args,
1687 )
1688 self.extensions.append(ext)
1689 return 1
1690
Jack Jansen0b06be72002-06-21 14:48:38 +00001691 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1692 # The _tkinter module, using frameworks. Since frameworks are quite
1693 # different the UNIX search logic is not sharable.
1694 from os.path import join, exists
1695 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001696 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001697 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001698 join(os.getenv('HOME'), '/Library/Frameworks')
1699 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001700
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001701 sysroot = macosx_sdk_root()
1702
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001703 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001704 # bundles.
1705 # XXX distutils should support -F!
1706 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001707 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001708
1709
Jack Jansen0b06be72002-06-21 14:48:38 +00001710 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001711 if is_macosx_sdk_path(F):
1712 if not exists(join(sysroot, F[1:], fw + '.framework')):
1713 break
1714 else:
1715 if not exists(join(F, fw + '.framework')):
1716 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001717 else:
1718 # ok, F is now directory with both frameworks. Continure
1719 # building
1720 break
1721 else:
1722 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1723 # will now resume.
1724 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001725
Jack Jansen0b06be72002-06-21 14:48:38 +00001726 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1727 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001728 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001729 #
1730 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001731 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001732 for fw in ('Tcl', 'Tk')
1733 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001734 ]
1735
Tim Peters2c60f7a2003-01-29 03:49:43 +00001736 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001737 # complicated search, this is a hard-coded path. It could bail out
1738 # if X11 libs are not found...
1739 include_dirs.append('/usr/X11R6/include')
1740 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1741
Georg Brandlfcaf9102008-07-16 02:17:56 +00001742 # All existing framework builds of Tcl/Tk don't support 64-bit
1743 # architectures.
1744 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001745 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001746
Ronald Oussorend097efe2009-09-15 19:07:58 +00001747 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1748 if not os.path.exists(self.build_temp):
1749 os.makedirs(self.build_temp)
1750
1751 # Note: cannot use os.popen or subprocess here, that
1752 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001753 if is_macosx_sdk_path(F):
1754 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1755 else:
1756 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001757
Brett Cannon9f5db072010-10-29 20:19:27 +00001758 with open(tmpfile) as fp:
1759 detected_archs = []
1760 for ln in fp:
1761 a = ln.split()[-1]
1762 if a in archs:
1763 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001764 os.unlink(tmpfile)
1765
1766 for a in detected_archs:
1767 frameworks.append('-arch')
1768 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001769
Jack Jansen0b06be72002-06-21 14:48:38 +00001770 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1771 define_macros=[('WITH_APPINIT', 1)],
1772 include_dirs = include_dirs,
1773 libraries = [],
Georg Brandlfcaf9102008-07-16 02:17:56 +00001774 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001775 extra_link_args = frameworks,
1776 )
1777 self.extensions.append(ext)
1778 return 1
1779
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001780 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001781 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001782
Ned Deilyd819b932013-09-06 01:07:05 -07001783 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1784 # configured or passed into the make target. If so, use these values
1785 # to build tkinter and bypass the searches for Tcl and TK in standard
1786 # locations.
1787 if self.detect_tkinter_explicitly():
1788 return
1789
Jack Jansen0b06be72002-06-21 14:48:38 +00001790 # Rather than complicate the code below, detecting and building
1791 # AquaTk is a separate method. Only one Tkinter will be built on
1792 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001793 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001794 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001795 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001796
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001797 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001798 # The versions with dots are used on Unix, and the versions without
1799 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001800 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001801 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1802 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé36797272010-07-22 12:50:05 +00001803 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001804 'tk' + version)
Tarek Ziadé36797272010-07-22 12:50:05 +00001805 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001806 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001807 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001808 # Exit the loop when we've found the Tcl/Tk libraries
1809 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001810
Fredrik Lundhade711a2001-01-24 08:00:28 +00001811 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001812 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001813 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001814 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001815 dotversion = version
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001816 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001817 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1818 # but the include subdirs are named like .../include/tcl8.3.
1819 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1820 tcl_include_sub = []
1821 tk_include_sub = []
1822 for dir in inc_dirs:
1823 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1824 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1825 tk_include_sub += tcl_include_sub
1826 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1827 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001828
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001829 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001830 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001831 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001832 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001833
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001834 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001835
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001836 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1837 for dir in tcl_includes + tk_includes:
1838 if dir not in include_dirs:
1839 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001840
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001841 # Check for various platform-specific directories
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001842 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001843 include_dirs.append('/usr/openwin/include')
1844 added_lib_dirs.append('/usr/openwin/lib')
1845 elif os.path.exists('/usr/X11R6/include'):
1846 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001847 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001848 added_lib_dirs.append('/usr/X11R6/lib')
1849 elif os.path.exists('/usr/X11R5/include'):
1850 include_dirs.append('/usr/X11R5/include')
1851 added_lib_dirs.append('/usr/X11R5/lib')
1852 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001853 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001854 include_dirs.append('/usr/X11/include')
1855 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001856
Jason Tishler9181c942003-02-05 15:16:17 +00001857 # If Cygwin, then verify that X is installed before proceeding
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001858 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001859 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1860 if x11_inc is None:
1861 return
1862
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001863 # Check for BLT extension
Tarek Ziadé36797272010-07-22 12:50:05 +00001864 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001865 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001866 defs.append( ('WITH_BLT', 1) )
1867 libs.append('BLT8.0')
Tarek Ziadé36797272010-07-22 12:50:05 +00001868 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001869 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001870 defs.append( ('WITH_BLT', 1) )
1871 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001872
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001873 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001874 libs.append('tk'+ version)
1875 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001876
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001877 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001878 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001879
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001880 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001881 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001882 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001883
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001884 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1885 define_macros=[('WITH_APPINIT', 1)] + defs,
1886 include_dirs = include_dirs,
1887 libraries = libs,
1888 library_dirs = added_lib_dirs,
1889 )
1890 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001891
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001892 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001893 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001894 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001895 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001896 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001897 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001898 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001899
Christian Heimes78644762008-03-04 23:39:23 +00001900 def configure_ctypes_darwin(self, ext):
1901 # Darwin (OS X) uses preconfigured files, in
1902 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauer014bf282009-02-05 16:35:45 +00001903 srcdir = sysconfig.get_config_var('srcdir')
Christian Heimes78644762008-03-04 23:39:23 +00001904 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1905 '_ctypes', 'libffi_osx'))
1906 sources = [os.path.join(ffi_srcdir, p)
1907 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001908 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001909 'x86/x86-darwin.S',
1910 'x86/x86-ffi_darwin.c',
1911 'x86/x86-ffi64.c',
1912 'powerpc/ppc-darwin.S',
1913 'powerpc/ppc-darwin_closure.S',
1914 'powerpc/ppc-ffi_darwin.c',
1915 'powerpc/ppc64-darwin_closure.S',
1916 ]]
1917
1918 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001919 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001920
1921 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1922 os.path.join(ffi_srcdir, 'powerpc')]
1923 ext.include_dirs.extend(include_dirs)
1924 ext.sources.extend(sources)
1925 return True
1926
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001927 def configure_ctypes(self, ext):
1928 if not self.use_system_libffi:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001929 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001930 return self.configure_ctypes_darwin(ext)
Zachary Waref40d4dd2016-09-17 01:25:24 -05001931 print('INFO: Could not locate ffi libs and/or headers')
1932 return False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001933 return True
1934
1935 def detect_ctypes(self, inc_dirs, lib_dirs):
1936 self.use_system_libffi = False
1937 include_dirs = []
1938 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001939 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001940 sources = ['_ctypes/_ctypes.c',
1941 '_ctypes/callbacks.c',
1942 '_ctypes/callproc.c',
1943 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001944 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001945 depends = ['_ctypes/ctypes.h']
1946
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001947 if host_platform == 'darwin':
Ronald Oussoren2decf222010-09-05 18:25:59 +00001948 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001949 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001950 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001951 include_dirs.append('_ctypes/darwin')
1952# XXX Is this still needed?
1953## extra_link_args.extend(['-read_only_relocs', 'warning'])
1954
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001955 elif host_platform == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001956 # XXX This shouldn't be necessary; it appears that some
1957 # of the assembler code is non-PIC (i.e. it has relocations
1958 # when it shouldn't. The proper fix would be to rewrite
1959 # the assembler code to be PIC.
1960 # This only works with GCC; the Sun compiler likely refuses
1961 # this option. If you want to compile ctypes with the Sun
1962 # compiler, please research a proper solution, instead of
1963 # finding some -z option for the Sun compiler.
1964 extra_link_args.append('-mimpure-text')
1965
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001966 elif host_platform.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001967 extra_link_args.append('-fPIC')
1968
Thomas Hellercf567c12006-03-08 19:51:58 +00001969 ext = Extension('_ctypes',
1970 include_dirs=include_dirs,
1971 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001972 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001973 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001974 sources=sources,
1975 depends=depends)
Benjamin Peterson8acaa312017-11-12 20:53:39 -08001976 # function my_sqrt() needs libm for sqrt()
Thomas Hellercf567c12006-03-08 19:51:58 +00001977 ext_test = Extension('_ctypes_test',
Victor Stinnerdef80722016-04-19 15:58:11 +02001978 sources=['_ctypes/_ctypes_test.c'],
Benjamin Peterson8acaa312017-11-12 20:53:39 -08001979 libraries=['m'])
Thomas Hellercf567c12006-03-08 19:51:58 +00001980 self.extensions.extend([ext, ext_test])
1981
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001982 if host_platform == 'darwin':
Zachary Ware935043d2016-09-09 17:01:21 -07001983 if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
1984 return
Christian Heimes78644762008-03-04 23:39:23 +00001985 # OS X 10.5 comes with libffi.dylib; the include files are
1986 # in /usr/include/ffi
1987 inc_dirs.append('/usr/include/ffi')
1988
Benjamin Petersond78735d2010-01-01 16:04:23 +00001989 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001990 if not ffi_inc or ffi_inc[0] == '':
Benjamin Petersond78735d2010-01-01 16:04:23 +00001991 ffi_inc = find_file('ffi.h', [], inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001992 if ffi_inc is not None:
1993 ffi_h = ffi_inc[0] + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03001994 if not os.path.exists(ffi_h):
1995 ffi_inc = None
1996 print('Header file {} does not exist'.format(ffi_h))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001997 ffi_lib = None
1998 if ffi_inc is not None:
doko@ubuntu.comae683652016-06-05 01:38:29 +02001999 for lib_name in ('ffi', 'ffi_pic'):
Tarek Ziadé36797272010-07-22 12:50:05 +00002000 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002001 ffi_lib = lib_name
2002 break
2003
2004 if ffi_inc and ffi_lib:
2005 ext.include_dirs.extend(ffi_inc)
2006 ext.libraries.append(ffi_lib)
2007 self.use_system_libffi = True
2008
Miss Islington (bot)4cb37332018-02-25 04:07:24 -08002009 if sysconfig.get_config_var('HAVE_LIBDL'):
2010 # for dlopen, see bpo-32647
2011 ext.libraries.append('dl')
2012
Stefan Krah1919b7e2012-03-21 18:25:23 +01002013 def _decimal_ext(self):
Stefan Krah60187b52012-03-23 19:06:27 +01002014 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002015 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002016 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2017 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002018 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002019 sources = ['_decimal/_decimal.c']
2020 depends = ['_decimal/docstrings.h']
2021 else:
Ned Deily458a6fb2012-04-01 02:30:46 -07002022 srcdir = sysconfig.get_config_var('srcdir')
2023 include_dirs = [os.path.abspath(os.path.join(srcdir,
2024 'Modules',
2025 '_decimal',
2026 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002027 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002028 sources = [
2029 '_decimal/_decimal.c',
2030 '_decimal/libmpdec/basearith.c',
2031 '_decimal/libmpdec/constants.c',
2032 '_decimal/libmpdec/context.c',
2033 '_decimal/libmpdec/convolute.c',
2034 '_decimal/libmpdec/crt.c',
2035 '_decimal/libmpdec/difradix2.c',
2036 '_decimal/libmpdec/fnt.c',
2037 '_decimal/libmpdec/fourstep.c',
2038 '_decimal/libmpdec/io.c',
2039 '_decimal/libmpdec/memory.c',
2040 '_decimal/libmpdec/mpdecimal.c',
2041 '_decimal/libmpdec/numbertheory.c',
2042 '_decimal/libmpdec/sixstep.c',
2043 '_decimal/libmpdec/transpose.c',
2044 ]
2045 depends = [
2046 '_decimal/docstrings.h',
2047 '_decimal/libmpdec/basearith.h',
2048 '_decimal/libmpdec/bits.h',
2049 '_decimal/libmpdec/constants.h',
2050 '_decimal/libmpdec/convolute.h',
2051 '_decimal/libmpdec/crt.h',
2052 '_decimal/libmpdec/difradix2.h',
2053 '_decimal/libmpdec/fnt.h',
2054 '_decimal/libmpdec/fourstep.h',
2055 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002056 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002057 '_decimal/libmpdec/mpdecimal.h',
2058 '_decimal/libmpdec/numbertheory.h',
2059 '_decimal/libmpdec/sixstep.h',
2060 '_decimal/libmpdec/transpose.h',
2061 '_decimal/libmpdec/typearith.h',
2062 '_decimal/libmpdec/umodarith.h',
2063 ]
2064
Stefan Krah1919b7e2012-03-21 18:25:23 +01002065 config = {
2066 'x64': [('CONFIG_64','1'), ('ASM','1')],
2067 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2068 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2069 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2070 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2071 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2072 ('LEGACY_COMPILER','1')],
2073 'universal': [('UNIVERSAL','1')]
2074 }
2075
Stefan Krah1919b7e2012-03-21 18:25:23 +01002076 cc = sysconfig.get_config_var('CC')
2077 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2078 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2079
2080 if machine:
2081 # Override automatic configuration to facilitate testing.
2082 define_macros = config[machine]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02002083 elif host_platform == 'darwin':
Stefan Krah1919b7e2012-03-21 18:25:23 +01002084 # Universal here means: build with the same options Python
2085 # was built with.
2086 define_macros = config['universal']
2087 elif sizeof_size_t == 8:
2088 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2089 define_macros = config['x64']
2090 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2091 define_macros = config['uint128']
2092 else:
2093 define_macros = config['ansi64']
2094 elif sizeof_size_t == 4:
2095 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2096 if ppro and ('gcc' in cc or 'clang' in cc) and \
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02002097 not 'sunos' in host_platform:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002098 # solaris: problems with register allocation.
2099 # icc >= 11.0 works as well.
2100 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002101 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002102 else:
2103 define_macros = config['ansi32']
2104 else:
2105 raise DistutilsError("_decimal: unsupported architecture")
2106
2107 # Workarounds for toolchain bugs:
2108 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2109 # Some versions of gcc miscompile inline asm:
2110 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2111 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2112 extra_compile_args.append('-fno-ipa-pure-const')
2113 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2114 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2115 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2116 undef_macros.append('_FORTIFY_SOURCE')
2117
Stefan Krah1919b7e2012-03-21 18:25:23 +01002118 # Uncomment for extra functionality:
2119 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
2120 ext = Extension (
2121 '_decimal',
2122 include_dirs=include_dirs,
Stefan Krahbd4ed772017-12-06 18:24:17 +01002123 libraries=libraries,
Stefan Krah1919b7e2012-03-21 18:25:23 +01002124 define_macros=define_macros,
2125 undef_macros=undef_macros,
2126 extra_compile_args=extra_compile_args,
2127 sources=sources,
2128 depends=depends
2129 )
2130 return ext
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002131
Christian Heimesff5be6e2018-01-20 13:19:21 +01002132 def _detect_openssl(self, inc_dirs, lib_dirs):
2133 config_vars = sysconfig.get_config_vars()
2134
2135 def split_var(name, sep):
2136 # poor man's shlex, the re module is not available yet.
2137 value = config_vars.get(name)
2138 if not value:
2139 return ()
2140 # This trick works because ax_check_openssl uses --libs-only-L,
2141 # --libs-only-l, and --cflags-only-I.
2142 value = ' ' + value
2143 sep = ' ' + sep
2144 return [v.strip() for v in value.split(sep) if v.strip()]
2145
2146 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2147 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2148 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2149 if not openssl_libs:
2150 # libssl and libcrypto not found
2151 return None, None
2152
2153 # Find OpenSSL includes
2154 ssl_incs = find_file(
2155 'openssl/ssl.h', inc_dirs, openssl_includes
2156 )
2157 if ssl_incs is None:
2158 return None, None
2159
2160 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2161 krb5_h = find_file(
2162 'krb5.h', inc_dirs,
2163 ['/usr/kerberos/include']
2164 )
2165 if krb5_h:
2166 ssl_incs.extend(krb5_h)
2167
Christian Heimes61d478c2018-01-27 15:51:38 +01002168 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
2169 ssl_ext = Extension(
2170 '_ssl', ['_ssl.c'],
2171 include_dirs=openssl_includes,
2172 library_dirs=openssl_libdirs,
2173 libraries=openssl_libs,
2174 depends=['socketmodule.h']
2175 )
2176 else:
2177 ssl_ext = None
Christian Heimesff5be6e2018-01-20 13:19:21 +01002178
2179 hashlib_ext = Extension(
2180 '_hashlib', ['_hashopenssl.c'],
2181 depends=['hashlib.h'],
2182 include_dirs=openssl_includes,
2183 library_dirs=openssl_libdirs,
2184 libraries=openssl_libs,
2185 )
2186
2187 return ssl_ext, hashlib_ext
2188
Christian Heimes29a7df72018-01-26 23:28:46 +01002189 def _detect_nis(self, inc_dirs, lib_dirs):
2190 if host_platform in {'win32', 'cygwin', 'qnx6'}:
2191 return None
2192
2193 libs = []
2194 library_dirs = []
2195 includes_dirs = []
2196
2197 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2198 # moved headers and libraries to libtirpc and libnsl. The headers
2199 # are in tircp and nsl sub directories.
2200 rpcsvc_inc = find_file(
2201 'rpcsvc/yp_prot.h', inc_dirs,
2202 [os.path.join(inc_dir, 'nsl') for inc_dir in inc_dirs]
2203 )
2204 rpc_inc = find_file(
2205 'rpc/rpc.h', inc_dirs,
2206 [os.path.join(inc_dir, 'tirpc') for inc_dir in inc_dirs]
2207 )
2208 if rpcsvc_inc is None or rpc_inc is None:
2209 # not found
2210 return None
2211 includes_dirs.extend(rpcsvc_inc)
2212 includes_dirs.extend(rpc_inc)
2213
2214 if self.compiler.find_library_file(lib_dirs, 'nsl'):
2215 libs.append('nsl')
2216 else:
2217 # libnsl-devel: check for libnsl in nsl/ subdirectory
2218 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
2219 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2220 if libnsl is not None:
2221 library_dirs.append(os.path.dirname(libnsl))
2222 libs.append('nsl')
2223
2224 if self.compiler.find_library_file(lib_dirs, 'tirpc'):
2225 libs.append('tirpc')
2226
2227 return Extension(
2228 'nis', ['nismodule.c'],
2229 libraries=libs,
2230 library_dirs=library_dirs,
2231 include_dirs=includes_dirs
2232 )
2233
Christian Heimesff5be6e2018-01-20 13:19:21 +01002234
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002235class PyBuildInstall(install):
2236 # Suppress the warning about installation into the lib_dynload
2237 # directory, which is not in sys.path when running Python during
2238 # installation:
2239 def initialize_options (self):
2240 install.initialize_options(self)
2241 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002242
Éric Araujoe6792c12011-06-09 14:07:02 +02002243 # Customize subcommands to not install an egg-info file for Python
2244 sub_commands = [('install_lib', install.has_lib),
2245 ('install_headers', install.has_headers),
2246 ('install_scripts', install.has_scripts),
2247 ('install_data', install.has_data)]
2248
2249
Michael W. Hudson529a5052002-12-17 16:47:17 +00002250class PyBuildInstallLib(install_lib):
2251 # Do exactly what install_lib does but make sure correct access modes get
2252 # set on installed directories and files. All installed files with get
2253 # mode 644 unless they are a shared library in which case they will get
2254 # mode 755. All installed directories will get mode 755.
2255
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002256 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2257 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002258
2259 def install(self):
2260 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002261 self.set_file_modes(outfiles, 0o644, 0o755)
2262 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002263 return outfiles
2264
2265 def set_file_modes(self, files, defaultMode, sharedLibMode):
2266 if not self.is_chmod_supported(): return
2267 if not files: return
2268
2269 for filename in files:
2270 if os.path.islink(filename): continue
2271 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002272 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002273 log.info("changing mode of %s to %o", filename, mode)
2274 if not self.dry_run: os.chmod(filename, mode)
2275
2276 def set_dir_modes(self, dirname, mode):
2277 if not self.is_chmod_supported(): return
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002278 for dirpath, dirnames, fnames in os.walk(dirname):
2279 if os.path.islink(dirpath):
2280 continue
2281 log.info("changing mode of %s to %o", dirpath, mode)
2282 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002283
2284 def is_chmod_supported(self):
2285 return hasattr(os, 'chmod')
2286
Georg Brandlff52f762010-12-28 09:51:43 +00002287class PyBuildScripts(build_scripts):
2288 def copy_scripts(self):
2289 outfiles, updated_files = build_scripts.copy_scripts(self)
2290 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2291 minoronly = '.{0[1]}'.format(sys.version_info)
2292 newoutfiles = []
2293 newupdated_files = []
2294 for filename in outfiles:
Vinay Sajip7ded1f02012-05-26 03:45:29 +01002295 if filename.endswith(('2to3', 'pyvenv')):
Georg Brandlff52f762010-12-28 09:51:43 +00002296 newfilename = filename + fullversion
2297 else:
2298 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002299 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002300 os.rename(filename, newfilename)
2301 newoutfiles.append(newfilename)
2302 if filename in updated_files:
2303 newupdated_files.append(newfilename)
2304 return newoutfiles, newupdated_files
2305
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002306SUMMARY = """
2307Python is an interpreted, interactive, object-oriented programming
2308language. It is often compared to Tcl, Perl, Scheme or Java.
2309
2310Python combines remarkable power with very clear syntax. It has
2311modules, classes, exceptions, very high level dynamic data types, and
2312dynamic typing. There are interfaces to many system calls and
2313libraries, as well as to various windowing systems (X11, Motif, Tk,
2314Mac, MFC). New built-in modules are easily written in C or C++. Python
2315is also usable as an extension language for applications that need a
2316programmable interface.
2317
2318The Python implementation is portable: it runs on many brands of UNIX,
Jesus Ceaf1af7052012-10-05 02:48:46 +02002319on Windows, DOS, Mac, Amiga... If your favorite system isn't
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002320listed here, it may still be supported, if there's a C compiler for
2321it. Ask around on comp.lang.python -- or just try compiling Python
2322yourself.
2323"""
2324
2325CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002326Development Status :: 6 - Mature
2327License :: OSI Approved :: Python Software Foundation License
2328Natural Language :: English
2329Programming Language :: C
2330Programming Language :: Python
2331Topic :: Software Development
2332"""
2333
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002334def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002335 # turn off warnings when deprecated modules are imported
2336 import warnings
2337 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002338 setup(# PyPI Metadata (PEP 301)
2339 name = "Python",
2340 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002341 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002342 maintainer = "Guido van Rossum and the Python community",
2343 maintainer_email = "python-dev@python.org",
2344 description = "A high-level object-oriented programming language",
2345 long_description = SUMMARY.strip(),
2346 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002347 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002348 platforms = ["Many"],
2349
2350 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002351 cmdclass = {'build_ext': PyBuildExt,
2352 'build_scripts': PyBuildScripts,
2353 'install': PyBuildInstall,
2354 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002355 # The struct module is defined here, because build_ext won't be
2356 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002357 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002358
Georg Brandlff52f762010-12-28 09:51:43 +00002359 # If you change the scripts installed here, you also need to
2360 # check the PyBuildScripts command above, and change the links
2361 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002362 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Éric Araujo859aad62012-06-24 00:07:41 -04002363 "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002364 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002365
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002366# --install-platlib
2367if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002368 main()