blob: 30caed5b51c1ea78740487e56489e52f8bd11476 [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.
Victor Stinner625dbf22019-03-01 15:59:39 +0100976 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000977 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000978 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000979 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +0800980
981 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100982 self.add(Extension('_crypt', ['_cryptmodule.c'],
983 libraries=libs))
Victor Stinner625dbf22019-03-01 15:59:39 +0100984 elif self.compiler.find_library_file(self.lib_dirs, 'OPENSSL'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800985 libs = ['OPENSSL']
Victor Stinner8058bda2019-03-01 15:31:45 +0100986 self.add(Extension('_crypt', ['_cryptmodule.c'],
987 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000988
Victor Stinner5ec33a12019-03-01 16:43:28 +0100989 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000990 # socket(2)
pxinwr32f5fdd2019-02-27 19:09:28 +0800991 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100992 self.add(Extension('_socket', ['socketmodule.c'],
993 depends=['socketmodule.h']))
Victor Stinner625dbf22019-03-01 15:59:39 +0100994 elif self.compiler.find_library_file(self.lib_dirs, 'net'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800995 libs = ['net']
Victor Stinner8058bda2019-03-01 15:31:45 +0100996 self.add(Extension('_socket', ['socketmodule.c'],
997 depends=['socketmodule.h'],
998 libraries=libs))
pxinwr32f5fdd2019-02-27 19:09:28 +0800999
Victor Stinner5ec33a12019-03-01 16:43:28 +01001000 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001001 # Modules that provide persistent dictionary-like semantics. You will
1002 # probably want to arrange for at least one of them to be available on
1003 # your machine, though none are defined by default because of library
1004 # dependencies. The Python module dbm/__init__.py provides an
1005 # implementation independent wrapper for these; dbm/dumb.py provides
1006 # similar functionality (but slower of course) implemented in Python.
1007
1008 # Sleepycat^WOracle Berkeley DB interface.
1009 # http://www.oracle.com/database/berkeley-db/db/index.html
1010 #
1011 # This requires the Sleepycat^WOracle DB code. The supported versions
1012 # are set below. Visit the URL above to download
1013 # a release. Most open source OSes come with one or more
1014 # versions of BerkeleyDB already installed.
1015
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001016 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001017 min_db_ver = (3, 3)
1018 db_setup_debug = False # verbose debug prints from this script?
1019
1020 def allow_db_ver(db_ver):
1021 """Returns a boolean if the given BerkeleyDB version is acceptable.
1022
1023 Args:
1024 db_ver: A tuple of the version to verify.
1025 """
1026 if not (min_db_ver <= db_ver <= max_db_ver):
1027 return False
1028 return True
1029
1030 def gen_db_minor_ver_nums(major):
1031 if major == 4:
1032 for x in range(max_db_ver[1]+1):
1033 if allow_db_ver((4, x)):
1034 yield x
1035 elif major == 3:
1036 for x in (3,):
1037 if allow_db_ver((3, x)):
1038 yield x
1039 else:
1040 raise ValueError("unknown major BerkeleyDB version", major)
1041
1042 # construct a list of paths to look for the header file in on
1043 # top of the normal inc_dirs.
1044 db_inc_paths = [
1045 '/usr/include/db4',
1046 '/usr/local/include/db4',
1047 '/opt/sfw/include/db4',
1048 '/usr/include/db3',
1049 '/usr/local/include/db3',
1050 '/opt/sfw/include/db3',
1051 # Fink defaults (http://fink.sourceforge.net/)
1052 '/sw/include/db4',
1053 '/sw/include/db3',
1054 ]
1055 # 4.x minor number specific paths
1056 for x in gen_db_minor_ver_nums(4):
1057 db_inc_paths.append('/usr/include/db4%d' % x)
1058 db_inc_paths.append('/usr/include/db4.%d' % x)
1059 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1060 db_inc_paths.append('/usr/local/include/db4%d' % x)
1061 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1062 db_inc_paths.append('/opt/db-4.%d/include' % x)
1063 # MacPorts default (http://www.macports.org/)
1064 db_inc_paths.append('/opt/local/include/db4%d' % x)
1065 # 3.x minor number specific paths
1066 for x in gen_db_minor_ver_nums(3):
1067 db_inc_paths.append('/usr/include/db3%d' % x)
1068 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1069 db_inc_paths.append('/usr/local/include/db3%d' % x)
1070 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1071 db_inc_paths.append('/opt/db-3.%d/include' % x)
1072
Victor Stinner4cbea512019-02-28 17:48:38 +01001073 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001074 db_inc_paths = []
1075
Georg Brandl489cb4f2009-07-11 10:08:49 +00001076 # Add some common subdirectories for Sleepycat DB to the list,
1077 # based on the standard include directories. This way DB3/4 gets
1078 # picked up when it is installed in a non-standard prefix and
1079 # the user has added that prefix into inc_dirs.
1080 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001081 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001082 std_variants.append(os.path.join(dn, 'db3'))
1083 std_variants.append(os.path.join(dn, 'db4'))
1084 for x in gen_db_minor_ver_nums(4):
1085 std_variants.append(os.path.join(dn, "db4%d"%x))
1086 std_variants.append(os.path.join(dn, "db4.%d"%x))
1087 for x in gen_db_minor_ver_nums(3):
1088 std_variants.append(os.path.join(dn, "db3%d"%x))
1089 std_variants.append(os.path.join(dn, "db3.%d"%x))
1090
1091 db_inc_paths = std_variants + db_inc_paths
1092 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1093
1094 db_ver_inc_map = {}
1095
Victor Stinner4cbea512019-02-28 17:48:38 +01001096 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001097 sysroot = macosx_sdk_root()
1098
Georg Brandl489cb4f2009-07-11 10:08:49 +00001099 class db_found(Exception): pass
1100 try:
1101 # See whether there is a Sleepycat header in the standard
1102 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001103 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001104 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001105 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001106 f = os.path.join(sysroot, d[1:], "db.h")
1107
Georg Brandl489cb4f2009-07-11 10:08:49 +00001108 if db_setup_debug: print("db: looking for db.h in", f)
1109 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001110 with open(f, 'rb') as file:
1111 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001112 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001113 if m:
1114 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001115 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001116 db_minor = int(m.group(1))
1117 db_ver = (db_major, db_minor)
1118
1119 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1120 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001121 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001122 db_patch = int(m.group(1))
1123 if db_patch < 21:
1124 print("db.h:", db_ver, "patch", db_patch,
1125 "being ignored (4.6.x must be >= 4.6.21)")
1126 continue
1127
1128 if ( (db_ver not in db_ver_inc_map) and
1129 allow_db_ver(db_ver) ):
1130 # save the include directory with the db.h version
1131 # (first occurrence only)
1132 db_ver_inc_map[db_ver] = d
1133 if db_setup_debug:
1134 print("db.h: found", db_ver, "in", d)
1135 else:
1136 # we already found a header for this library version
1137 if db_setup_debug: print("db.h: ignoring", d)
1138 else:
1139 # ignore this header, it didn't contain a version number
1140 if db_setup_debug:
1141 print("db.h: no version number version in", d)
1142
1143 db_found_vers = list(db_ver_inc_map.keys())
1144 db_found_vers.sort()
1145
1146 while db_found_vers:
1147 db_ver = db_found_vers.pop()
1148 db_incdir = db_ver_inc_map[db_ver]
1149
1150 # check lib directories parallel to the location of the header
1151 db_dirs_to_check = [
1152 db_incdir.replace("include", 'lib64'),
1153 db_incdir.replace("include", 'lib'),
1154 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001155
Victor Stinner4cbea512019-02-28 17:48:38 +01001156 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001157 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1158
1159 else:
1160 # Same as other branch, but takes OSX SDK into account
1161 tmp = []
1162 for dn in db_dirs_to_check:
1163 if is_macosx_sdk_path(dn):
1164 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1165 tmp.append(dn)
1166 else:
1167 if os.path.isdir(dn):
1168 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001169 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001170
1171 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001172
Ezio Melotti42da6632011-03-15 05:18:48 +02001173 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001174 # XXX should we -ever- look for a dbX name? Do any
1175 # systems really not name their library by version and
1176 # symlink to more general names?
1177 for dblib in (('db-%d.%d' % db_ver),
1178 ('db%d%d' % db_ver),
1179 ('db%d' % db_ver[0])):
1180 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001181 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001182 if dblib_file:
1183 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1184 raise db_found
1185 else:
1186 if db_setup_debug: print("db lib: ", dblib, "not found")
1187
1188 except db_found:
1189 if db_setup_debug:
1190 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1191 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001192 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001193 # Only add the found library and include directories if they aren't
1194 # already being searched. This avoids an explicit runtime library
1195 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001196 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001197 db_incs = None
1198 else:
1199 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001200 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001201 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001202 else:
1203 if db_setup_debug: print("db: no appropriate library found")
1204 db_incs = None
1205 dblibs = []
1206 dblib_dir = None
1207
Victor Stinner5ec33a12019-03-01 16:43:28 +01001208 dbm_setup_debug = False # verbose debug prints from this script?
1209 dbm_order = ['gdbm']
1210 # The standard Unix dbm module:
1211 if not CYGWIN:
1212 config_args = [arg.strip("'")
1213 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1214 dbm_args = [arg for arg in config_args
1215 if arg.startswith('--with-dbmliborder=')]
1216 if dbm_args:
1217 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1218 else:
1219 dbm_order = "ndbm:gdbm:bdb".split(":")
1220 dbmext = None
1221 for cand in dbm_order:
1222 if cand == "ndbm":
1223 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1224 # Some systems have -lndbm, others have -lgdbm_compat,
1225 # others don't have either
1226 if self.compiler.find_library_file(self.lib_dirs,
1227 'ndbm'):
1228 ndbm_libs = ['ndbm']
1229 elif self.compiler.find_library_file(self.lib_dirs,
1230 'gdbm_compat'):
1231 ndbm_libs = ['gdbm_compat']
1232 else:
1233 ndbm_libs = []
1234 if dbm_setup_debug: print("building dbm using ndbm")
1235 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1236 define_macros=[
1237 ('HAVE_NDBM_H',None),
1238 ],
1239 libraries=ndbm_libs)
1240 break
1241
1242 elif cand == "gdbm":
1243 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1244 gdbm_libs = ['gdbm']
1245 if self.compiler.find_library_file(self.lib_dirs,
1246 'gdbm_compat'):
1247 gdbm_libs.append('gdbm_compat')
1248 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1249 if dbm_setup_debug: print("building dbm using gdbm")
1250 dbmext = Extension(
1251 '_dbm', ['_dbmmodule.c'],
1252 define_macros=[
1253 ('HAVE_GDBM_NDBM_H', None),
1254 ],
1255 libraries = gdbm_libs)
1256 break
1257 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1258 if dbm_setup_debug: print("building dbm using gdbm")
1259 dbmext = Extension(
1260 '_dbm', ['_dbmmodule.c'],
1261 define_macros=[
1262 ('HAVE_GDBM_DASH_NDBM_H', None),
1263 ],
1264 libraries = gdbm_libs)
1265 break
1266 elif cand == "bdb":
1267 if dblibs:
1268 if dbm_setup_debug: print("building dbm using bdb")
1269 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1270 library_dirs=dblib_dir,
1271 runtime_library_dirs=dblib_dir,
1272 include_dirs=db_incs,
1273 define_macros=[
1274 ('HAVE_BERKDB_H', None),
1275 ('DB_DBM_HSEARCH', None),
1276 ],
1277 libraries=dblibs)
1278 break
1279 if dbmext is not None:
1280 self.add(dbmext)
1281 else:
1282 self.missing.append('_dbm')
1283
1284 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1285 if ('gdbm' in dbm_order and
1286 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1287 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1288 libraries=['gdbm']))
1289 else:
1290 self.missing.append('_gdbm')
1291
1292 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001293 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001294 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001295
1296 # We hunt for #define SQLITE_VERSION "n.n.n"
1297 # We need to find >= sqlite version 3.0.8
1298 sqlite_incdir = sqlite_libdir = None
1299 sqlite_inc_paths = [ '/usr/include',
1300 '/usr/include/sqlite',
1301 '/usr/include/sqlite3',
1302 '/usr/local/include',
1303 '/usr/local/include/sqlite',
1304 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001305 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001306 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001307 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001308 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1309 MIN_SQLITE_VERSION = ".".join([str(x)
1310 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311
1312 # Scan the default include directories before the SQLite specific
1313 # ones. This allows one to override the copy of sqlite on OSX,
1314 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001315 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001316 sysroot = macosx_sdk_root()
1317
Victor Stinner625dbf22019-03-01 15:59:39 +01001318 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001319 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001320 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001321 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001322
Ned Deily9b635832012-08-05 15:13:33 -07001323 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001325 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001326 with open(f) as file:
1327 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001328 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001329 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001330 if m:
1331 sqlite_version = m.group(1)
1332 sqlite_version_tuple = tuple([int(x)
1333 for x in sqlite_version.split(".")])
1334 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1335 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001336 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001337 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001338 sqlite_incdir = d
1339 break
1340 else:
1341 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001342 print("%s: version %d is too old, need >= %s"%(d,
1343 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001344 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001345 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001346
1347 if sqlite_incdir:
1348 sqlite_dirs_to_check = [
1349 os.path.join(sqlite_incdir, '..', 'lib64'),
1350 os.path.join(sqlite_incdir, '..', 'lib'),
1351 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1352 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1353 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001354 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001355 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001356 if sqlite_libfile:
1357 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001358
1359 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001360 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001361 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001362 '_sqlite/cursor.c',
1363 '_sqlite/microprotocols.c',
1364 '_sqlite/module.c',
1365 '_sqlite/prepare_protocol.c',
1366 '_sqlite/row.c',
1367 '_sqlite/statement.c',
1368 '_sqlite/util.c', ]
1369
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001370 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001371 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001372 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1373 else:
1374 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1375
Benjamin Peterson076ed002010-10-31 17:11:02 +00001376 # Enable support for loadable extensions in the sqlite3 module
1377 # if --enable-loadable-sqlite-extensions configure option is used.
1378 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1379 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380
Victor Stinner4cbea512019-02-28 17:48:38 +01001381 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382 # In every directory on the search path search for a dynamic
1383 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001384 # for dynamic libraries on the entire path.
1385 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 # before the dynamic library in /usr/lib.
1387 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1388 else:
1389 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001390
Brett Cannonc5011fe2011-06-06 20:09:10 -07001391 include_dirs = ["Modules/_sqlite"]
1392 # Only include the directory where sqlite was found if it does
1393 # not already exist in set include directories, otherwise you
1394 # can end up with a bad search path order.
1395 if sqlite_incdir not in self.compiler.include_dirs:
1396 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001397 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001398 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001399 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001400 self.add(Extension('_sqlite3', sqlite_srcs,
1401 define_macros=sqlite_defines,
1402 include_dirs=include_dirs,
1403 library_dirs=sqlite_libdir,
1404 extra_link_args=sqlite_extra_link_args,
1405 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001406 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001407 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001408
Victor Stinner5ec33a12019-03-01 16:43:28 +01001409 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001410 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001411 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001412 if not VXWORKS:
1413 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001414 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001415 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001416 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001417 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001418 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001419
Victor Stinner5ec33a12019-03-01 16:43:28 +01001420 # Platform-specific libraries
1421 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1422 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001423 else:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001424 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001425
Victor Stinner5ec33a12019-03-01 16:43:28 +01001426 if MACOS:
1427 self.add(Extension('_scproxy', ['_scproxy.c'],
1428 extra_link_args=[
1429 '-framework', 'SystemConfiguration',
1430 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001431
Victor Stinner5ec33a12019-03-01 16:43:28 +01001432 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001433 # Andrew Kuchling's zlib module. Note that some versions of zlib
1434 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1435 # http://www.cert.org/advisories/CA-2002-07.html
1436 #
1437 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1438 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1439 # now, we still accept 1.1.3, because we think it's difficult to
1440 # exploit this in Python, and we'd rather make it RedHat's problem
1441 # than our problem <wink>.
1442 #
1443 # You can upgrade zlib to version 1.1.4 yourself by going to
1444 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001445 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001446 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001447 if zlib_inc is not None:
1448 zlib_h = zlib_inc[0] + '/zlib.h'
1449 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001450 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001451 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001452 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001453 with open(zlib_h) as fp:
1454 while 1:
1455 line = fp.readline()
1456 if not line:
1457 break
1458 if line.startswith('#define ZLIB_VERSION'):
1459 version = line.split()[2]
1460 break
Guido van Rossume6970912001-04-15 15:16:12 +00001461 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001462 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001463 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001464 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1465 else:
1466 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001467 self.add(Extension('zlib', ['zlibmodule.c'],
1468 libraries=['z'],
1469 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001470 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001471 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001472 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001473 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001474 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001475 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001476 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001477
Christian Heimes1dc54002008-03-24 02:19:29 +00001478 # Helper module for various ascii-encoders. Uses zlib for an optimized
1479 # crc32 if we have it. Otherwise binascii uses its own.
1480 if have_zlib:
1481 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1482 libraries = ['z']
1483 extra_link_args = zlib_extra_link_args
1484 else:
1485 extra_compile_args = []
1486 libraries = []
1487 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001488 self.add(Extension('binascii', ['binascii.c'],
1489 extra_compile_args=extra_compile_args,
1490 libraries=libraries,
1491 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001492
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001493 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001494 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001495 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001496 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1497 else:
1498 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001499 self.add(Extension('_bz2', ['_bz2module.c'],
1500 libraries=['bz2'],
1501 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001503 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001504
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001505 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001506 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001507 self.add(Extension('_lzma', ['_lzmamodule.c'],
1508 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001509 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001510 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001511
Victor Stinner5ec33a12019-03-01 16:43:28 +01001512 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001513 # Interface to the Expat XML parser
1514 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001515 # Expat was written by James Clark and is now maintained by a group of
1516 # developers on SourceForge; see www.libexpat.org for more information.
1517 # The pyexpat module was written by Paul Prescod after a prototype by
1518 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1519 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001520 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001521 #
1522 # More information on Expat can be found at www.libexpat.org.
1523 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001524 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1525 expat_inc = []
1526 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001527 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001528 expat_lib = ['expat']
1529 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001530 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001531 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001532 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001533 define_macros = [
1534 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001535 # bpo-30947: Python uses best available entropy sources to
1536 # call XML_SetHashSalt(), expat entropy sources are not needed
1537 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001538 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001539 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001540 expat_lib = []
1541 expat_sources = ['expat/xmlparse.c',
1542 'expat/xmlrole.c',
1543 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001544 expat_depends = ['expat/ascii.h',
1545 'expat/asciitab.h',
1546 'expat/expat.h',
1547 'expat/expat_config.h',
1548 'expat/expat_external.h',
1549 'expat/internal.h',
1550 'expat/latin1tab.h',
1551 'expat/utf8tab.h',
1552 'expat/xmlrole.h',
1553 'expat/xmltok.h',
1554 'expat/xmltok_impl.h'
1555 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001556
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001557 cc = sysconfig.get_config_var('CC').split()[0]
1558 ret = os.system(
1559 '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc)
1560 if ret >> 8 == 0:
1561 extra_compile_args.append('-Wno-implicit-fallthrough')
1562
Victor Stinner8058bda2019-03-01 15:31:45 +01001563 self.add(Extension('pyexpat',
1564 define_macros=define_macros,
1565 extra_compile_args=extra_compile_args,
1566 include_dirs=expat_inc,
1567 libraries=expat_lib,
1568 sources=['pyexpat.c'] + expat_sources,
1569 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001570
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001571 # Fredrik Lundh's cElementTree module. Note that this also
1572 # uses expat (via the CAPI hook in pyexpat).
1573
Victor Stinner625dbf22019-03-01 15:59:39 +01001574 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001575 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001576 self.add(Extension('_elementtree',
1577 define_macros=define_macros,
1578 include_dirs=expat_inc,
1579 libraries=expat_lib,
1580 sources=['_elementtree.c'],
1581 depends=['pyexpat.c', *expat_sources,
1582 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001584 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001585
Victor Stinner5ec33a12019-03-01 16:43:28 +01001586 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001587 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001588 self.add(Extension('_multibytecodec',
1589 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001590 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001591 self.add(Extension('_codecs_%s' % loc,
1592 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001593
Victor Stinner5ec33a12019-03-01 16:43:28 +01001594 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001595 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001596 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001597 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1598 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001599
1600 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001601 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001602 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1603 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001604 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001605 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1606 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001607 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001608 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001609 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1610 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001611 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001612 self.add(Extension('_posixshmem', posixshmem_srcs,
1613 define_macros={},
1614 libraries=libs,
1615 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001616
Victor Stinner8058bda2019-03-01 15:31:45 +01001617 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001618 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001619
Victor Stinner5ec33a12019-03-01 16:43:28 +01001620 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001621 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001622 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001623 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001624 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001625 uuid_libs = ['uuid']
1626 else:
1627 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001628 self.add(Extension('_uuid', ['_uuidmodule.c'],
1629 libraries=uuid_libs,
1630 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001631 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001632 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001633
Victor Stinner5ec33a12019-03-01 16:43:28 +01001634 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001635 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001636 self.init_inc_lib_dirs()
1637
1638 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001639 if TEST_EXTENSIONS:
1640 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001641 self.detect_readline_curses()
1642 self.detect_crypt()
1643 self.detect_socket()
1644 self.detect_openssl_hashlib()
xdegaye2ee077f2019-04-09 17:20:08 +02001645 self.detect_hash_builtins()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001646 self.detect_dbm_gdbm()
1647 self.detect_sqlite()
1648 self.detect_platform_specific_exts()
1649 self.detect_nis()
1650 self.detect_compress_exts()
1651 self.detect_expat_elementtree()
1652 self.detect_multibytecodecs()
1653 self.detect_decimal()
1654 self.detect_ctypes()
1655 self.detect_multiprocessing()
1656 if not self.detect_tkinter():
1657 self.missing.append('_tkinter')
1658 self.detect_uuid()
1659
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001660## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001661## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001662
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001663 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001664 self.add(Extension('xxlimited', ['xxlimited.c'],
1665 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001666
Ned Deilyd819b932013-09-06 01:07:05 -07001667 def detect_tkinter_explicitly(self):
1668 # Build _tkinter using explicit locations for Tcl/Tk.
1669 #
1670 # This is enabled when both arguments are given to ./configure:
1671 #
1672 # --with-tcltk-includes="-I/path/to/tclincludes \
1673 # -I/path/to/tkincludes"
1674 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1675 # -L/path/to/tklibs -ltkm.n"
1676 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001677 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001678 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1679 #
1680 # This can be useful for building and testing tkinter with multiple
1681 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1682 # build of Tcl so you need to specify both arguments and use care when
1683 # overriding.
1684
1685 # The _TCLTK variables are created in the Makefile sharedmods target.
1686 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1687 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1688 if not (tcltk_includes and tcltk_libs):
1689 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001690 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001691
1692 extra_compile_args = tcltk_includes.split()
1693 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001694 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1695 define_macros=[('WITH_APPINIT', 1)],
1696 extra_compile_args = extra_compile_args,
1697 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001698 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001699
Victor Stinner625dbf22019-03-01 15:59:39 +01001700 def detect_tkinter_darwin(self):
Jack Jansen0b06be72002-06-21 14:48:38 +00001701 # The _tkinter module, using frameworks. Since frameworks are quite
1702 # different the UNIX search logic is not sharable.
1703 from os.path import join, exists
1704 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001705 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001706 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001707 join(os.getenv('HOME'), '/Library/Frameworks')
1708 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001709
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001710 sysroot = macosx_sdk_root()
1711
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001712 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001713 # bundles.
1714 # XXX distutils should support -F!
1715 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001716 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001717
1718
Jack Jansen0b06be72002-06-21 14:48:38 +00001719 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001720 if is_macosx_sdk_path(F):
1721 if not exists(join(sysroot, F[1:], fw + '.framework')):
1722 break
1723 else:
1724 if not exists(join(F, fw + '.framework')):
1725 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001726 else:
1727 # ok, F is now directory with both frameworks. Continure
1728 # building
1729 break
1730 else:
1731 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1732 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001733 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001734
Jack Jansen0b06be72002-06-21 14:48:38 +00001735 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1736 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001737 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001738 #
1739 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001740 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001741 for fw in ('Tcl', 'Tk')
1742 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001743 ]
1744
Tim Peters2c60f7a2003-01-29 03:49:43 +00001745 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001746 # complicated search, this is a hard-coded path. It could bail out
1747 # if X11 libs are not found...
1748 include_dirs.append('/usr/X11R6/include')
1749 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1750
Georg Brandlfcaf9102008-07-16 02:17:56 +00001751 # All existing framework builds of Tcl/Tk don't support 64-bit
1752 # architectures.
1753 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001754 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001755
Ronald Oussorend097efe2009-09-15 19:07:58 +00001756 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1757 if not os.path.exists(self.build_temp):
1758 os.makedirs(self.build_temp)
1759
1760 # Note: cannot use os.popen or subprocess here, that
1761 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001762 if is_macosx_sdk_path(F):
1763 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1764 else:
1765 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001766
Brett Cannon9f5db072010-10-29 20:19:27 +00001767 with open(tmpfile) as fp:
1768 detected_archs = []
1769 for ln in fp:
1770 a = ln.split()[-1]
1771 if a in archs:
1772 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001773 os.unlink(tmpfile)
1774
1775 for a in detected_archs:
1776 frameworks.append('-arch')
1777 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001778
Victor Stinnercfe172d2019-03-01 18:21:49 +01001779 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1780 define_macros=[('WITH_APPINIT', 1)],
1781 include_dirs=include_dirs,
1782 libraries=[],
1783 extra_compile_args=frameworks[2:],
1784 extra_link_args=frameworks))
Victor Stinner4cbea512019-02-28 17:48:38 +01001785 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001786
Victor Stinner625dbf22019-03-01 15:59:39 +01001787 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001788 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001789
Ned Deilyd819b932013-09-06 01:07:05 -07001790 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1791 # configured or passed into the make target. If so, use these values
1792 # to build tkinter and bypass the searches for Tcl and TK in standard
1793 # locations.
1794 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01001795 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001796
Jack Jansen0b06be72002-06-21 14:48:38 +00001797 # Rather than complicate the code below, detecting and building
1798 # AquaTk is a separate method. Only one Tkinter will be built on
1799 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01001800 if (MACOS and self.detect_tkinter_darwin()):
1801 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001802
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001803 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001804 # The versions with dots are used on Unix, and the versions without
1805 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001806 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001807 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1808 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01001809 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001810 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01001811 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001812 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001813 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001814 # Exit the loop when we've found the Tcl/Tk libraries
1815 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001816
Fredrik Lundhade711a2001-01-24 08:00:28 +00001817 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001818 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001819 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001820 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001821 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01001822 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001823 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1824 # but the include subdirs are named like .../include/tcl8.3.
1825 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1826 tcl_include_sub = []
1827 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001828 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001829 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1830 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1831 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01001832 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
1833 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001834
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001835 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001836 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001837 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01001838 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00001839
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001840 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001841
Victor Stinnercfe172d2019-03-01 18:21:49 +01001842 include_dirs = []
1843 libs = []
1844 defs = []
1845 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001846 for dir in tcl_includes + tk_includes:
1847 if dir not in include_dirs:
1848 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001849
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001850 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01001851 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001852 include_dirs.append('/usr/openwin/include')
1853 added_lib_dirs.append('/usr/openwin/lib')
1854 elif os.path.exists('/usr/X11R6/include'):
1855 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001856 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001857 added_lib_dirs.append('/usr/X11R6/lib')
1858 elif os.path.exists('/usr/X11R5/include'):
1859 include_dirs.append('/usr/X11R5/include')
1860 added_lib_dirs.append('/usr/X11R5/lib')
1861 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001862 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001863 include_dirs.append('/usr/X11/include')
1864 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001865
Jason Tishler9181c942003-02-05 15:16:17 +00001866 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01001867 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00001868 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1869 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001870 return False
Jason Tishler9181c942003-02-05 15:16:17 +00001871
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001872 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01001873 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001874 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001875 defs.append( ('WITH_BLT', 1) )
1876 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01001877 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001878 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001879 defs.append( ('WITH_BLT', 1) )
1880 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001881
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001882 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001883 libs.append('tk'+ version)
1884 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001885
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001886 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01001887 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001888 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001889
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001890 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001891 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001892 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001893 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001894 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001895 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001896 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001897
Victor Stinnercfe172d2019-03-01 18:21:49 +01001898 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1899 define_macros=[('WITH_APPINIT', 1)] + defs,
1900 include_dirs=include_dirs,
1901 libraries=libs,
1902 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01001903 return True
1904
Christian Heimes78644762008-03-04 23:39:23 +00001905 def configure_ctypes_darwin(self, ext):
1906 # Darwin (OS X) uses preconfigured files, in
1907 # the Modules/_ctypes/libffi_osx directory.
Victor Stinner625dbf22019-03-01 15:59:39 +01001908 ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules',
Christian Heimes78644762008-03-04 23:39:23 +00001909 '_ctypes', 'libffi_osx'))
1910 sources = [os.path.join(ffi_srcdir, p)
1911 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001912 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001913 'x86/x86-darwin.S',
1914 'x86/x86-ffi_darwin.c',
1915 'x86/x86-ffi64.c',
1916 'powerpc/ppc-darwin.S',
1917 'powerpc/ppc-darwin_closure.S',
1918 'powerpc/ppc-ffi_darwin.c',
1919 'powerpc/ppc64-darwin_closure.S',
1920 ]]
1921
1922 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001923 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001924
1925 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1926 os.path.join(ffi_srcdir, 'powerpc')]
1927 ext.include_dirs.extend(include_dirs)
1928 ext.sources.extend(sources)
1929 return True
1930
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001931 def configure_ctypes(self, ext):
1932 if not self.use_system_libffi:
Victor Stinner4cbea512019-02-28 17:48:38 +01001933 if MACOS:
Christian Heimes78644762008-03-04 23:39:23 +00001934 return self.configure_ctypes_darwin(ext)
Zachary Waref40d4dd2016-09-17 01:25:24 -05001935 print('INFO: Could not locate ffi libs and/or headers')
1936 return False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001937 return True
1938
Victor Stinner625dbf22019-03-01 15:59:39 +01001939 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001940 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001941 self.use_system_libffi = False
1942 include_dirs = []
1943 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001944 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001945 sources = ['_ctypes/_ctypes.c',
1946 '_ctypes/callbacks.c',
1947 '_ctypes/callproc.c',
1948 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001949 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001950 depends = ['_ctypes/ctypes.h']
1951
Victor Stinner4cbea512019-02-28 17:48:38 +01001952 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00001953 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001954 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001955 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001956 include_dirs.append('_ctypes/darwin')
Victor Stinner5ec33a12019-03-01 16:43:28 +01001957 # XXX Is this still needed?
1958 # extra_link_args.extend(['-read_only_relocs', 'warning'])
Thomas Hellercf567c12006-03-08 19:51:58 +00001959
Victor Stinner4cbea512019-02-28 17:48:38 +01001960 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001961 # XXX This shouldn't be necessary; it appears that some
1962 # of the assembler code is non-PIC (i.e. it has relocations
1963 # when it shouldn't. The proper fix would be to rewrite
1964 # the assembler code to be PIC.
1965 # This only works with GCC; the Sun compiler likely refuses
1966 # this option. If you want to compile ctypes with the Sun
1967 # compiler, please research a proper solution, instead of
1968 # finding some -z option for the Sun compiler.
1969 extra_link_args.append('-mimpure-text')
1970
Victor Stinner4cbea512019-02-28 17:48:38 +01001971 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001972 extra_link_args.append('-fPIC')
1973
Thomas Hellercf567c12006-03-08 19:51:58 +00001974 ext = Extension('_ctypes',
1975 include_dirs=include_dirs,
1976 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001977 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001978 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001979 sources=sources,
1980 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01001981 self.add(ext)
1982 if TEST_EXTENSIONS:
1983 # function my_sqrt() needs libm for sqrt()
1984 self.add(Extension('_ctypes_test',
1985 sources=['_ctypes/_ctypes_test.c'],
1986 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00001987
Victor Stinner625dbf22019-03-01 15:59:39 +01001988 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01001989 if MACOS:
Zachary Ware935043d2016-09-09 17:01:21 -07001990 if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
1991 return
Christian Heimes78644762008-03-04 23:39:23 +00001992 # OS X 10.5 comes with libffi.dylib; the include files are
1993 # in /usr/include/ffi
Victor Stinner96d81582019-03-01 13:53:46 +01001994 ffi_inc_dirs.append('/usr/include/ffi')
Christian Heimes78644762008-03-04 23:39:23 +00001995
Benjamin Petersond78735d2010-01-01 16:04:23 +00001996 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001997 if not ffi_inc or ffi_inc[0] == '':
Victor Stinner96d81582019-03-01 13:53:46 +01001998 ffi_inc = find_file('ffi.h', [], ffi_inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001999 if ffi_inc is not None:
2000 ffi_h = ffi_inc[0] + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002001 if not os.path.exists(ffi_h):
2002 ffi_inc = None
2003 print('Header file {} does not exist'.format(ffi_h))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002004 ffi_lib = None
2005 if ffi_inc is not None:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002006 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002007 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002008 ffi_lib = lib_name
2009 break
2010
2011 if ffi_inc and ffi_lib:
2012 ext.include_dirs.extend(ffi_inc)
2013 ext.libraries.append(ffi_lib)
2014 self.use_system_libffi = True
2015
Christian Heimes5bb96922018-02-25 10:22:14 +01002016 if sysconfig.get_config_var('HAVE_LIBDL'):
2017 # for dlopen, see bpo-32647
2018 ext.libraries.append('dl')
2019
Victor Stinner5ec33a12019-03-01 16:43:28 +01002020 def detect_decimal(self):
2021 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002022 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002023 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002024 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2025 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002026 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002027 sources = ['_decimal/_decimal.c']
2028 depends = ['_decimal/docstrings.h']
2029 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002030 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002031 'Modules',
2032 '_decimal',
2033 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002034 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002035 sources = [
2036 '_decimal/_decimal.c',
2037 '_decimal/libmpdec/basearith.c',
2038 '_decimal/libmpdec/constants.c',
2039 '_decimal/libmpdec/context.c',
2040 '_decimal/libmpdec/convolute.c',
2041 '_decimal/libmpdec/crt.c',
2042 '_decimal/libmpdec/difradix2.c',
2043 '_decimal/libmpdec/fnt.c',
2044 '_decimal/libmpdec/fourstep.c',
2045 '_decimal/libmpdec/io.c',
2046 '_decimal/libmpdec/memory.c',
2047 '_decimal/libmpdec/mpdecimal.c',
2048 '_decimal/libmpdec/numbertheory.c',
2049 '_decimal/libmpdec/sixstep.c',
2050 '_decimal/libmpdec/transpose.c',
2051 ]
2052 depends = [
2053 '_decimal/docstrings.h',
2054 '_decimal/libmpdec/basearith.h',
2055 '_decimal/libmpdec/bits.h',
2056 '_decimal/libmpdec/constants.h',
2057 '_decimal/libmpdec/convolute.h',
2058 '_decimal/libmpdec/crt.h',
2059 '_decimal/libmpdec/difradix2.h',
2060 '_decimal/libmpdec/fnt.h',
2061 '_decimal/libmpdec/fourstep.h',
2062 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002063 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002064 '_decimal/libmpdec/mpdecimal.h',
2065 '_decimal/libmpdec/numbertheory.h',
2066 '_decimal/libmpdec/sixstep.h',
2067 '_decimal/libmpdec/transpose.h',
2068 '_decimal/libmpdec/typearith.h',
2069 '_decimal/libmpdec/umodarith.h',
2070 ]
2071
Stefan Krah1919b7e2012-03-21 18:25:23 +01002072 config = {
2073 'x64': [('CONFIG_64','1'), ('ASM','1')],
2074 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2075 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2076 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2077 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2078 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2079 ('LEGACY_COMPILER','1')],
2080 'universal': [('UNIVERSAL','1')]
2081 }
2082
Stefan Krah1919b7e2012-03-21 18:25:23 +01002083 cc = sysconfig.get_config_var('CC')
2084 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2085 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2086
2087 if machine:
2088 # Override automatic configuration to facilitate testing.
2089 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002090 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002091 # Universal here means: build with the same options Python
2092 # was built with.
2093 define_macros = config['universal']
2094 elif sizeof_size_t == 8:
2095 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2096 define_macros = config['x64']
2097 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2098 define_macros = config['uint128']
2099 else:
2100 define_macros = config['ansi64']
2101 elif sizeof_size_t == 4:
2102 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2103 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002104 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002105 # solaris: problems with register allocation.
2106 # icc >= 11.0 works as well.
2107 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002108 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002109 else:
2110 define_macros = config['ansi32']
2111 else:
2112 raise DistutilsError("_decimal: unsupported architecture")
2113
2114 # Workarounds for toolchain bugs:
2115 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2116 # Some versions of gcc miscompile inline asm:
2117 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2118 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2119 extra_compile_args.append('-fno-ipa-pure-const')
2120 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2121 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2122 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2123 undef_macros.append('_FORTIFY_SOURCE')
2124
Stefan Krah1919b7e2012-03-21 18:25:23 +01002125 # Uncomment for extra functionality:
2126 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002127 self.add(Extension('_decimal',
2128 include_dirs=include_dirs,
2129 libraries=libraries,
2130 define_macros=define_macros,
2131 undef_macros=undef_macros,
2132 extra_compile_args=extra_compile_args,
2133 sources=sources,
2134 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002135
Victor Stinner5ec33a12019-03-01 16:43:28 +01002136 def detect_openssl_hashlib(self):
2137 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002138 config_vars = sysconfig.get_config_vars()
2139
2140 def split_var(name, sep):
2141 # poor man's shlex, the re module is not available yet.
2142 value = config_vars.get(name)
2143 if not value:
2144 return ()
2145 # This trick works because ax_check_openssl uses --libs-only-L,
2146 # --libs-only-l, and --cflags-only-I.
2147 value = ' ' + value
2148 sep = ' ' + sep
2149 return [v.strip() for v in value.split(sep) if v.strip()]
2150
2151 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2152 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2153 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2154 if not openssl_libs:
2155 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002156 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002157 return None, None
2158
2159 # Find OpenSSL includes
2160 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002161 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002162 )
2163 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002164 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002165 return None, None
2166
2167 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2168 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002169 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002170 ['/usr/kerberos/include']
2171 )
2172 if krb5_h:
2173 ssl_incs.extend(krb5_h)
2174
Christian Heimes61d478c2018-01-27 15:51:38 +01002175 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Victor Stinner8058bda2019-03-01 15:31:45 +01002176 self.add(Extension('_ssl', ['_ssl.c'],
2177 include_dirs=openssl_includes,
2178 library_dirs=openssl_libdirs,
2179 libraries=openssl_libs,
2180 depends=['socketmodule.h']))
Christian Heimes61d478c2018-01-27 15:51:38 +01002181 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002182 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002183
Victor Stinner8058bda2019-03-01 15:31:45 +01002184 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2185 depends=['hashlib.h'],
2186 include_dirs=openssl_includes,
2187 library_dirs=openssl_libdirs,
2188 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002189
xdegaye2ee077f2019-04-09 17:20:08 +02002190 def detect_hash_builtins(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002191 # We always compile these even when OpenSSL is available (issue #14693).
2192 # It's harmless and the object code is tiny (40-50 KiB per module,
2193 # only loaded when actually used).
2194 self.add(Extension('_sha256', ['sha256module.c'],
2195 depends=['hashlib.h']))
2196 self.add(Extension('_sha512', ['sha512module.c'],
2197 depends=['hashlib.h']))
2198 self.add(Extension('_md5', ['md5module.c'],
2199 depends=['hashlib.h']))
2200 self.add(Extension('_sha1', ['sha1module.c'],
2201 depends=['hashlib.h']))
2202
2203 blake2_deps = glob(os.path.join(self.srcdir,
2204 'Modules/_blake2/impl/*'))
2205 blake2_deps.append('hashlib.h')
2206
2207 self.add(Extension('_blake2',
2208 ['_blake2/blake2module.c',
2209 '_blake2/blake2b_impl.c',
2210 '_blake2/blake2s_impl.c'],
2211 depends=blake2_deps))
2212
2213 sha3_deps = glob(os.path.join(self.srcdir,
2214 'Modules/_sha3/kcp/*'))
2215 sha3_deps.append('hashlib.h')
2216 self.add(Extension('_sha3',
2217 ['_sha3/sha3module.c'],
2218 depends=sha3_deps))
2219
2220 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002221 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002222 self.missing.append('nis')
2223 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002224
2225 libs = []
2226 library_dirs = []
2227 includes_dirs = []
2228
2229 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2230 # moved headers and libraries to libtirpc and libnsl. The headers
2231 # are in tircp and nsl sub directories.
2232 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002233 'rpcsvc/yp_prot.h', self.inc_dirs,
2234 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002235 )
2236 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002237 'rpc/rpc.h', self.inc_dirs,
2238 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002239 )
2240 if rpcsvc_inc is None or rpc_inc is None:
2241 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002242 self.missing.append('nis')
2243 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002244 includes_dirs.extend(rpcsvc_inc)
2245 includes_dirs.extend(rpc_inc)
2246
Victor Stinner625dbf22019-03-01 15:59:39 +01002247 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002248 libs.append('nsl')
2249 else:
2250 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002251 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002252 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2253 if libnsl is not None:
2254 library_dirs.append(os.path.dirname(libnsl))
2255 libs.append('nsl')
2256
Victor Stinner625dbf22019-03-01 15:59:39 +01002257 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002258 libs.append('tirpc')
2259
Victor Stinner8058bda2019-03-01 15:31:45 +01002260 self.add(Extension('nis', ['nismodule.c'],
2261 libraries=libs,
2262 library_dirs=library_dirs,
2263 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002264
Christian Heimesff5be6e2018-01-20 13:19:21 +01002265
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002266class PyBuildInstall(install):
2267 # Suppress the warning about installation into the lib_dynload
2268 # directory, which is not in sys.path when running Python during
2269 # installation:
2270 def initialize_options (self):
2271 install.initialize_options(self)
2272 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002273
Éric Araujoe6792c12011-06-09 14:07:02 +02002274 # Customize subcommands to not install an egg-info file for Python
2275 sub_commands = [('install_lib', install.has_lib),
2276 ('install_headers', install.has_headers),
2277 ('install_scripts', install.has_scripts),
2278 ('install_data', install.has_data)]
2279
2280
Michael W. Hudson529a5052002-12-17 16:47:17 +00002281class PyBuildInstallLib(install_lib):
2282 # Do exactly what install_lib does but make sure correct access modes get
2283 # set on installed directories and files. All installed files with get
2284 # mode 644 unless they are a shared library in which case they will get
2285 # mode 755. All installed directories will get mode 755.
2286
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002287 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2288 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002289
2290 def install(self):
2291 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002292 self.set_file_modes(outfiles, 0o644, 0o755)
2293 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002294 return outfiles
2295
2296 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002297 if not files: return
2298
2299 for filename in files:
2300 if os.path.islink(filename): continue
2301 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002302 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002303 log.info("changing mode of %s to %o", filename, mode)
2304 if not self.dry_run: os.chmod(filename, mode)
2305
2306 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002307 for dirpath, dirnames, fnames in os.walk(dirname):
2308 if os.path.islink(dirpath):
2309 continue
2310 log.info("changing mode of %s to %o", dirpath, mode)
2311 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002312
Victor Stinnerc991f242019-03-01 17:19:04 +01002313
Georg Brandlff52f762010-12-28 09:51:43 +00002314class PyBuildScripts(build_scripts):
2315 def copy_scripts(self):
2316 outfiles, updated_files = build_scripts.copy_scripts(self)
2317 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2318 minoronly = '.{0[1]}'.format(sys.version_info)
2319 newoutfiles = []
2320 newupdated_files = []
2321 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002322 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002323 newfilename = filename + fullversion
2324 else:
2325 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002326 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002327 os.rename(filename, newfilename)
2328 newoutfiles.append(newfilename)
2329 if filename in updated_files:
2330 newupdated_files.append(newfilename)
2331 return newoutfiles, newupdated_files
2332
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002333
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002334def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002335 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2336 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2337
2338 class DummyProcess:
2339 """Hack for parallel build"""
2340 ProcessPoolExecutor = None
2341
2342 sys.modules['concurrent.futures.process'] = DummyProcess
2343
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002344 # turn off warnings when deprecated modules are imported
2345 import warnings
2346 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002347 setup(# PyPI Metadata (PEP 301)
2348 name = "Python",
2349 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002350 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002351 maintainer = "Guido van Rossum and the Python community",
2352 maintainer_email = "python-dev@python.org",
2353 description = "A high-level object-oriented programming language",
2354 long_description = SUMMARY.strip(),
2355 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002356 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002357 platforms = ["Many"],
2358
2359 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002360 cmdclass = {'build_ext': PyBuildExt,
2361 'build_scripts': PyBuildScripts,
2362 'install': PyBuildInstall,
2363 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002364 # The struct module is defined here, because build_ext won't be
2365 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002366 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002367
Georg Brandlff52f762010-12-28 09:51:43 +00002368 # If you change the scripts installed here, you also need to
2369 # check the PyBuildScripts command above, and change the links
2370 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002371 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002372 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002373 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002374
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002375# --install-platlib
2376if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002377 main()