blob: 9c83914fd907ba7d6e53901753fc5c68b60d3ae9 [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +00002
Victor Stinner625dbf22019-03-01 15:59:39 +01003import argparse
Eric Snow335e14d2014-01-04 15:09:28 -07004import importlib._bootstrap
Victor Stinner625dbf22019-03-01 15:59:39 +01005import importlib.machinery
Eric Snow335e14d2014-01-04 15:09:28 -07006import importlib.util
Victor Stinner625dbf22019-03-01 15:59:39 +01007import os
8import re
9import sys
Tarek Ziadéedacea32010-01-29 11:41:03 +000010import sysconfig
Victor Stinner625dbf22019-03-01 15:59:39 +010011from glob import glob
Michael W. Hudson529a5052002-12-17 16:47:17 +000012
13from distutils import log
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000014from distutils.command.build_ext import build_ext
Victor Stinner625dbf22019-03-01 15:59:39 +010015from distutils.command.build_scripts import build_scripts
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000016from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000017from distutils.command.install_lib import install_lib
Victor Stinner625dbf22019-03-01 15:59:39 +010018from distutils.core import Extension, setup
19from distutils.errors import CCompilerError, DistutilsError
Stefan Krah095b2732010-06-08 13:41:44 +000020from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000021
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020022
Victor Stinnercfe172d2019-03-01 18:21:49 +010023# Compile extensions used to test Python?
24TEST_EXTENSIONS = True
25
26# This global variable is used to hold the list of modules to be disabled.
27DISABLED_MODULE_LIST = []
28
29
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020030def get_platform():
Victor Stinnerc991f242019-03-01 17:19:04 +010031 # Cross compiling
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020032 if "_PYTHON_HOST_PLATFORM" in os.environ:
33 return os.environ["_PYTHON_HOST_PLATFORM"]
Victor Stinnerc991f242019-03-01 17:19:04 +010034
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020035 # Get value of sys.platform
36 if sys.platform.startswith('osf1'):
37 return 'osf1'
38 return sys.platform
Victor Stinnerc991f242019-03-01 17:19:04 +010039
40
41CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ)
Victor Stinner4cbea512019-02-28 17:48:38 +010042HOST_PLATFORM = get_platform()
43MS_WINDOWS = (HOST_PLATFORM == 'win32')
44CYGWIN = (HOST_PLATFORM == 'cygwin')
45MACOS = (HOST_PLATFORM == 'darwin')
Victor Stinner4cbea512019-02-28 17:48:38 +010046VXWORKS = ('vxworks' in HOST_PLATFORM)
pxinwr32f5fdd2019-02-27 19:09:28 +080047
Victor Stinnerc991f242019-03-01 17:19:04 +010048
49SUMMARY = """
50Python is an interpreted, interactive, object-oriented programming
51language. It is often compared to Tcl, Perl, Scheme or Java.
52
53Python combines remarkable power with very clear syntax. It has
54modules, classes, exceptions, very high level dynamic data types, and
55dynamic typing. There are interfaces to many system calls and
56libraries, as well as to various windowing systems (X11, Motif, Tk,
57Mac, MFC). New built-in modules are easily written in C or C++. Python
58is also usable as an extension language for applications that need a
59programmable interface.
60
61The Python implementation is portable: it runs on many brands of UNIX,
62on Windows, DOS, Mac, Amiga... If your favorite system isn't
63listed here, it may still be supported, if there's a C compiler for
64it. Ask around on comp.lang.python -- or just try compiling Python
65yourself.
66"""
67
68CLASSIFIERS = """
69Development Status :: 6 - Mature
70License :: OSI Approved :: Python Software Foundation License
71Natural Language :: English
72Programming Language :: C
73Programming Language :: Python
74Topic :: Software Development
75"""
76
77
78# Set common compiler and linker flags derived from the Makefile,
79# reserved for building the interpreter and the stdlib modules.
80# See bpo-21121 and bpo-35257
81def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
82 flags = sysconfig.get_config_var(compiler_flags)
83 py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
84 sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
85
86
Michael W. Hudson39230b32002-01-16 15:26:48 +000087def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000088 """Add the directory 'dir' to the list 'dirlist' (after any relative
89 directories) if:
90
Michael W. Hudson39230b32002-01-16 15:26:48 +000091 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000092 2) 'dir' actually exists, and is a directory.
93 """
94 if dir is None or not os.path.isdir(dir) or dir in dirlist:
95 return
96 for i, path in enumerate(dirlist):
97 if not os.path.isabs(path):
98 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000099 return
100 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +0000101
Victor Stinnerc991f242019-03-01 17:19:04 +0100102
xdegaye77f51392017-11-25 17:25:30 +0100103def sysroot_paths(make_vars, subdirs):
104 """Get the paths of sysroot sub-directories.
105
106 * make_vars: a sequence of names of variables of the Makefile where
107 sysroot may be set.
108 * subdirs: a sequence of names of subdirectories used as the location for
109 headers or libraries.
110 """
111
112 dirs = []
113 for var_name in make_vars:
114 var = sysconfig.get_config_var(var_name)
115 if var is not None:
116 m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
117 if m is not None:
118 sysroot = m.group(1).strip('"')
119 for subdir in subdirs:
120 if os.path.isabs(subdir):
121 subdir = subdir[1:]
122 path = os.path.join(sysroot, subdir)
123 if os.path.isdir(path):
124 dirs.append(path)
125 break
126 return dirs
127
Victor Stinnerc991f242019-03-01 17:19:04 +0100128
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000129def macosx_sdk_root():
130 """
131 Return the directory of the current OSX SDK,
132 or '/' if no SDK was specified.
133 """
134 cflags = sysconfig.get_config_var('CFLAGS')
135 m = re.search(r'-isysroot\s+(\S+)', cflags)
136 if m is None:
137 sysroot = '/'
138 else:
139 sysroot = m.group(1)
140 return sysroot
141
Victor Stinnerc991f242019-03-01 17:19:04 +0100142
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000143def is_macosx_sdk_path(path):
144 """
145 Returns True if 'path' can be located in an OSX SDK
146 """
Ned Deily2910a7b2012-07-30 02:35:58 -0700147 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
148 or path.startswith('/System/')
149 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000150
Victor Stinnerc991f242019-03-01 17:19:04 +0100151
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000152def find_file(filename, std_dirs, paths):
153 """Searches for the directory where a given file is located,
154 and returns a possibly-empty list of additional directories, or None
155 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +0000156
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000157 'filename' is the name of a file, such as readline.h or libcrypto.a.
158 'std_dirs' is the list of standard system directories; if the
159 file is found in one of them, no additional directives are needed.
160 'paths' is a list of additional locations to check; if the file is
161 found in one of them, the resulting list will contain the directory.
162 """
Victor Stinner4cbea512019-02-28 17:48:38 +0100163 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000164 # Honor the MacOSX SDK setting when one was specified.
165 # An SDK is a directory with the same structure as a real
166 # system, but with only header files and libraries.
167 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000168
169 # Check the standard locations
170 for dir in std_dirs:
171 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000172
Victor Stinner4cbea512019-02-28 17:48:38 +0100173 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000174 f = os.path.join(sysroot, dir[1:], filename)
175
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000176 if os.path.exists(f): return []
177
178 # Check the additional directories
179 for dir in paths:
180 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000181
Victor Stinner4cbea512019-02-28 17:48:38 +0100182 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000183 f = os.path.join(sysroot, dir[1:], filename)
184
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000185 if os.path.exists(f):
186 return [dir]
187
188 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000189 return None
190
Victor Stinnerc991f242019-03-01 17:19:04 +0100191
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000192def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000193 result = compiler.find_library_file(std_dirs + paths, libname)
194 if result is None:
195 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000196
Victor Stinner4cbea512019-02-28 17:48:38 +0100197 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000198 sysroot = macosx_sdk_root()
199
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000200 # Check whether the found file is in one of the standard directories
201 dirname = os.path.dirname(result)
202 for p in std_dirs:
203 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000204 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000205
Victor Stinner4cbea512019-02-28 17:48:38 +0100206 if MACOS and is_macosx_sdk_path(p):
Ned Deily020250f2016-02-25 00:56:38 +1100207 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
208 # libraries with .tbd extensions rather than the normal .dylib
209 # shared libraries installed in /. The Apple compiler tool
210 # chain handles this transparently but it can cause problems
211 # for programs that are being built with an SDK and searching
212 # for specific libraries. Distutils find_library_file() now
213 # knows to also search for and return .tbd files. But callers
214 # of find_library_file need to keep in mind that the base filename
215 # of the returned SDK library file might have a different extension
216 # from that of the library file installed on the running system,
217 # for example:
218 # /Applications/Xcode.app/Contents/Developer/Platforms/
219 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
220 # usr/lib/libedit.tbd
221 # vs
222 # /usr/lib/libedit.dylib
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000223 if os.path.join(sysroot, p[1:]) == dirname:
224 return [ ]
225
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000226 if p == dirname:
227 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000228
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000229 # Otherwise, it must have been in one of the additional directories,
230 # so we have to figure out which one.
231 for p in paths:
232 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000233 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000234
Victor Stinner4cbea512019-02-28 17:48:38 +0100235 if MACOS and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000236 if os.path.join(sysroot, p[1:]) == dirname:
237 return [ p ]
238
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000239 if p == dirname:
240 return [p]
241 else:
242 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000243
Victor Stinnerc991f242019-03-01 17:19:04 +0100244
Jack Jansen144ebcc2001-08-05 22:31:19 +0000245def find_module_file(module, dirlist):
246 """Find a module in a set of possible folders. If it is not found
247 return the unadorned filename"""
248 list = find_file(module, [], dirlist)
249 if not list:
250 return module
251 if len(list) > 1:
Vinay Sajipdd917f82016-08-31 08:22:29 +0100252 log.info("WARNING: multiple copies of %s found", module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000253 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000254
Victor Stinnerc991f242019-03-01 17:19:04 +0100255
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000256class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000257
Guido van Rossumd8faa362007-04-27 19:54:29 +0000258 def __init__(self, dist):
259 build_ext.__init__(self, dist)
Victor Stinner625dbf22019-03-01 15:59:39 +0100260 self.srcdir = None
261 self.lib_dirs = None
262 self.inc_dirs = None
Victor Stinner5ec33a12019-03-01 16:43:28 +0100263 self.config_h_vars = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400265 self.failed_on_import = []
Victor Stinner8058bda2019-03-01 15:31:45 +0100266 self.missing = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200267 if '-j' in os.environ.get('MAKEFLAGS', ''):
268 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000269
Victor Stinner8058bda2019-03-01 15:31:45 +0100270 def add(self, ext):
271 self.extensions.append(ext)
272
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000273 def build_extensions(self):
Victor Stinner625dbf22019-03-01 15:59:39 +0100274 self.srcdir = sysconfig.get_config_var('srcdir')
275 if not self.srcdir:
276 # Maybe running on Windows but not using CYGWIN?
277 raise ValueError("No source directory; cannot proceed.")
278 self.srcdir = os.path.abspath(self.srcdir)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000279
280 # Detect which modules should be compiled
Victor Stinner8058bda2019-03-01 15:31:45 +0100281 self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000282
283 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000284 extensions = [ext for ext in self.extensions
Victor Stinner4cbea512019-02-28 17:48:38 +0100285 if ext.name not in DISABLED_MODULE_LIST]
Christian Heimes679db4a2008-01-18 09:56:22 +0000286 # move ctypes to the end, it depends on other modules
287 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
288 if "_ctypes" in ext_map:
289 ctypes = extensions.pop(ext_map["_ctypes"])
290 extensions.append(ctypes)
291 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000292
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000293 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000294 # with Modules/.
Victor Stinner625dbf22019-03-01 15:59:39 +0100295 moddirlist = [os.path.join(self.srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000296
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000297 # Fix up the paths for scripts, too
Victor Stinner625dbf22019-03-01 15:59:39 +0100298 self.distribution.scripts = [os.path.join(self.srcdir, filename)
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000299 for filename in self.distribution.scripts]
300
Christian Heimesaf98da12008-01-27 15:18:18 +0000301 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000302 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100303 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000304
xdegayec0364fc2017-05-27 18:25:03 +0200305 # The sysconfig variables built by makesetup that list the already
306 # built modules and the disabled modules as configured by the Setup
307 # files.
308 sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
309 sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200310
xdegayec0364fc2017-05-27 18:25:03 +0200311 mods_built = []
312 mods_disabled = []
Xavier de Gaye84968b72016-10-29 16:57:20 +0200313 for ext in self.extensions:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000314 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000315 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000316 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000317 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000318 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000319 else:
320 ext.depends = []
321 # re-compile extensions if a header file has been changed
322 ext.depends.extend(headers)
323
xdegayec0364fc2017-05-27 18:25:03 +0200324 # If a module has already been built or has been disabled in the
325 # Setup files, don't build it here.
326 if ext.name in sysconf_built:
327 mods_built.append(ext)
328 if ext.name in sysconf_dis:
329 mods_disabled.append(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000330
xdegayec0364fc2017-05-27 18:25:03 +0200331 mods_configured = mods_built + mods_disabled
332 if mods_configured:
Xavier de Gaye84968b72016-10-29 16:57:20 +0200333 self.extensions = [x for x in self.extensions if x not in
xdegayec0364fc2017-05-27 18:25:03 +0200334 mods_configured]
335 # Remove the shared libraries built by a previous build.
336 for ext in mods_configured:
337 fullpath = self.get_ext_fullpath(ext.name)
338 if os.path.exists(fullpath):
339 os.unlink(fullpath)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000340
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000341 # When you run "make CC=altcc" or something similar, you really want
342 # those environment variables passed into the setup.py phase. Here's
343 # a small set of useful ones.
344 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000345 args = {}
346 # unfortunately, distutils doesn't let us provide separate C and C++
347 # compilers
348 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000349 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
350 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000351 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000352
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000353 build_ext.build_extensions(self)
354
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200355 for ext in self.extensions:
356 self.check_extension_import(ext)
357
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300358 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400359 if self.failed or self.failed_on_import:
360 all_failed = self.failed + self.failed_on_import
361 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000362
363 def print_three_column(lst):
364 lst.sort(key=str.lower)
365 # guarantee zip() doesn't drop anything
366 while len(lst) % 3:
367 lst.append("")
368 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
369 print("%-*s %-*s %-*s" % (longest, e, longest, f,
370 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000371
Victor Stinner8058bda2019-03-01 15:31:45 +0100372 if self.missing:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000373 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400374 print("Python build finished successfully!")
375 print("The necessary bits to build these optional modules were not "
376 "found:")
Victor Stinner8058bda2019-03-01 15:31:45 +0100377 print_three_column(self.missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000378 print("To find the necessary bits, look in setup.py in"
379 " detect_modules() for the module's name.")
380 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000381
xdegayec0364fc2017-05-27 18:25:03 +0200382 if mods_built:
383 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200384 print("The following modules found by detect_modules() in"
385 " setup.py, have been")
386 print("built by the Makefile instead, as configured by the"
387 " Setup files:")
xdegayec0364fc2017-05-27 18:25:03 +0200388 print_three_column([ext.name for ext in mods_built])
389 print()
390
391 if mods_disabled:
392 print()
393 print("The following modules found by detect_modules() in"
394 " setup.py have not")
395 print("been built, they are *disabled* in the Setup files:")
396 print_three_column([ext.name for ext in mods_disabled])
397 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200398
Guido van Rossumd8faa362007-04-27 19:54:29 +0000399 if self.failed:
400 failed = self.failed[:]
401 print()
402 print("Failed to build these modules:")
403 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000404 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000405
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400406 if self.failed_on_import:
407 failed = self.failed_on_import[:]
408 print()
409 print("Following modules built successfully"
410 " but were removed because they could not be imported:")
411 print_three_column(failed)
412 print()
413
Christian Heimes61d478c2018-01-27 15:51:38 +0100414 if any('_ssl' in l
Victor Stinner8058bda2019-03-01 15:31:45 +0100415 for l in (self.missing, self.failed, self.failed_on_import)):
Christian Heimes61d478c2018-01-27 15:51:38 +0100416 print()
417 print("Could not build the ssl module!")
418 print("Python requires an OpenSSL 1.0.2 or 1.1 compatible "
419 "libssl with X509_VERIFY_PARAM_set1_host().")
420 print("LibreSSL 2.6.4 and earlier do not provide the necessary "
421 "APIs, https://github.com/libressl-portable/portable/issues/381")
422 print()
423
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000424 def build_extension(self, ext):
425
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000426 if ext.name == '_ctypes':
427 if not self.configure_ctypes(ext):
Zachary Waref40d4dd2016-09-17 01:25:24 -0500428 self.failed.append(ext.name)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000429 return
430
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000431 try:
432 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000433 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000434 self.announce('WARNING: building of extension "%s" failed: %s' %
Victor Stinner625dbf22019-03-01 15:59:39 +0100435 (ext.name, why))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000437 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200438
439 def check_extension_import(self, ext):
440 # Don't try to import an extension that has failed to compile
441 if ext.name in self.failed:
442 self.announce(
443 'WARNING: skipping import check for failed build "%s"' %
444 ext.name, level=1)
445 return
446
Jack Jansenf49c6f92001-11-01 14:44:15 +0000447 # Workaround for Mac OS X: The Carbon-based modules cannot be
448 # reliably imported into a command-line Python
449 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000450 self.announce(
451 'WARNING: skipping import check for Carbon-based "%s"' %
452 ext.name)
453 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000454
Victor Stinner4cbea512019-02-28 17:48:38 +0100455 if MACOS and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000456 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000457 # Don't bother doing an import check when an extension was
458 # build with an explicit '-arch' flag on OSX. That's currently
459 # only used to build 32-bit only extensions in a 4-way
460 # universal build and loading 32-bit code into a 64-bit
461 # process will fail.
462 self.announce(
463 'WARNING: skipping import check for "%s"' %
464 ext.name)
465 return
466
Jason Tishler24cf7762002-05-22 16:46:15 +0000467 # Workaround for Cygwin: Cygwin currently has fork issues when many
468 # modules have been imported
Victor Stinner4cbea512019-02-28 17:48:38 +0100469 if CYGWIN:
Jason Tishler24cf7762002-05-22 16:46:15 +0000470 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
471 % ext.name)
472 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000473 ext_filename = os.path.join(
474 self.build_lib,
475 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000476
477 # If the build directory didn't exist when setup.py was
478 # started, sys.path_importer_cache has a negative result
479 # cached. Clear that cache before trying to import.
480 sys.path_importer_cache.clear()
481
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200482 # Don't try to load extensions for cross builds
Victor Stinner4cbea512019-02-28 17:48:38 +0100483 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200484 return
485
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400486 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700487 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
488 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000489 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400490 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000491 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400492 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000493 self.announce('*** WARNING: renaming "%s" since importing it'
494 ' failed: %s' % (ext.name, why), level=3)
495 assert not self.inplace
496 basename, tail = os.path.splitext(ext_filename)
497 newname = basename + "_failed" + tail
498 if os.path.exists(newname):
499 os.remove(newname)
500 os.rename(ext_filename, newname)
501
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000502 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000503 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000504 self.announce('*** WARNING: importing extension "%s" '
505 'failed with %s: %s' % (ext.name, exc_type, why),
506 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000507 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000508
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400509 def add_multiarch_paths(self):
510 # Debian/Ubuntu multiarch support.
511 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200512 cc = sysconfig.get_config_var('CC')
513 tmpfile = os.path.join(self.build_temp, 'multiarch')
514 if not os.path.exists(self.build_temp):
515 os.makedirs(self.build_temp)
516 ret = os.system(
517 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
518 multiarch_path_component = ''
519 try:
520 if ret >> 8 == 0:
521 with open(tmpfile) as fp:
522 multiarch_path_component = fp.readline().strip()
523 finally:
524 os.unlink(tmpfile)
525
526 if multiarch_path_component != '':
527 add_dir_to_list(self.compiler.library_dirs,
528 '/usr/lib/' + multiarch_path_component)
529 add_dir_to_list(self.compiler.include_dirs,
530 '/usr/include/' + multiarch_path_component)
531 return
532
Barry Warsaw88e19452011-04-07 10:40:36 -0400533 if not find_executable('dpkg-architecture'):
534 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200535 opt = ''
Victor Stinner4cbea512019-02-28 17:48:38 +0100536 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200537 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400538 tmpfile = os.path.join(self.build_temp, 'multiarch')
539 if not os.path.exists(self.build_temp):
540 os.makedirs(self.build_temp)
541 ret = os.system(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200542 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
543 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400544 try:
545 if ret >> 8 == 0:
546 with open(tmpfile) as fp:
547 multiarch_path_component = fp.readline().strip()
548 add_dir_to_list(self.compiler.library_dirs,
549 '/usr/lib/' + multiarch_path_component)
550 add_dir_to_list(self.compiler.include_dirs,
551 '/usr/include/' + multiarch_path_component)
552 finally:
553 os.unlink(tmpfile)
554
pxinwr32f5fdd2019-02-27 19:09:28 +0800555 def add_cross_compiling_paths(self):
556 cc = sysconfig.get_config_var('CC')
557 tmpfile = os.path.join(self.build_temp, 'ccpaths')
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200558 if not os.path.exists(self.build_temp):
559 os.makedirs(self.build_temp)
pxinwr32f5fdd2019-02-27 19:09:28 +0800560 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200561 is_gcc = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800562 is_clang = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200563 in_incdirs = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200564 try:
565 if ret >> 8 == 0:
566 with open(tmpfile) as fp:
567 for line in fp.readlines():
568 if line.startswith("gcc version"):
569 is_gcc = True
pxinwr32f5fdd2019-02-27 19:09:28 +0800570 elif line.startswith("clang version"):
571 is_clang = True
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200572 elif line.startswith("#include <...>"):
573 in_incdirs = True
574 elif line.startswith("End of search list"):
575 in_incdirs = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800576 elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200577 for d in line.strip().split("=")[1].split(":"):
578 d = os.path.normpath(d)
579 if '/gcc/' not in d:
580 add_dir_to_list(self.compiler.library_dirs,
581 d)
pxinwr32f5fdd2019-02-27 19:09:28 +0800582 elif (is_gcc or is_clang) and in_incdirs and '/gcc/' not in line and '/clang/' not in line:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200583 add_dir_to_list(self.compiler.include_dirs,
584 line.strip())
585 finally:
586 os.unlink(tmpfile)
587
Victor Stinnercfe172d2019-03-01 18:21:49 +0100588 def add_ldflags_cppflags(self):
Brett Cannon516592f2004-12-07 00:42:59 +0000589 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000590 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000591 # We must get the values from the Makefile and not the environment
592 # directly since an inconsistently reproducible issue comes up where
593 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000594 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000595 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000596 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
597 ('LDFLAGS', '-L', self.compiler.library_dirs),
598 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000599 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000600 if env_val:
Chih-Hsuan Yen09b2bec2018-07-11 16:48:43 +0800601 parser = argparse.ArgumentParser()
602 parser.add_argument(arg_name, dest="dirs", action="append")
603 options, _ = parser.parse_known_args(env_val.split())
Brett Cannon44837712005-01-02 21:54:07 +0000604 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000605 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000606 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000607
Victor Stinnercfe172d2019-03-01 18:21:49 +0100608 def configure_compiler(self):
609 # Ensure that /usr/local is always used, but the local build
610 # directories (i.e. '.' and 'Include') must be first. See issue
611 # 10520.
612 if not CROSS_COMPILING:
613 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
614 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
615 # only change this for cross builds for 3.3, issues on Mageia
616 if CROSS_COMPILING:
617 self.add_cross_compiling_paths()
618 self.add_multiarch_paths()
619 self.add_ldflags_cppflags()
620
Victor Stinner5ec33a12019-03-01 16:43:28 +0100621 def init_inc_lib_dirs(self):
Victor Stinner4cbea512019-02-28 17:48:38 +0100622 if (not CROSS_COMPILING and
Xavier de Gaye1351c312016-12-14 11:14:33 +0100623 os.path.normpath(sys.base_prefix) != '/usr' and
624 not sysconfig.get_config_var('PYTHONFRAMEWORK')):
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000625 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
626 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
627 # building a framework with different architectures than
628 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000629 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000630 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000631 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000632 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000633
xdegaye77f51392017-11-25 17:25:30 +0100634 system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
635 system_include_dirs = ['/usr/include']
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000636 # lib_dirs and inc_dirs are used to search for files;
637 # if a file is found in one of those directories, it can
638 # be assumed that no additional -I,-L directives are needed.
Victor Stinner4cbea512019-02-28 17:48:38 +0100639 if not CROSS_COMPILING:
Victor Stinner625dbf22019-03-01 15:59:39 +0100640 self.lib_dirs = self.compiler.library_dirs + system_lib_dirs
641 self.inc_dirs = self.compiler.include_dirs + system_include_dirs
Christian Heimesf19529c2012-12-12 12:41:00 +0100642 else:
xdegaye77f51392017-11-25 17:25:30 +0100643 # Add the sysroot paths. 'sysroot' is a compiler option used to
644 # set the logical path of the standard system headers and
645 # libraries.
Victor Stinner625dbf22019-03-01 15:59:39 +0100646 self.lib_dirs = (self.compiler.library_dirs +
647 sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs))
648 self.inc_dirs = (self.compiler.include_dirs +
649 sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'),
650 system_include_dirs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000651
Brett Cannon4454a1f2005-04-15 20:32:39 +0000652 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000653 with open(config_h) as file:
Victor Stinner5ec33a12019-03-01 16:43:28 +0100654 self.config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000655
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000656 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
Victor Stinner4cbea512019-02-28 17:48:38 +0100657 if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']:
Victor Stinner625dbf22019-03-01 15:59:39 +0100658 self.lib_dirs += ['/usr/ccs/lib']
Skip Montanaro22e00c42003-05-06 20:43:34 +0000659
Charles-François Natali5739e102012-04-12 19:07:25 +0200660 # HP-UX11iv3 keeps files in lib/hpux folders.
Victor Stinner4cbea512019-02-28 17:48:38 +0100661 if HOST_PLATFORM == 'hp-ux11':
Victor Stinner625dbf22019-03-01 15:59:39 +0100662 self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
Charles-François Natali5739e102012-04-12 19:07:25 +0200663
Victor Stinner4cbea512019-02-28 17:48:38 +0100664 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000665 # This should work on any unixy platform ;-)
666 # If the user has bothered specifying additional -I and -L flags
667 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000668 #
669 # NOTE: using shlex.split would technically be more correct, but
670 # also gives a bootstrap problem. Let's hope nobody uses
671 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000672 cflags, ldflags = sysconfig.get_config_vars(
673 'CFLAGS', 'LDFLAGS')
674 for item in cflags.split():
675 if item.startswith('-I'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100676 self.inc_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000677
678 for item in ldflags.split():
679 if item.startswith('-L'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100680 self.lib_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000681
Victor Stinner5ec33a12019-03-01 16:43:28 +0100682 def detect_simple_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000683 #
684 # The following modules are all pretty straightforward, and compile
685 # on pretty much any POSIXish platform.
686 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000687
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000688 # array objects
Victor Stinner8058bda2019-03-01 15:31:45 +0100689 self.add(Extension('array', ['arraymodule.c']))
Martin Panterc9deece2016-02-03 05:19:44 +0000690
Yury Selivanovf23746a2018-01-22 19:11:18 -0500691 # Context Variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100692 self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
Yury Selivanovf23746a2018-01-22 19:11:18 -0500693
Martin Panterc9deece2016-02-03 05:19:44 +0000694 shared_math = 'Modules/_math.o'
Victor Stinnercfe172d2019-03-01 18:21:49 +0100695
696 # math library functions, e.g. sin()
697 self.add(Extension('math', ['mathmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100698 extra_objects=[shared_math],
699 depends=['_math.h', shared_math],
700 libraries=['m']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100701
702 # complex math library functions
703 self.add(Extension('cmath', ['cmathmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100704 extra_objects=[shared_math],
705 depends=['_math.h', shared_math],
706 libraries=['m']))
Victor Stinnere0be4232011-10-25 13:06:09 +0200707
708 # time libraries: librt may be needed for clock_gettime()
709 time_libs = []
710 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
711 if lib:
712 time_libs.append(lib)
713
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000714 # time operations and variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100715 self.add(Extension('time', ['timemodule.c'],
716 libraries=time_libs))
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800717 # libm is needed by delta_new() that uses round() and by accum() that
718 # uses modf().
Victor Stinner8058bda2019-03-01 15:31:45 +0100719 self.add(Extension('_datetime', ['_datetimemodule.c'],
720 libraries=['m']))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000721 # random number generator implemented in C
Victor Stinner8058bda2019-03-01 15:31:45 +0100722 self.add(Extension("_random", ["_randommodule.c"]))
Raymond Hettinger0c410272004-01-05 10:13:35 +0000723 # bisect
Victor Stinner8058bda2019-03-01 15:31:45 +0100724 self.add(Extension("_bisect", ["_bisectmodule.c"]))
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000725 # heapq
Victor Stinner8058bda2019-03-01 15:31:45 +0100726 self.add(Extension("_heapq", ["_heapqmodule.c"]))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000727 # C-optimized pickle replacement
Victor Stinner8058bda2019-03-01 15:31:45 +0100728 self.add(Extension("_pickle", ["_pickle.c"]))
Collin Winter670e6922007-03-21 02:57:17 +0000729 # atexit
Victor Stinner8058bda2019-03-01 15:31:45 +0100730 self.add(Extension("atexit", ["atexitmodule.c"]))
Christian Heimes90540002008-05-08 14:29:10 +0000731 # _json speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100732 self.add(Extension("_json", ["_json.c"],
733 # pycore_accu.h requires Py_BUILD_CORE_BUILTIN
734 extra_compile_args=['-DPy_BUILD_CORE_BUILTIN']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100735
Fred Drake0e474a82007-10-11 18:01:43 +0000736 # profiler (_lsprof is for cProfile.py)
Victor Stinner8058bda2019-03-01 15:31:45 +0100737 self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000738 # static Unicode character database
Victor Stinner8058bda2019-03-01 15:31:45 +0100739 self.add(Extension('unicodedata', ['unicodedata.c'],
740 depends=['unicodedata_db.h', 'unicodename_db.h']))
Larry Hastings3a907972013-11-23 14:49:22 -0800741 # _opcode module
Victor Stinner8058bda2019-03-01 15:31:45 +0100742 self.add(Extension('_opcode', ['_opcode.c']))
INADA Naoki9f2ce252016-10-15 15:39:19 +0900743 # asyncio speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100744 self.add(Extension("_asyncio", ["_asynciomodule.c"]))
Ivan Levkivskyi03e3c342018-02-18 12:41:58 +0000745 # _abc speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100746 self.add(Extension("_abc", ["_abc.c"]))
Antoine Pitrou94e16962018-01-16 00:27:16 +0100747 # _queue module
Victor Stinner8058bda2019-03-01 15:31:45 +0100748 self.add(Extension("_queue", ["_queuemodule.c"]))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000749
750 # Modules with some UNIX dependencies -- on by default:
751 # (If you have a really backward UNIX, select and socket may not be
752 # supported...)
753
754 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000755 libs = []
Victor Stinner5ec33a12019-03-01 16:43:28 +0100756 if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
Antoine Pitroua3000072010-09-07 14:52:42 +0000757 # May be necessary on AIX for flock function
758 libs = ['bsd']
Victor Stinner8058bda2019-03-01 15:31:45 +0100759 self.add(Extension('fcntl', ['fcntlmodule.c'],
760 libraries=libs))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000761 # pwd(3)
Victor Stinner8058bda2019-03-01 15:31:45 +0100762 self.add(Extension('pwd', ['pwdmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000763 # grp(3)
pxinwr32f5fdd2019-02-27 19:09:28 +0800764 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100765 self.add(Extension('grp', ['grpmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000766 # spwd, shadow passwords
Victor Stinner5ec33a12019-03-01 16:43:28 +0100767 if (self.config_h_vars.get('HAVE_GETSPNAM', False) or
768 self.config_h_vars.get('HAVE_GETSPENT', False)):
Victor Stinner8058bda2019-03-01 15:31:45 +0100769 self.add(Extension('spwd', ['spwdmodule.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000770 else:
Victor Stinner8058bda2019-03-01 15:31:45 +0100771 self.missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000772
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000773 # select(2); not on ancient System V
Victor Stinner8058bda2019-03-01 15:31:45 +0100774 self.add(Extension('select', ['selectmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000775
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000776 # Fred Drake's interface to the Python parser
Victor Stinner8058bda2019-03-01 15:31:45 +0100777 self.add(Extension('parser', ['parsermodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000778
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000779 # Memory-mapped files (also works on Win32).
Victor Stinner8058bda2019-03-01 15:31:45 +0100780 self.add(Extension('mmap', ['mmapmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000781
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000782 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000783 # syslog daemon interface
Victor Stinner8058bda2019-03-01 15:31:45 +0100784 self.add(Extension('syslog', ['syslogmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000785
Eric Snow7f8bfc92018-01-29 18:23:44 -0700786 # Python interface to subinterpreter C-API.
Eric Snowc11183c2019-03-15 16:35:46 -0600787 self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c']))
Eric Snow7f8bfc92018-01-29 18:23:44 -0700788
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000789 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000790 # Here ends the simple stuff. From here on, modules need certain
791 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000792 #
793
794 # Multimedia modules
795 # These don't work for 64-bit platforms!!!
796 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200797 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000798 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000799 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000800 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200801 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800802 # audioop needs libm for floor() in multiple functions.
Victor Stinner8058bda2019-03-01 15:31:45 +0100803 self.add(Extension('audioop', ['audioop.c'],
804 libraries=['m']))
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000805
Victor Stinner5ec33a12019-03-01 16:43:28 +0100806 # CSV files
807 self.add(Extension('_csv', ['_csv.c']))
808
809 # POSIX subprocess module helper.
810 self.add(Extension('_posixsubprocess', ['_posixsubprocess.c']))
811
Victor Stinnercfe172d2019-03-01 18:21:49 +0100812 def detect_test_extensions(self):
813 # Python C API test module
814 self.add(Extension('_testcapi', ['_testcapimodule.c'],
815 depends=['testcapi_long.h']))
816
817 # Python PEP-3118 (buffer protocol) test module
818 self.add(Extension('_testbuffer', ['_testbuffer.c']))
819
820 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
821 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
822
823 # Test multi-phase extension module init (PEP 489)
824 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
825
826 # Fuzz tests.
827 self.add(Extension('_xxtestfuzz',
828 ['_xxtestfuzz/_xxtestfuzz.c',
829 '_xxtestfuzz/fuzzer.c']))
830
Victor Stinner5ec33a12019-03-01 16:43:28 +0100831 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000832 # readline
Victor Stinner625dbf22019-03-01 15:59:39 +0100833 do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000834 readline_termcap_library = ""
835 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200836 # Cannot use os.popen here in py3k.
837 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
838 if not os.path.exists(self.build_temp):
839 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000840 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200841 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100842 if CROSS_COMPILING:
doko@ubuntu.com58844492012-06-30 18:25:32 +0200843 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
844 % (sysconfig.get_config_var('READELF'),
845 do_readline, tmpfile))
846 elif find_executable('ldd'):
847 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
848 else:
849 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200850 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000851 with open(tmpfile) as fp:
852 for ln in fp:
853 if 'curses' in ln:
854 readline_termcap_library = re.sub(
855 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
856 ).rstrip()
857 break
858 # termcap interface split out from ncurses
859 if 'tinfo' in ln:
860 readline_termcap_library = 'tinfo'
861 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200862 if os.path.exists(tmpfile):
863 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000864 # Issue 7384: If readline is already linked against curses,
865 # use the same library for the readline and curses modules.
866 if 'curses' in readline_termcap_library:
867 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +0100868 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000869 curses_library = 'ncursesw'
Victor Stinner625dbf22019-03-01 15:59:39 +0100870 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000871 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +0100872 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000873 curses_library = 'curses'
874
Victor Stinner4cbea512019-02-28 17:48:38 +0100875 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000876 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000877 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -0700878 if (dep_target and
879 (tuple(int(n) for n in dep_target.split('.')[0:2])
880 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +0000881 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000882 if os_release < 9:
883 # MacOSX 10.4 has a broken readline. Don't try to build
884 # the readline module unless the user has installed a fixed
885 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +0100886 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000887 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000888 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100889 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000890 # In every directory on the search path search for a dynamic
891 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000892 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +0000893 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000894 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000895 readline_extra_link_args = ('-Wl,-search_paths_first',)
896 else:
897 readline_extra_link_args = ()
898
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000899 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000900 if readline_termcap_library:
901 pass # Issue 7384: Already linked against curses or tinfo.
902 elif curses_library:
903 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +0100904 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000905 ['/usr/lib/termcap'],
906 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000907 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +0100908 self.add(Extension('readline', ['readline.c'],
909 library_dirs=['/usr/lib/termcap'],
910 extra_link_args=readline_extra_link_args,
911 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000912 else:
Victor Stinner8058bda2019-03-01 15:31:45 +0100913 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000914
Victor Stinner5ec33a12019-03-01 16:43:28 +0100915 # Curses support, requiring the System V version of curses, often
916 # provided by the ncurses library.
917 curses_defines = []
918 curses_includes = []
919 panel_library = 'panel'
920 if curses_library == 'ncursesw':
921 curses_defines.append(('HAVE_NCURSESW', '1'))
922 if not CROSS_COMPILING:
923 curses_includes.append('/usr/include/ncursesw')
924 # Bug 1464056: If _curses.so links with ncursesw,
925 # _curses_panel.so must link with panelw.
926 panel_library = 'panelw'
927 if MACOS:
928 # On OS X, there is no separate /usr/lib/libncursesw nor
929 # libpanelw. If we are here, we found a locally-supplied
930 # version of libncursesw. There should also be a
931 # libpanelw. _XOPEN_SOURCE defines are usually excluded
932 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
933 # ncurses wide char support
934 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
935 elif MACOS and curses_library == 'ncurses':
936 # Building with the system-suppied combined libncurses/libpanel
937 curses_defines.append(('HAVE_NCURSESW', '1'))
938 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +0000939
Victor Stinnercfe172d2019-03-01 18:21:49 +0100940 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +0100941 if curses_library.startswith('ncurses'):
942 curses_libs = [curses_library]
943 self.add(Extension('_curses', ['_cursesmodule.c'],
944 include_dirs=curses_includes,
945 define_macros=curses_defines,
946 libraries=curses_libs))
947 elif curses_library == 'curses' and not MACOS:
948 # OSX has an old Berkeley curses, not good enough for
949 # the _curses module.
950 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
951 curses_libs = ['curses', 'terminfo']
952 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
953 curses_libs = ['curses', 'termcap']
954 else:
955 curses_libs = ['curses']
956
957 self.add(Extension('_curses', ['_cursesmodule.c'],
958 define_macros=curses_defines,
959 libraries=curses_libs))
960 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +0100961 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +0100962 self.missing.append('_curses')
963
964 # If the curses module is enabled, check for the panel module
Victor Stinnercfe172d2019-03-01 18:21:49 +0100965 if (curses_enabled and
Victor Stinner5ec33a12019-03-01 16:43:28 +0100966 self.compiler.find_library_file(self.lib_dirs, panel_library)):
967 self.add(Extension('_curses_panel', ['_curses_panel.c'],
968 include_dirs=curses_includes,
969 define_macros=curses_defines,
970 libraries=[panel_library, *curses_libs]))
971 else:
972 self.missing.append('_curses_panel')
973
974 def detect_crypt(self):
975 # crypt module.
pxinwr236d0b72019-04-15 17:02:20 +0800976 if VXWORKS:
977 # bpo-31904: crypt() function is not provided by VxWorks.
978 # DES_crypt() OpenSSL provides is too weak to implement
979 # the encryption.
980 return
981
Victor Stinner625dbf22019-03-01 15:59:39 +0100982 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000983 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000984 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000985 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +0800986
pxinwr236d0b72019-04-15 17:02:20 +0800987 self.add(Extension('_crypt', ['_cryptmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100988 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000989
Victor Stinner5ec33a12019-03-01 16:43:28 +0100990 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000991 # socket(2)
pxinwr32f5fdd2019-02-27 19:09:28 +0800992 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100993 self.add(Extension('_socket', ['socketmodule.c'],
994 depends=['socketmodule.h']))
Victor Stinner625dbf22019-03-01 15:59:39 +0100995 elif self.compiler.find_library_file(self.lib_dirs, 'net'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800996 libs = ['net']
Victor Stinner8058bda2019-03-01 15:31:45 +0100997 self.add(Extension('_socket', ['socketmodule.c'],
998 depends=['socketmodule.h'],
999 libraries=libs))
pxinwr32f5fdd2019-02-27 19:09:28 +08001000
Victor Stinner5ec33a12019-03-01 16:43:28 +01001001 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001002 # Modules that provide persistent dictionary-like semantics. You will
1003 # probably want to arrange for at least one of them to be available on
1004 # your machine, though none are defined by default because of library
1005 # dependencies. The Python module dbm/__init__.py provides an
1006 # implementation independent wrapper for these; dbm/dumb.py provides
1007 # similar functionality (but slower of course) implemented in Python.
1008
1009 # Sleepycat^WOracle Berkeley DB interface.
1010 # http://www.oracle.com/database/berkeley-db/db/index.html
1011 #
1012 # This requires the Sleepycat^WOracle DB code. The supported versions
1013 # are set below. Visit the URL above to download
1014 # a release. Most open source OSes come with one or more
1015 # versions of BerkeleyDB already installed.
1016
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001017 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001018 min_db_ver = (3, 3)
1019 db_setup_debug = False # verbose debug prints from this script?
1020
1021 def allow_db_ver(db_ver):
1022 """Returns a boolean if the given BerkeleyDB version is acceptable.
1023
1024 Args:
1025 db_ver: A tuple of the version to verify.
1026 """
1027 if not (min_db_ver <= db_ver <= max_db_ver):
1028 return False
1029 return True
1030
1031 def gen_db_minor_ver_nums(major):
1032 if major == 4:
1033 for x in range(max_db_ver[1]+1):
1034 if allow_db_ver((4, x)):
1035 yield x
1036 elif major == 3:
1037 for x in (3,):
1038 if allow_db_ver((3, x)):
1039 yield x
1040 else:
1041 raise ValueError("unknown major BerkeleyDB version", major)
1042
1043 # construct a list of paths to look for the header file in on
1044 # top of the normal inc_dirs.
1045 db_inc_paths = [
1046 '/usr/include/db4',
1047 '/usr/local/include/db4',
1048 '/opt/sfw/include/db4',
1049 '/usr/include/db3',
1050 '/usr/local/include/db3',
1051 '/opt/sfw/include/db3',
1052 # Fink defaults (http://fink.sourceforge.net/)
1053 '/sw/include/db4',
1054 '/sw/include/db3',
1055 ]
1056 # 4.x minor number specific paths
1057 for x in gen_db_minor_ver_nums(4):
1058 db_inc_paths.append('/usr/include/db4%d' % x)
1059 db_inc_paths.append('/usr/include/db4.%d' % x)
1060 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1061 db_inc_paths.append('/usr/local/include/db4%d' % x)
1062 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1063 db_inc_paths.append('/opt/db-4.%d/include' % x)
1064 # MacPorts default (http://www.macports.org/)
1065 db_inc_paths.append('/opt/local/include/db4%d' % x)
1066 # 3.x minor number specific paths
1067 for x in gen_db_minor_ver_nums(3):
1068 db_inc_paths.append('/usr/include/db3%d' % x)
1069 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1070 db_inc_paths.append('/usr/local/include/db3%d' % x)
1071 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1072 db_inc_paths.append('/opt/db-3.%d/include' % x)
1073
Victor Stinner4cbea512019-02-28 17:48:38 +01001074 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001075 db_inc_paths = []
1076
Georg Brandl489cb4f2009-07-11 10:08:49 +00001077 # Add some common subdirectories for Sleepycat DB to the list,
1078 # based on the standard include directories. This way DB3/4 gets
1079 # picked up when it is installed in a non-standard prefix and
1080 # the user has added that prefix into inc_dirs.
1081 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001082 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001083 std_variants.append(os.path.join(dn, 'db3'))
1084 std_variants.append(os.path.join(dn, 'db4'))
1085 for x in gen_db_minor_ver_nums(4):
1086 std_variants.append(os.path.join(dn, "db4%d"%x))
1087 std_variants.append(os.path.join(dn, "db4.%d"%x))
1088 for x in gen_db_minor_ver_nums(3):
1089 std_variants.append(os.path.join(dn, "db3%d"%x))
1090 std_variants.append(os.path.join(dn, "db3.%d"%x))
1091
1092 db_inc_paths = std_variants + db_inc_paths
1093 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1094
1095 db_ver_inc_map = {}
1096
Victor Stinner4cbea512019-02-28 17:48:38 +01001097 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001098 sysroot = macosx_sdk_root()
1099
Georg Brandl489cb4f2009-07-11 10:08:49 +00001100 class db_found(Exception): pass
1101 try:
1102 # See whether there is a Sleepycat header in the standard
1103 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001104 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001105 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001106 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001107 f = os.path.join(sysroot, d[1:], "db.h")
1108
Georg Brandl489cb4f2009-07-11 10:08:49 +00001109 if db_setup_debug: print("db: looking for db.h in", f)
1110 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001111 with open(f, 'rb') as file:
1112 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001113 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001114 if m:
1115 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001116 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001117 db_minor = int(m.group(1))
1118 db_ver = (db_major, db_minor)
1119
1120 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1121 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001122 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001123 db_patch = int(m.group(1))
1124 if db_patch < 21:
1125 print("db.h:", db_ver, "patch", db_patch,
1126 "being ignored (4.6.x must be >= 4.6.21)")
1127 continue
1128
1129 if ( (db_ver not in db_ver_inc_map) and
1130 allow_db_ver(db_ver) ):
1131 # save the include directory with the db.h version
1132 # (first occurrence only)
1133 db_ver_inc_map[db_ver] = d
1134 if db_setup_debug:
1135 print("db.h: found", db_ver, "in", d)
1136 else:
1137 # we already found a header for this library version
1138 if db_setup_debug: print("db.h: ignoring", d)
1139 else:
1140 # ignore this header, it didn't contain a version number
1141 if db_setup_debug:
1142 print("db.h: no version number version in", d)
1143
1144 db_found_vers = list(db_ver_inc_map.keys())
1145 db_found_vers.sort()
1146
1147 while db_found_vers:
1148 db_ver = db_found_vers.pop()
1149 db_incdir = db_ver_inc_map[db_ver]
1150
1151 # check lib directories parallel to the location of the header
1152 db_dirs_to_check = [
1153 db_incdir.replace("include", 'lib64'),
1154 db_incdir.replace("include", 'lib'),
1155 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001156
Victor Stinner4cbea512019-02-28 17:48:38 +01001157 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001158 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1159
1160 else:
1161 # Same as other branch, but takes OSX SDK into account
1162 tmp = []
1163 for dn in db_dirs_to_check:
1164 if is_macosx_sdk_path(dn):
1165 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1166 tmp.append(dn)
1167 else:
1168 if os.path.isdir(dn):
1169 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001170 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001171
1172 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001173
Ezio Melotti42da6632011-03-15 05:18:48 +02001174 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001175 # XXX should we -ever- look for a dbX name? Do any
1176 # systems really not name their library by version and
1177 # symlink to more general names?
1178 for dblib in (('db-%d.%d' % db_ver),
1179 ('db%d%d' % db_ver),
1180 ('db%d' % db_ver[0])):
1181 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001182 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001183 if dblib_file:
1184 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1185 raise db_found
1186 else:
1187 if db_setup_debug: print("db lib: ", dblib, "not found")
1188
1189 except db_found:
1190 if db_setup_debug:
1191 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1192 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001193 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001194 # Only add the found library and include directories if they aren't
1195 # already being searched. This avoids an explicit runtime library
1196 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001197 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001198 db_incs = None
1199 else:
1200 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001201 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001202 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001203 else:
1204 if db_setup_debug: print("db: no appropriate library found")
1205 db_incs = None
1206 dblibs = []
1207 dblib_dir = None
1208
Victor Stinner5ec33a12019-03-01 16:43:28 +01001209 dbm_setup_debug = False # verbose debug prints from this script?
1210 dbm_order = ['gdbm']
1211 # The standard Unix dbm module:
1212 if not CYGWIN:
1213 config_args = [arg.strip("'")
1214 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1215 dbm_args = [arg for arg in config_args
1216 if arg.startswith('--with-dbmliborder=')]
1217 if dbm_args:
1218 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1219 else:
1220 dbm_order = "ndbm:gdbm:bdb".split(":")
1221 dbmext = None
1222 for cand in dbm_order:
1223 if cand == "ndbm":
1224 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1225 # Some systems have -lndbm, others have -lgdbm_compat,
1226 # others don't have either
1227 if self.compiler.find_library_file(self.lib_dirs,
1228 'ndbm'):
1229 ndbm_libs = ['ndbm']
1230 elif self.compiler.find_library_file(self.lib_dirs,
1231 'gdbm_compat'):
1232 ndbm_libs = ['gdbm_compat']
1233 else:
1234 ndbm_libs = []
1235 if dbm_setup_debug: print("building dbm using ndbm")
1236 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1237 define_macros=[
1238 ('HAVE_NDBM_H',None),
1239 ],
1240 libraries=ndbm_libs)
1241 break
1242
1243 elif cand == "gdbm":
1244 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1245 gdbm_libs = ['gdbm']
1246 if self.compiler.find_library_file(self.lib_dirs,
1247 'gdbm_compat'):
1248 gdbm_libs.append('gdbm_compat')
1249 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1250 if dbm_setup_debug: print("building dbm using gdbm")
1251 dbmext = Extension(
1252 '_dbm', ['_dbmmodule.c'],
1253 define_macros=[
1254 ('HAVE_GDBM_NDBM_H', None),
1255 ],
1256 libraries = gdbm_libs)
1257 break
1258 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1259 if dbm_setup_debug: print("building dbm using gdbm")
1260 dbmext = Extension(
1261 '_dbm', ['_dbmmodule.c'],
1262 define_macros=[
1263 ('HAVE_GDBM_DASH_NDBM_H', None),
1264 ],
1265 libraries = gdbm_libs)
1266 break
1267 elif cand == "bdb":
1268 if dblibs:
1269 if dbm_setup_debug: print("building dbm using bdb")
1270 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1271 library_dirs=dblib_dir,
1272 runtime_library_dirs=dblib_dir,
1273 include_dirs=db_incs,
1274 define_macros=[
1275 ('HAVE_BERKDB_H', None),
1276 ('DB_DBM_HSEARCH', None),
1277 ],
1278 libraries=dblibs)
1279 break
1280 if dbmext is not None:
1281 self.add(dbmext)
1282 else:
1283 self.missing.append('_dbm')
1284
1285 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1286 if ('gdbm' in dbm_order and
1287 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1288 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1289 libraries=['gdbm']))
1290 else:
1291 self.missing.append('_gdbm')
1292
1293 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001294 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001295 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001296
1297 # We hunt for #define SQLITE_VERSION "n.n.n"
1298 # We need to find >= sqlite version 3.0.8
1299 sqlite_incdir = sqlite_libdir = None
1300 sqlite_inc_paths = [ '/usr/include',
1301 '/usr/include/sqlite',
1302 '/usr/include/sqlite3',
1303 '/usr/local/include',
1304 '/usr/local/include/sqlite',
1305 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001306 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001307 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001308 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001309 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1310 MIN_SQLITE_VERSION = ".".join([str(x)
1311 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001312
1313 # Scan the default include directories before the SQLite specific
1314 # ones. This allows one to override the copy of sqlite on OSX,
1315 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001316 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001317 sysroot = macosx_sdk_root()
1318
Victor Stinner625dbf22019-03-01 15:59:39 +01001319 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001320 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001321 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001322 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001323
Ned Deily9b635832012-08-05 15:13:33 -07001324 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001325 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001326 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001327 with open(f) as file:
1328 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001329 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001330 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001331 if m:
1332 sqlite_version = m.group(1)
1333 sqlite_version_tuple = tuple([int(x)
1334 for x in sqlite_version.split(".")])
1335 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1336 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001337 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001338 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001339 sqlite_incdir = d
1340 break
1341 else:
1342 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001343 print("%s: version %d is too old, need >= %s"%(d,
1344 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001345 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001346 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001347
1348 if sqlite_incdir:
1349 sqlite_dirs_to_check = [
1350 os.path.join(sqlite_incdir, '..', 'lib64'),
1351 os.path.join(sqlite_incdir, '..', 'lib'),
1352 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1353 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1354 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001355 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001356 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001357 if sqlite_libfile:
1358 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001359
1360 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001361 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001362 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001363 '_sqlite/cursor.c',
1364 '_sqlite/microprotocols.c',
1365 '_sqlite/module.c',
1366 '_sqlite/prepare_protocol.c',
1367 '_sqlite/row.c',
1368 '_sqlite/statement.c',
1369 '_sqlite/util.c', ]
1370
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001371 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001372 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001373 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1374 else:
1375 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1376
Benjamin Peterson076ed002010-10-31 17:11:02 +00001377 # Enable support for loadable extensions in the sqlite3 module
1378 # if --enable-loadable-sqlite-extensions configure option is used.
1379 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1380 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001381
Victor Stinner4cbea512019-02-28 17:48:38 +01001382 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001383 # In every directory on the search path search for a dynamic
1384 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001385 # for dynamic libraries on the entire path.
1386 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387 # before the dynamic library in /usr/lib.
1388 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1389 else:
1390 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001391
Brett Cannonc5011fe2011-06-06 20:09:10 -07001392 include_dirs = ["Modules/_sqlite"]
1393 # Only include the directory where sqlite was found if it does
1394 # not already exist in set include directories, otherwise you
1395 # can end up with a bad search path order.
1396 if sqlite_incdir not in self.compiler.include_dirs:
1397 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001398 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001399 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001400 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001401 self.add(Extension('_sqlite3', sqlite_srcs,
1402 define_macros=sqlite_defines,
1403 include_dirs=include_dirs,
1404 library_dirs=sqlite_libdir,
1405 extra_link_args=sqlite_extra_link_args,
1406 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001407 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001408 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001409
Victor Stinner5ec33a12019-03-01 16:43:28 +01001410 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001411 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001412 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001413 if not VXWORKS:
1414 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001415 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001416 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001417 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001418 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001419 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001420
Victor Stinner5ec33a12019-03-01 16:43:28 +01001421 # Platform-specific libraries
1422 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1423 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001424 else:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001425 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001426
Victor Stinner5ec33a12019-03-01 16:43:28 +01001427 if MACOS:
1428 self.add(Extension('_scproxy', ['_scproxy.c'],
1429 extra_link_args=[
1430 '-framework', 'SystemConfiguration',
1431 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001432
Victor Stinner5ec33a12019-03-01 16:43:28 +01001433 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001434 # Andrew Kuchling's zlib module. Note that some versions of zlib
1435 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1436 # http://www.cert.org/advisories/CA-2002-07.html
1437 #
1438 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1439 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1440 # now, we still accept 1.1.3, because we think it's difficult to
1441 # exploit this in Python, and we'd rather make it RedHat's problem
1442 # than our problem <wink>.
1443 #
1444 # You can upgrade zlib to version 1.1.4 yourself by going to
1445 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001446 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001447 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001448 if zlib_inc is not None:
1449 zlib_h = zlib_inc[0] + '/zlib.h'
1450 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001451 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001452 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001453 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001454 with open(zlib_h) as fp:
1455 while 1:
1456 line = fp.readline()
1457 if not line:
1458 break
1459 if line.startswith('#define ZLIB_VERSION'):
1460 version = line.split()[2]
1461 break
Guido van Rossume6970912001-04-15 15:16:12 +00001462 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001463 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001464 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001465 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1466 else:
1467 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001468 self.add(Extension('zlib', ['zlibmodule.c'],
1469 libraries=['z'],
1470 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001471 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001472 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001473 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001474 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001475 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001477 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001478
Christian Heimes1dc54002008-03-24 02:19:29 +00001479 # Helper module for various ascii-encoders. Uses zlib for an optimized
1480 # crc32 if we have it. Otherwise binascii uses its own.
1481 if have_zlib:
1482 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1483 libraries = ['z']
1484 extra_link_args = zlib_extra_link_args
1485 else:
1486 extra_compile_args = []
1487 libraries = []
1488 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001489 self.add(Extension('binascii', ['binascii.c'],
1490 extra_compile_args=extra_compile_args,
1491 libraries=libraries,
1492 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001493
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001494 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001495 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001496 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001497 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1498 else:
1499 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001500 self.add(Extension('_bz2', ['_bz2module.c'],
1501 libraries=['bz2'],
1502 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001503 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001504 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001505
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001506 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001507 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001508 self.add(Extension('_lzma', ['_lzmamodule.c'],
1509 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001510 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001511 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001512
Victor Stinner5ec33a12019-03-01 16:43:28 +01001513 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001514 # Interface to the Expat XML parser
1515 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001516 # Expat was written by James Clark and is now maintained by a group of
1517 # developers on SourceForge; see www.libexpat.org for more information.
1518 # The pyexpat module was written by Paul Prescod after a prototype by
1519 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1520 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001521 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001522 #
1523 # More information on Expat can be found at www.libexpat.org.
1524 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001525 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1526 expat_inc = []
1527 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001528 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001529 expat_lib = ['expat']
1530 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001531 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001532 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001533 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001534 define_macros = [
1535 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001536 # bpo-30947: Python uses best available entropy sources to
1537 # call XML_SetHashSalt(), expat entropy sources are not needed
1538 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001539 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001540 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001541 expat_lib = []
1542 expat_sources = ['expat/xmlparse.c',
1543 'expat/xmlrole.c',
1544 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001545 expat_depends = ['expat/ascii.h',
1546 'expat/asciitab.h',
1547 'expat/expat.h',
1548 'expat/expat_config.h',
1549 'expat/expat_external.h',
1550 'expat/internal.h',
1551 'expat/latin1tab.h',
1552 'expat/utf8tab.h',
1553 'expat/xmlrole.h',
1554 'expat/xmltok.h',
1555 'expat/xmltok_impl.h'
1556 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001557
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001558 cc = sysconfig.get_config_var('CC').split()[0]
1559 ret = os.system(
1560 '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc)
1561 if ret >> 8 == 0:
1562 extra_compile_args.append('-Wno-implicit-fallthrough')
1563
Victor Stinner8058bda2019-03-01 15:31:45 +01001564 self.add(Extension('pyexpat',
1565 define_macros=define_macros,
1566 extra_compile_args=extra_compile_args,
1567 include_dirs=expat_inc,
1568 libraries=expat_lib,
1569 sources=['pyexpat.c'] + expat_sources,
1570 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001571
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001572 # Fredrik Lundh's cElementTree module. Note that this also
1573 # uses expat (via the CAPI hook in pyexpat).
1574
Victor Stinner625dbf22019-03-01 15:59:39 +01001575 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001576 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001577 self.add(Extension('_elementtree',
1578 define_macros=define_macros,
1579 include_dirs=expat_inc,
1580 libraries=expat_lib,
1581 sources=['_elementtree.c'],
1582 depends=['pyexpat.c', *expat_sources,
1583 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001584 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001585 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001586
Victor Stinner5ec33a12019-03-01 16:43:28 +01001587 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001588 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001589 self.add(Extension('_multibytecodec',
1590 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001591 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001592 self.add(Extension('_codecs_%s' % loc,
1593 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001594
Victor Stinner5ec33a12019-03-01 16:43:28 +01001595 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001596 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001597 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001598 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1599 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001600
1601 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001602 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001603 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1604 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001605 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001606 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1607 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001608 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001609 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001610 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1611 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001612 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001613 self.add(Extension('_posixshmem', posixshmem_srcs,
1614 define_macros={},
1615 libraries=libs,
1616 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001617
Victor Stinner8058bda2019-03-01 15:31:45 +01001618 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001619 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001620
Victor Stinner5ec33a12019-03-01 16:43:28 +01001621 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001622 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001623 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001624 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001625 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001626 uuid_libs = ['uuid']
1627 else:
1628 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001629 self.add(Extension('_uuid', ['_uuidmodule.c'],
1630 libraries=uuid_libs,
1631 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001632 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001633 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001634
Victor Stinner5ec33a12019-03-01 16:43:28 +01001635 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001636 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001637 self.init_inc_lib_dirs()
1638
1639 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001640 if TEST_EXTENSIONS:
1641 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001642 self.detect_readline_curses()
1643 self.detect_crypt()
1644 self.detect_socket()
1645 self.detect_openssl_hashlib()
xdegaye2ee077f2019-04-09 17:20:08 +02001646 self.detect_hash_builtins()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001647 self.detect_dbm_gdbm()
1648 self.detect_sqlite()
1649 self.detect_platform_specific_exts()
1650 self.detect_nis()
1651 self.detect_compress_exts()
1652 self.detect_expat_elementtree()
1653 self.detect_multibytecodecs()
1654 self.detect_decimal()
1655 self.detect_ctypes()
1656 self.detect_multiprocessing()
1657 if not self.detect_tkinter():
1658 self.missing.append('_tkinter')
1659 self.detect_uuid()
1660
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001661## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001662## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001663
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001664 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001665 self.add(Extension('xxlimited', ['xxlimited.c'],
1666 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001667
Ned Deilyd819b932013-09-06 01:07:05 -07001668 def detect_tkinter_explicitly(self):
1669 # Build _tkinter using explicit locations for Tcl/Tk.
1670 #
1671 # This is enabled when both arguments are given to ./configure:
1672 #
1673 # --with-tcltk-includes="-I/path/to/tclincludes \
1674 # -I/path/to/tkincludes"
1675 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1676 # -L/path/to/tklibs -ltkm.n"
1677 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001678 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001679 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1680 #
1681 # This can be useful for building and testing tkinter with multiple
1682 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1683 # build of Tcl so you need to specify both arguments and use care when
1684 # overriding.
1685
1686 # The _TCLTK variables are created in the Makefile sharedmods target.
1687 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1688 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1689 if not (tcltk_includes and tcltk_libs):
1690 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001691 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001692
1693 extra_compile_args = tcltk_includes.split()
1694 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001695 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1696 define_macros=[('WITH_APPINIT', 1)],
1697 extra_compile_args = extra_compile_args,
1698 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001699 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001700
Victor Stinner625dbf22019-03-01 15:59:39 +01001701 def detect_tkinter_darwin(self):
Jack Jansen0b06be72002-06-21 14:48:38 +00001702 # The _tkinter module, using frameworks. Since frameworks are quite
1703 # different the UNIX search logic is not sharable.
1704 from os.path import join, exists
1705 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001706 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001707 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001708 join(os.getenv('HOME'), '/Library/Frameworks')
1709 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001710
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001711 sysroot = macosx_sdk_root()
1712
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001713 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001714 # bundles.
1715 # XXX distutils should support -F!
1716 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001717 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001718
1719
Jack Jansen0b06be72002-06-21 14:48:38 +00001720 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001721 if is_macosx_sdk_path(F):
1722 if not exists(join(sysroot, F[1:], fw + '.framework')):
1723 break
1724 else:
1725 if not exists(join(F, fw + '.framework')):
1726 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001727 else:
1728 # ok, F is now directory with both frameworks. Continure
1729 # building
1730 break
1731 else:
1732 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1733 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001734 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001735
Jack Jansen0b06be72002-06-21 14:48:38 +00001736 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1737 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001738 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001739 #
1740 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001741 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001742 for fw in ('Tcl', 'Tk')
1743 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001744 ]
1745
Tim Peters2c60f7a2003-01-29 03:49:43 +00001746 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001747 # complicated search, this is a hard-coded path. It could bail out
1748 # if X11 libs are not found...
1749 include_dirs.append('/usr/X11R6/include')
1750 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1751
Georg Brandlfcaf9102008-07-16 02:17:56 +00001752 # All existing framework builds of Tcl/Tk don't support 64-bit
1753 # architectures.
1754 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001755 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001756
Ronald Oussorend097efe2009-09-15 19:07:58 +00001757 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1758 if not os.path.exists(self.build_temp):
1759 os.makedirs(self.build_temp)
1760
1761 # Note: cannot use os.popen or subprocess here, that
1762 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001763 if is_macosx_sdk_path(F):
1764 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1765 else:
1766 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001767
Brett Cannon9f5db072010-10-29 20:19:27 +00001768 with open(tmpfile) as fp:
1769 detected_archs = []
1770 for ln in fp:
1771 a = ln.split()[-1]
1772 if a in archs:
1773 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001774 os.unlink(tmpfile)
1775
1776 for a in detected_archs:
1777 frameworks.append('-arch')
1778 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001779
Victor Stinnercfe172d2019-03-01 18:21:49 +01001780 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1781 define_macros=[('WITH_APPINIT', 1)],
1782 include_dirs=include_dirs,
1783 libraries=[],
1784 extra_compile_args=frameworks[2:],
1785 extra_link_args=frameworks))
Victor Stinner4cbea512019-02-28 17:48:38 +01001786 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001787
Victor Stinner625dbf22019-03-01 15:59:39 +01001788 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001789 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001790
Ned Deilyd819b932013-09-06 01:07:05 -07001791 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1792 # configured or passed into the make target. If so, use these values
1793 # to build tkinter and bypass the searches for Tcl and TK in standard
1794 # locations.
1795 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01001796 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001797
Jack Jansen0b06be72002-06-21 14:48:38 +00001798 # Rather than complicate the code below, detecting and building
1799 # AquaTk is a separate method. Only one Tkinter will be built on
1800 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01001801 if (MACOS and self.detect_tkinter_darwin()):
1802 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001803
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001804 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001805 # The versions with dots are used on Unix, and the versions without
1806 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001807 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001808 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1809 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01001810 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001811 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01001812 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001813 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001814 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001815 # Exit the loop when we've found the Tcl/Tk libraries
1816 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001817
Fredrik Lundhade711a2001-01-24 08:00:28 +00001818 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001819 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001820 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001821 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001822 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01001823 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001824 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1825 # but the include subdirs are named like .../include/tcl8.3.
1826 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1827 tcl_include_sub = []
1828 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001829 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001830 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1831 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1832 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01001833 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
1834 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001835
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001836 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001837 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001838 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01001839 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00001840
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001841 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001842
Victor Stinnercfe172d2019-03-01 18:21:49 +01001843 include_dirs = []
1844 libs = []
1845 defs = []
1846 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001847 for dir in tcl_includes + tk_includes:
1848 if dir not in include_dirs:
1849 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001850
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001851 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01001852 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001853 include_dirs.append('/usr/openwin/include')
1854 added_lib_dirs.append('/usr/openwin/lib')
1855 elif os.path.exists('/usr/X11R6/include'):
1856 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001857 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001858 added_lib_dirs.append('/usr/X11R6/lib')
1859 elif os.path.exists('/usr/X11R5/include'):
1860 include_dirs.append('/usr/X11R5/include')
1861 added_lib_dirs.append('/usr/X11R5/lib')
1862 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001863 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001864 include_dirs.append('/usr/X11/include')
1865 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001866
Jason Tishler9181c942003-02-05 15:16:17 +00001867 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01001868 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00001869 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1870 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001871 return False
Jason Tishler9181c942003-02-05 15:16:17 +00001872
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001873 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01001874 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001875 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001876 defs.append( ('WITH_BLT', 1) )
1877 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01001878 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001879 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001880 defs.append( ('WITH_BLT', 1) )
1881 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001882
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001883 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001884 libs.append('tk'+ version)
1885 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001886
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001887 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01001888 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001889 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001890
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001891 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001892 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001893 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001894 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001895 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001896 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001897 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001898
Victor Stinnercfe172d2019-03-01 18:21:49 +01001899 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1900 define_macros=[('WITH_APPINIT', 1)] + defs,
1901 include_dirs=include_dirs,
1902 libraries=libs,
1903 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01001904 return True
1905
Christian Heimes78644762008-03-04 23:39:23 +00001906 def configure_ctypes_darwin(self, ext):
1907 # Darwin (OS X) uses preconfigured files, in
1908 # the Modules/_ctypes/libffi_osx directory.
Victor Stinner625dbf22019-03-01 15:59:39 +01001909 ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules',
Christian Heimes78644762008-03-04 23:39:23 +00001910 '_ctypes', 'libffi_osx'))
1911 sources = [os.path.join(ffi_srcdir, p)
1912 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001913 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001914 'x86/x86-darwin.S',
1915 'x86/x86-ffi_darwin.c',
1916 'x86/x86-ffi64.c',
1917 'powerpc/ppc-darwin.S',
1918 'powerpc/ppc-darwin_closure.S',
1919 'powerpc/ppc-ffi_darwin.c',
1920 'powerpc/ppc64-darwin_closure.S',
1921 ]]
1922
1923 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001924 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001925
1926 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1927 os.path.join(ffi_srcdir, 'powerpc')]
1928 ext.include_dirs.extend(include_dirs)
1929 ext.sources.extend(sources)
1930 return True
1931
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001932 def configure_ctypes(self, ext):
1933 if not self.use_system_libffi:
Victor Stinner4cbea512019-02-28 17:48:38 +01001934 if MACOS:
Christian Heimes78644762008-03-04 23:39:23 +00001935 return self.configure_ctypes_darwin(ext)
Zachary Waref40d4dd2016-09-17 01:25:24 -05001936 print('INFO: Could not locate ffi libs and/or headers')
1937 return False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001938 return True
1939
Victor Stinner625dbf22019-03-01 15:59:39 +01001940 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001941 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001942 self.use_system_libffi = False
1943 include_dirs = []
1944 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001945 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001946 sources = ['_ctypes/_ctypes.c',
1947 '_ctypes/callbacks.c',
1948 '_ctypes/callproc.c',
1949 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001950 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001951 depends = ['_ctypes/ctypes.h']
1952
Victor Stinner4cbea512019-02-28 17:48:38 +01001953 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00001954 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001955 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001956 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001957 include_dirs.append('_ctypes/darwin')
Victor Stinner5ec33a12019-03-01 16:43:28 +01001958 # XXX Is this still needed?
1959 # extra_link_args.extend(['-read_only_relocs', 'warning'])
Thomas Hellercf567c12006-03-08 19:51:58 +00001960
Victor Stinner4cbea512019-02-28 17:48:38 +01001961 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001962 # XXX This shouldn't be necessary; it appears that some
1963 # of the assembler code is non-PIC (i.e. it has relocations
1964 # when it shouldn't. The proper fix would be to rewrite
1965 # the assembler code to be PIC.
1966 # This only works with GCC; the Sun compiler likely refuses
1967 # this option. If you want to compile ctypes with the Sun
1968 # compiler, please research a proper solution, instead of
1969 # finding some -z option for the Sun compiler.
1970 extra_link_args.append('-mimpure-text')
1971
Victor Stinner4cbea512019-02-28 17:48:38 +01001972 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001973 extra_link_args.append('-fPIC')
1974
Thomas Hellercf567c12006-03-08 19:51:58 +00001975 ext = Extension('_ctypes',
1976 include_dirs=include_dirs,
1977 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001978 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001979 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001980 sources=sources,
1981 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01001982 self.add(ext)
1983 if TEST_EXTENSIONS:
1984 # function my_sqrt() needs libm for sqrt()
1985 self.add(Extension('_ctypes_test',
1986 sources=['_ctypes/_ctypes_test.c'],
1987 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00001988
Victor Stinner625dbf22019-03-01 15:59:39 +01001989 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01001990 if MACOS:
Zachary Ware935043d2016-09-09 17:01:21 -07001991 if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
1992 return
Christian Heimes78644762008-03-04 23:39:23 +00001993 # OS X 10.5 comes with libffi.dylib; the include files are
1994 # in /usr/include/ffi
Victor Stinner96d81582019-03-01 13:53:46 +01001995 ffi_inc_dirs.append('/usr/include/ffi')
Christian Heimes78644762008-03-04 23:39:23 +00001996
Benjamin Petersond78735d2010-01-01 16:04:23 +00001997 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001998 if not ffi_inc or ffi_inc[0] == '':
Victor Stinner96d81582019-03-01 13:53:46 +01001999 ffi_inc = find_file('ffi.h', [], ffi_inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002000 if ffi_inc is not None:
2001 ffi_h = ffi_inc[0] + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002002 if not os.path.exists(ffi_h):
2003 ffi_inc = None
2004 print('Header file {} does not exist'.format(ffi_h))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002005 ffi_lib = None
2006 if ffi_inc is not None:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002007 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002008 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002009 ffi_lib = lib_name
2010 break
2011
2012 if ffi_inc and ffi_lib:
2013 ext.include_dirs.extend(ffi_inc)
2014 ext.libraries.append(ffi_lib)
2015 self.use_system_libffi = True
2016
Christian Heimes5bb96922018-02-25 10:22:14 +01002017 if sysconfig.get_config_var('HAVE_LIBDL'):
2018 # for dlopen, see bpo-32647
2019 ext.libraries.append('dl')
2020
Victor Stinner5ec33a12019-03-01 16:43:28 +01002021 def detect_decimal(self):
2022 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002023 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002024 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002025 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2026 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002027 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002028 sources = ['_decimal/_decimal.c']
2029 depends = ['_decimal/docstrings.h']
2030 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002031 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002032 'Modules',
2033 '_decimal',
2034 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002035 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002036 sources = [
2037 '_decimal/_decimal.c',
2038 '_decimal/libmpdec/basearith.c',
2039 '_decimal/libmpdec/constants.c',
2040 '_decimal/libmpdec/context.c',
2041 '_decimal/libmpdec/convolute.c',
2042 '_decimal/libmpdec/crt.c',
2043 '_decimal/libmpdec/difradix2.c',
2044 '_decimal/libmpdec/fnt.c',
2045 '_decimal/libmpdec/fourstep.c',
2046 '_decimal/libmpdec/io.c',
2047 '_decimal/libmpdec/memory.c',
2048 '_decimal/libmpdec/mpdecimal.c',
2049 '_decimal/libmpdec/numbertheory.c',
2050 '_decimal/libmpdec/sixstep.c',
2051 '_decimal/libmpdec/transpose.c',
2052 ]
2053 depends = [
2054 '_decimal/docstrings.h',
2055 '_decimal/libmpdec/basearith.h',
2056 '_decimal/libmpdec/bits.h',
2057 '_decimal/libmpdec/constants.h',
2058 '_decimal/libmpdec/convolute.h',
2059 '_decimal/libmpdec/crt.h',
2060 '_decimal/libmpdec/difradix2.h',
2061 '_decimal/libmpdec/fnt.h',
2062 '_decimal/libmpdec/fourstep.h',
2063 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002064 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002065 '_decimal/libmpdec/mpdecimal.h',
2066 '_decimal/libmpdec/numbertheory.h',
2067 '_decimal/libmpdec/sixstep.h',
2068 '_decimal/libmpdec/transpose.h',
2069 '_decimal/libmpdec/typearith.h',
2070 '_decimal/libmpdec/umodarith.h',
2071 ]
2072
Stefan Krah1919b7e2012-03-21 18:25:23 +01002073 config = {
2074 'x64': [('CONFIG_64','1'), ('ASM','1')],
2075 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2076 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2077 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2078 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2079 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2080 ('LEGACY_COMPILER','1')],
2081 'universal': [('UNIVERSAL','1')]
2082 }
2083
Stefan Krah1919b7e2012-03-21 18:25:23 +01002084 cc = sysconfig.get_config_var('CC')
2085 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2086 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2087
2088 if machine:
2089 # Override automatic configuration to facilitate testing.
2090 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002091 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002092 # Universal here means: build with the same options Python
2093 # was built with.
2094 define_macros = config['universal']
2095 elif sizeof_size_t == 8:
2096 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2097 define_macros = config['x64']
2098 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2099 define_macros = config['uint128']
2100 else:
2101 define_macros = config['ansi64']
2102 elif sizeof_size_t == 4:
2103 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2104 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002105 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002106 # solaris: problems with register allocation.
2107 # icc >= 11.0 works as well.
2108 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002109 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002110 else:
2111 define_macros = config['ansi32']
2112 else:
2113 raise DistutilsError("_decimal: unsupported architecture")
2114
2115 # Workarounds for toolchain bugs:
2116 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2117 # Some versions of gcc miscompile inline asm:
2118 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2119 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2120 extra_compile_args.append('-fno-ipa-pure-const')
2121 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2122 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2123 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2124 undef_macros.append('_FORTIFY_SOURCE')
2125
Stefan Krah1919b7e2012-03-21 18:25:23 +01002126 # Uncomment for extra functionality:
2127 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002128 self.add(Extension('_decimal',
2129 include_dirs=include_dirs,
2130 libraries=libraries,
2131 define_macros=define_macros,
2132 undef_macros=undef_macros,
2133 extra_compile_args=extra_compile_args,
2134 sources=sources,
2135 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002136
Victor Stinner5ec33a12019-03-01 16:43:28 +01002137 def detect_openssl_hashlib(self):
2138 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002139 config_vars = sysconfig.get_config_vars()
2140
2141 def split_var(name, sep):
2142 # poor man's shlex, the re module is not available yet.
2143 value = config_vars.get(name)
2144 if not value:
2145 return ()
2146 # This trick works because ax_check_openssl uses --libs-only-L,
2147 # --libs-only-l, and --cflags-only-I.
2148 value = ' ' + value
2149 sep = ' ' + sep
2150 return [v.strip() for v in value.split(sep) if v.strip()]
2151
2152 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2153 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2154 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2155 if not openssl_libs:
2156 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002157 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002158 return None, None
2159
2160 # Find OpenSSL includes
2161 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002162 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002163 )
2164 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002165 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002166 return None, None
2167
2168 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2169 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002170 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002171 ['/usr/kerberos/include']
2172 )
2173 if krb5_h:
2174 ssl_incs.extend(krb5_h)
2175
Christian Heimes61d478c2018-01-27 15:51:38 +01002176 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Victor Stinner8058bda2019-03-01 15:31:45 +01002177 self.add(Extension('_ssl', ['_ssl.c'],
2178 include_dirs=openssl_includes,
2179 library_dirs=openssl_libdirs,
2180 libraries=openssl_libs,
2181 depends=['socketmodule.h']))
Christian Heimes61d478c2018-01-27 15:51:38 +01002182 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002183 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002184
Victor Stinner8058bda2019-03-01 15:31:45 +01002185 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2186 depends=['hashlib.h'],
2187 include_dirs=openssl_includes,
2188 library_dirs=openssl_libdirs,
2189 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002190
xdegaye2ee077f2019-04-09 17:20:08 +02002191 def detect_hash_builtins(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002192 # We always compile these even when OpenSSL is available (issue #14693).
2193 # It's harmless and the object code is tiny (40-50 KiB per module,
2194 # only loaded when actually used).
2195 self.add(Extension('_sha256', ['sha256module.c'],
2196 depends=['hashlib.h']))
2197 self.add(Extension('_sha512', ['sha512module.c'],
2198 depends=['hashlib.h']))
2199 self.add(Extension('_md5', ['md5module.c'],
2200 depends=['hashlib.h']))
2201 self.add(Extension('_sha1', ['sha1module.c'],
2202 depends=['hashlib.h']))
2203
2204 blake2_deps = glob(os.path.join(self.srcdir,
2205 'Modules/_blake2/impl/*'))
2206 blake2_deps.append('hashlib.h')
2207
2208 self.add(Extension('_blake2',
2209 ['_blake2/blake2module.c',
2210 '_blake2/blake2b_impl.c',
2211 '_blake2/blake2s_impl.c'],
2212 depends=blake2_deps))
2213
2214 sha3_deps = glob(os.path.join(self.srcdir,
2215 'Modules/_sha3/kcp/*'))
2216 sha3_deps.append('hashlib.h')
2217 self.add(Extension('_sha3',
2218 ['_sha3/sha3module.c'],
2219 depends=sha3_deps))
2220
2221 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002222 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002223 self.missing.append('nis')
2224 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002225
2226 libs = []
2227 library_dirs = []
2228 includes_dirs = []
2229
2230 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2231 # moved headers and libraries to libtirpc and libnsl. The headers
2232 # are in tircp and nsl sub directories.
2233 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002234 'rpcsvc/yp_prot.h', self.inc_dirs,
2235 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002236 )
2237 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002238 'rpc/rpc.h', self.inc_dirs,
2239 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002240 )
2241 if rpcsvc_inc is None or rpc_inc is None:
2242 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002243 self.missing.append('nis')
2244 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002245 includes_dirs.extend(rpcsvc_inc)
2246 includes_dirs.extend(rpc_inc)
2247
Victor Stinner625dbf22019-03-01 15:59:39 +01002248 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002249 libs.append('nsl')
2250 else:
2251 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002252 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002253 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2254 if libnsl is not None:
2255 library_dirs.append(os.path.dirname(libnsl))
2256 libs.append('nsl')
2257
Victor Stinner625dbf22019-03-01 15:59:39 +01002258 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002259 libs.append('tirpc')
2260
Victor Stinner8058bda2019-03-01 15:31:45 +01002261 self.add(Extension('nis', ['nismodule.c'],
2262 libraries=libs,
2263 library_dirs=library_dirs,
2264 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002265
Christian Heimesff5be6e2018-01-20 13:19:21 +01002266
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002267class PyBuildInstall(install):
2268 # Suppress the warning about installation into the lib_dynload
2269 # directory, which is not in sys.path when running Python during
2270 # installation:
2271 def initialize_options (self):
2272 install.initialize_options(self)
2273 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002274
Éric Araujoe6792c12011-06-09 14:07:02 +02002275 # Customize subcommands to not install an egg-info file for Python
2276 sub_commands = [('install_lib', install.has_lib),
2277 ('install_headers', install.has_headers),
2278 ('install_scripts', install.has_scripts),
2279 ('install_data', install.has_data)]
2280
2281
Michael W. Hudson529a5052002-12-17 16:47:17 +00002282class PyBuildInstallLib(install_lib):
2283 # Do exactly what install_lib does but make sure correct access modes get
2284 # set on installed directories and files. All installed files with get
2285 # mode 644 unless they are a shared library in which case they will get
2286 # mode 755. All installed directories will get mode 755.
2287
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002288 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2289 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002290
2291 def install(self):
2292 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002293 self.set_file_modes(outfiles, 0o644, 0o755)
2294 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002295 return outfiles
2296
2297 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002298 if not files: return
2299
2300 for filename in files:
2301 if os.path.islink(filename): continue
2302 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002303 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002304 log.info("changing mode of %s to %o", filename, mode)
2305 if not self.dry_run: os.chmod(filename, mode)
2306
2307 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002308 for dirpath, dirnames, fnames in os.walk(dirname):
2309 if os.path.islink(dirpath):
2310 continue
2311 log.info("changing mode of %s to %o", dirpath, mode)
2312 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002313
Victor Stinnerc991f242019-03-01 17:19:04 +01002314
Georg Brandlff52f762010-12-28 09:51:43 +00002315class PyBuildScripts(build_scripts):
2316 def copy_scripts(self):
2317 outfiles, updated_files = build_scripts.copy_scripts(self)
2318 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2319 minoronly = '.{0[1]}'.format(sys.version_info)
2320 newoutfiles = []
2321 newupdated_files = []
2322 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002323 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002324 newfilename = filename + fullversion
2325 else:
2326 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002327 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002328 os.rename(filename, newfilename)
2329 newoutfiles.append(newfilename)
2330 if filename in updated_files:
2331 newupdated_files.append(newfilename)
2332 return newoutfiles, newupdated_files
2333
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002334
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002335def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002336 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2337 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2338
2339 class DummyProcess:
2340 """Hack for parallel build"""
2341 ProcessPoolExecutor = None
2342
2343 sys.modules['concurrent.futures.process'] = DummyProcess
2344
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002345 # turn off warnings when deprecated modules are imported
2346 import warnings
2347 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002348 setup(# PyPI Metadata (PEP 301)
2349 name = "Python",
2350 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002351 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002352 maintainer = "Guido van Rossum and the Python community",
2353 maintainer_email = "python-dev@python.org",
2354 description = "A high-level object-oriented programming language",
2355 long_description = SUMMARY.strip(),
2356 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002357 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002358 platforms = ["Many"],
2359
2360 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002361 cmdclass = {'build_ext': PyBuildExt,
2362 'build_scripts': PyBuildScripts,
2363 'install': PyBuildInstall,
2364 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002365 # The struct module is defined here, because build_ext won't be
2366 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002367 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002368
Georg Brandlff52f762010-12-28 09:51:43 +00002369 # If you change the scripts installed here, you also need to
2370 # check the PyBuildScripts command above, and change the links
2371 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002372 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002373 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002374 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002375
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002376# --install-platlib
2377if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002378 main()