blob: 96a49b4e353c723ddc4d0b2d2dcd3f3d1ee8d4ab [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 Stinner5c75f372019-04-17 23:02:26 +0200728 self.add(Extension("_pickle", ["_pickle.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200729 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Collin Winter670e6922007-03-21 02:57:17 +0000730 # atexit
Victor Stinner8058bda2019-03-01 15:31:45 +0100731 self.add(Extension("atexit", ["atexitmodule.c"]))
Christian Heimes90540002008-05-08 14:29:10 +0000732 # _json speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100733 self.add(Extension("_json", ["_json.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200734 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
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
Victor Stinner23bace22019-04-18 11:37:26 +0200817 # Python Internal C API test module
818 self.add(Extension('_testinternalcapi', ['_testinternalcapi.c'],
Victor Stinner57491342019-04-23 12:26:33 +0200819 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner23bace22019-04-18 11:37:26 +0200820
Victor Stinnercfe172d2019-03-01 18:21:49 +0100821 # Python PEP-3118 (buffer protocol) test module
822 self.add(Extension('_testbuffer', ['_testbuffer.c']))
823
824 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
825 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
826
827 # Test multi-phase extension module init (PEP 489)
828 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
829
830 # Fuzz tests.
831 self.add(Extension('_xxtestfuzz',
832 ['_xxtestfuzz/_xxtestfuzz.c',
833 '_xxtestfuzz/fuzzer.c']))
834
Victor Stinner5ec33a12019-03-01 16:43:28 +0100835 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000836 # readline
Victor Stinner625dbf22019-03-01 15:59:39 +0100837 do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000838 readline_termcap_library = ""
839 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200840 # Cannot use os.popen here in py3k.
841 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
842 if not os.path.exists(self.build_temp):
843 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000844 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200845 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100846 if CROSS_COMPILING:
doko@ubuntu.com58844492012-06-30 18:25:32 +0200847 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
848 % (sysconfig.get_config_var('READELF'),
849 do_readline, tmpfile))
850 elif find_executable('ldd'):
851 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
852 else:
853 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200854 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000855 with open(tmpfile) as fp:
856 for ln in fp:
857 if 'curses' in ln:
858 readline_termcap_library = re.sub(
859 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
860 ).rstrip()
861 break
862 # termcap interface split out from ncurses
863 if 'tinfo' in ln:
864 readline_termcap_library = 'tinfo'
865 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200866 if os.path.exists(tmpfile):
867 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000868 # Issue 7384: If readline is already linked against curses,
869 # use the same library for the readline and curses modules.
870 if 'curses' in readline_termcap_library:
871 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +0100872 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000873 curses_library = 'ncursesw'
Victor Stinner625dbf22019-03-01 15:59:39 +0100874 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000875 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +0100876 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000877 curses_library = 'curses'
878
Victor Stinner4cbea512019-02-28 17:48:38 +0100879 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000880 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000881 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -0700882 if (dep_target and
883 (tuple(int(n) for n in dep_target.split('.')[0:2])
884 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +0000885 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000886 if os_release < 9:
887 # MacOSX 10.4 has a broken readline. Don't try to build
888 # the readline module unless the user has installed a fixed
889 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +0100890 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000891 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000892 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100893 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000894 # In every directory on the search path search for a dynamic
895 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000896 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +0000897 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000898 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000899 readline_extra_link_args = ('-Wl,-search_paths_first',)
900 else:
901 readline_extra_link_args = ()
902
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000903 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000904 if readline_termcap_library:
905 pass # Issue 7384: Already linked against curses or tinfo.
906 elif curses_library:
907 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +0100908 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000909 ['/usr/lib/termcap'],
910 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000911 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +0100912 self.add(Extension('readline', ['readline.c'],
913 library_dirs=['/usr/lib/termcap'],
914 extra_link_args=readline_extra_link_args,
915 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000916 else:
Victor Stinner8058bda2019-03-01 15:31:45 +0100917 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000918
Victor Stinner5ec33a12019-03-01 16:43:28 +0100919 # Curses support, requiring the System V version of curses, often
920 # provided by the ncurses library.
921 curses_defines = []
922 curses_includes = []
923 panel_library = 'panel'
924 if curses_library == 'ncursesw':
925 curses_defines.append(('HAVE_NCURSESW', '1'))
926 if not CROSS_COMPILING:
927 curses_includes.append('/usr/include/ncursesw')
928 # Bug 1464056: If _curses.so links with ncursesw,
929 # _curses_panel.so must link with panelw.
930 panel_library = 'panelw'
931 if MACOS:
932 # On OS X, there is no separate /usr/lib/libncursesw nor
933 # libpanelw. If we are here, we found a locally-supplied
934 # version of libncursesw. There should also be a
935 # libpanelw. _XOPEN_SOURCE defines are usually excluded
936 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
937 # ncurses wide char support
938 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
939 elif MACOS and curses_library == 'ncurses':
940 # Building with the system-suppied combined libncurses/libpanel
941 curses_defines.append(('HAVE_NCURSESW', '1'))
942 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +0000943
Victor Stinnercfe172d2019-03-01 18:21:49 +0100944 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +0100945 if curses_library.startswith('ncurses'):
946 curses_libs = [curses_library]
947 self.add(Extension('_curses', ['_cursesmodule.c'],
948 include_dirs=curses_includes,
949 define_macros=curses_defines,
950 libraries=curses_libs))
951 elif curses_library == 'curses' and not MACOS:
952 # OSX has an old Berkeley curses, not good enough for
953 # the _curses module.
954 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
955 curses_libs = ['curses', 'terminfo']
956 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
957 curses_libs = ['curses', 'termcap']
958 else:
959 curses_libs = ['curses']
960
961 self.add(Extension('_curses', ['_cursesmodule.c'],
962 define_macros=curses_defines,
963 libraries=curses_libs))
964 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +0100965 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +0100966 self.missing.append('_curses')
967
968 # If the curses module is enabled, check for the panel module
Victor Stinnercfe172d2019-03-01 18:21:49 +0100969 if (curses_enabled and
Victor Stinner5ec33a12019-03-01 16:43:28 +0100970 self.compiler.find_library_file(self.lib_dirs, panel_library)):
971 self.add(Extension('_curses_panel', ['_curses_panel.c'],
972 include_dirs=curses_includes,
973 define_macros=curses_defines,
974 libraries=[panel_library, *curses_libs]))
975 else:
976 self.missing.append('_curses_panel')
977
978 def detect_crypt(self):
979 # crypt module.
pxinwr236d0b72019-04-15 17:02:20 +0800980 if VXWORKS:
981 # bpo-31904: crypt() function is not provided by VxWorks.
982 # DES_crypt() OpenSSL provides is too weak to implement
983 # the encryption.
984 return
985
Victor Stinner625dbf22019-03-01 15:59:39 +0100986 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000987 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000988 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000989 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +0800990
pxinwr236d0b72019-04-15 17:02:20 +0800991 self.add(Extension('_crypt', ['_cryptmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100992 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000993
Victor Stinner5ec33a12019-03-01 16:43:28 +0100994 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000995 # socket(2)
pxinwr32f5fdd2019-02-27 19:09:28 +0800996 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100997 self.add(Extension('_socket', ['socketmodule.c'],
998 depends=['socketmodule.h']))
Victor Stinner625dbf22019-03-01 15:59:39 +0100999 elif self.compiler.find_library_file(self.lib_dirs, 'net'):
pxinwr32f5fdd2019-02-27 19:09:28 +08001000 libs = ['net']
Victor Stinner8058bda2019-03-01 15:31:45 +01001001 self.add(Extension('_socket', ['socketmodule.c'],
1002 depends=['socketmodule.h'],
1003 libraries=libs))
pxinwr32f5fdd2019-02-27 19:09:28 +08001004
Victor Stinner5ec33a12019-03-01 16:43:28 +01001005 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001006 # Modules that provide persistent dictionary-like semantics. You will
1007 # probably want to arrange for at least one of them to be available on
1008 # your machine, though none are defined by default because of library
1009 # dependencies. The Python module dbm/__init__.py provides an
1010 # implementation independent wrapper for these; dbm/dumb.py provides
1011 # similar functionality (but slower of course) implemented in Python.
1012
1013 # Sleepycat^WOracle Berkeley DB interface.
1014 # http://www.oracle.com/database/berkeley-db/db/index.html
1015 #
1016 # This requires the Sleepycat^WOracle DB code. The supported versions
1017 # are set below. Visit the URL above to download
1018 # a release. Most open source OSes come with one or more
1019 # versions of BerkeleyDB already installed.
1020
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001021 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001022 min_db_ver = (3, 3)
1023 db_setup_debug = False # verbose debug prints from this script?
1024
1025 def allow_db_ver(db_ver):
1026 """Returns a boolean if the given BerkeleyDB version is acceptable.
1027
1028 Args:
1029 db_ver: A tuple of the version to verify.
1030 """
1031 if not (min_db_ver <= db_ver <= max_db_ver):
1032 return False
1033 return True
1034
1035 def gen_db_minor_ver_nums(major):
1036 if major == 4:
1037 for x in range(max_db_ver[1]+1):
1038 if allow_db_ver((4, x)):
1039 yield x
1040 elif major == 3:
1041 for x in (3,):
1042 if allow_db_ver((3, x)):
1043 yield x
1044 else:
1045 raise ValueError("unknown major BerkeleyDB version", major)
1046
1047 # construct a list of paths to look for the header file in on
1048 # top of the normal inc_dirs.
1049 db_inc_paths = [
1050 '/usr/include/db4',
1051 '/usr/local/include/db4',
1052 '/opt/sfw/include/db4',
1053 '/usr/include/db3',
1054 '/usr/local/include/db3',
1055 '/opt/sfw/include/db3',
1056 # Fink defaults (http://fink.sourceforge.net/)
1057 '/sw/include/db4',
1058 '/sw/include/db3',
1059 ]
1060 # 4.x minor number specific paths
1061 for x in gen_db_minor_ver_nums(4):
1062 db_inc_paths.append('/usr/include/db4%d' % x)
1063 db_inc_paths.append('/usr/include/db4.%d' % x)
1064 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1065 db_inc_paths.append('/usr/local/include/db4%d' % x)
1066 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1067 db_inc_paths.append('/opt/db-4.%d/include' % x)
1068 # MacPorts default (http://www.macports.org/)
1069 db_inc_paths.append('/opt/local/include/db4%d' % x)
1070 # 3.x minor number specific paths
1071 for x in gen_db_minor_ver_nums(3):
1072 db_inc_paths.append('/usr/include/db3%d' % x)
1073 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1074 db_inc_paths.append('/usr/local/include/db3%d' % x)
1075 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1076 db_inc_paths.append('/opt/db-3.%d/include' % x)
1077
Victor Stinner4cbea512019-02-28 17:48:38 +01001078 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001079 db_inc_paths = []
1080
Georg Brandl489cb4f2009-07-11 10:08:49 +00001081 # Add some common subdirectories for Sleepycat DB to the list,
1082 # based on the standard include directories. This way DB3/4 gets
1083 # picked up when it is installed in a non-standard prefix and
1084 # the user has added that prefix into inc_dirs.
1085 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001086 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001087 std_variants.append(os.path.join(dn, 'db3'))
1088 std_variants.append(os.path.join(dn, 'db4'))
1089 for x in gen_db_minor_ver_nums(4):
1090 std_variants.append(os.path.join(dn, "db4%d"%x))
1091 std_variants.append(os.path.join(dn, "db4.%d"%x))
1092 for x in gen_db_minor_ver_nums(3):
1093 std_variants.append(os.path.join(dn, "db3%d"%x))
1094 std_variants.append(os.path.join(dn, "db3.%d"%x))
1095
1096 db_inc_paths = std_variants + db_inc_paths
1097 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1098
1099 db_ver_inc_map = {}
1100
Victor Stinner4cbea512019-02-28 17:48:38 +01001101 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001102 sysroot = macosx_sdk_root()
1103
Georg Brandl489cb4f2009-07-11 10:08:49 +00001104 class db_found(Exception): pass
1105 try:
1106 # See whether there is a Sleepycat header in the standard
1107 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001108 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001109 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001110 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001111 f = os.path.join(sysroot, d[1:], "db.h")
1112
Georg Brandl489cb4f2009-07-11 10:08:49 +00001113 if db_setup_debug: print("db: looking for db.h in", f)
1114 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001115 with open(f, 'rb') as file:
1116 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001117 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001118 if m:
1119 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001120 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001121 db_minor = int(m.group(1))
1122 db_ver = (db_major, db_minor)
1123
1124 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1125 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001126 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001127 db_patch = int(m.group(1))
1128 if db_patch < 21:
1129 print("db.h:", db_ver, "patch", db_patch,
1130 "being ignored (4.6.x must be >= 4.6.21)")
1131 continue
1132
1133 if ( (db_ver not in db_ver_inc_map) and
1134 allow_db_ver(db_ver) ):
1135 # save the include directory with the db.h version
1136 # (first occurrence only)
1137 db_ver_inc_map[db_ver] = d
1138 if db_setup_debug:
1139 print("db.h: found", db_ver, "in", d)
1140 else:
1141 # we already found a header for this library version
1142 if db_setup_debug: print("db.h: ignoring", d)
1143 else:
1144 # ignore this header, it didn't contain a version number
1145 if db_setup_debug:
1146 print("db.h: no version number version in", d)
1147
1148 db_found_vers = list(db_ver_inc_map.keys())
1149 db_found_vers.sort()
1150
1151 while db_found_vers:
1152 db_ver = db_found_vers.pop()
1153 db_incdir = db_ver_inc_map[db_ver]
1154
1155 # check lib directories parallel to the location of the header
1156 db_dirs_to_check = [
1157 db_incdir.replace("include", 'lib64'),
1158 db_incdir.replace("include", 'lib'),
1159 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001160
Victor Stinner4cbea512019-02-28 17:48:38 +01001161 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001162 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1163
1164 else:
1165 # Same as other branch, but takes OSX SDK into account
1166 tmp = []
1167 for dn in db_dirs_to_check:
1168 if is_macosx_sdk_path(dn):
1169 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1170 tmp.append(dn)
1171 else:
1172 if os.path.isdir(dn):
1173 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001174 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001175
1176 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001177
Ezio Melotti42da6632011-03-15 05:18:48 +02001178 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001179 # XXX should we -ever- look for a dbX name? Do any
1180 # systems really not name their library by version and
1181 # symlink to more general names?
1182 for dblib in (('db-%d.%d' % db_ver),
1183 ('db%d%d' % db_ver),
1184 ('db%d' % db_ver[0])):
1185 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001186 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001187 if dblib_file:
1188 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1189 raise db_found
1190 else:
1191 if db_setup_debug: print("db lib: ", dblib, "not found")
1192
1193 except db_found:
1194 if db_setup_debug:
1195 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1196 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001197 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001198 # Only add the found library and include directories if they aren't
1199 # already being searched. This avoids an explicit runtime library
1200 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001201 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001202 db_incs = None
1203 else:
1204 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001205 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001206 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001207 else:
1208 if db_setup_debug: print("db: no appropriate library found")
1209 db_incs = None
1210 dblibs = []
1211 dblib_dir = None
1212
Victor Stinner5ec33a12019-03-01 16:43:28 +01001213 dbm_setup_debug = False # verbose debug prints from this script?
1214 dbm_order = ['gdbm']
1215 # The standard Unix dbm module:
1216 if not CYGWIN:
1217 config_args = [arg.strip("'")
1218 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1219 dbm_args = [arg for arg in config_args
1220 if arg.startswith('--with-dbmliborder=')]
1221 if dbm_args:
1222 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1223 else:
1224 dbm_order = "ndbm:gdbm:bdb".split(":")
1225 dbmext = None
1226 for cand in dbm_order:
1227 if cand == "ndbm":
1228 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1229 # Some systems have -lndbm, others have -lgdbm_compat,
1230 # others don't have either
1231 if self.compiler.find_library_file(self.lib_dirs,
1232 'ndbm'):
1233 ndbm_libs = ['ndbm']
1234 elif self.compiler.find_library_file(self.lib_dirs,
1235 'gdbm_compat'):
1236 ndbm_libs = ['gdbm_compat']
1237 else:
1238 ndbm_libs = []
1239 if dbm_setup_debug: print("building dbm using ndbm")
1240 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1241 define_macros=[
1242 ('HAVE_NDBM_H',None),
1243 ],
1244 libraries=ndbm_libs)
1245 break
1246
1247 elif cand == "gdbm":
1248 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1249 gdbm_libs = ['gdbm']
1250 if self.compiler.find_library_file(self.lib_dirs,
1251 'gdbm_compat'):
1252 gdbm_libs.append('gdbm_compat')
1253 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1254 if dbm_setup_debug: print("building dbm using gdbm")
1255 dbmext = Extension(
1256 '_dbm', ['_dbmmodule.c'],
1257 define_macros=[
1258 ('HAVE_GDBM_NDBM_H', None),
1259 ],
1260 libraries = gdbm_libs)
1261 break
1262 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1263 if dbm_setup_debug: print("building dbm using gdbm")
1264 dbmext = Extension(
1265 '_dbm', ['_dbmmodule.c'],
1266 define_macros=[
1267 ('HAVE_GDBM_DASH_NDBM_H', None),
1268 ],
1269 libraries = gdbm_libs)
1270 break
1271 elif cand == "bdb":
1272 if dblibs:
1273 if dbm_setup_debug: print("building dbm using bdb")
1274 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1275 library_dirs=dblib_dir,
1276 runtime_library_dirs=dblib_dir,
1277 include_dirs=db_incs,
1278 define_macros=[
1279 ('HAVE_BERKDB_H', None),
1280 ('DB_DBM_HSEARCH', None),
1281 ],
1282 libraries=dblibs)
1283 break
1284 if dbmext is not None:
1285 self.add(dbmext)
1286 else:
1287 self.missing.append('_dbm')
1288
1289 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1290 if ('gdbm' in dbm_order and
1291 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1292 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1293 libraries=['gdbm']))
1294 else:
1295 self.missing.append('_gdbm')
1296
1297 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001298 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001299 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001300
1301 # We hunt for #define SQLITE_VERSION "n.n.n"
Charles Pigottad0daf52019-04-26 16:38:12 +01001302 # We need to find >= sqlite version 3.3.9, for sqlite3_prepare_v2
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001303 sqlite_incdir = sqlite_libdir = None
1304 sqlite_inc_paths = [ '/usr/include',
1305 '/usr/include/sqlite',
1306 '/usr/include/sqlite3',
1307 '/usr/local/include',
1308 '/usr/local/include/sqlite',
1309 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001310 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001311 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001312 sqlite_inc_paths = []
Charles Pigottad0daf52019-04-26 16:38:12 +01001313 MIN_SQLITE_VERSION_NUMBER = (3, 3, 9)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001314 MIN_SQLITE_VERSION = ".".join([str(x)
1315 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001316
1317 # Scan the default include directories before the SQLite specific
1318 # ones. This allows one to override the copy of sqlite on OSX,
1319 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001320 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001321 sysroot = macosx_sdk_root()
1322
Victor Stinner625dbf22019-03-01 15:59:39 +01001323 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001324 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001325 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001326 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001327
Ned Deily9b635832012-08-05 15:13:33 -07001328 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001329 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001330 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001331 with open(f) as file:
1332 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001333 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001334 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001335 if m:
1336 sqlite_version = m.group(1)
1337 sqlite_version_tuple = tuple([int(x)
1338 for x in sqlite_version.split(".")])
1339 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1340 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001341 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001342 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001343 sqlite_incdir = d
1344 break
1345 else:
1346 if sqlite_setup_debug:
Charles Pigottad0daf52019-04-26 16:38:12 +01001347 print("%s: version %s is too old, need >= %s"%(d,
Guido van Rossum452bf512007-02-09 05:32:43 +00001348 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001349 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001350 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001351
1352 if sqlite_incdir:
1353 sqlite_dirs_to_check = [
1354 os.path.join(sqlite_incdir, '..', 'lib64'),
1355 os.path.join(sqlite_incdir, '..', 'lib'),
1356 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1357 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1358 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001359 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001360 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001361 if sqlite_libfile:
1362 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001363
1364 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001365 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001366 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001367 '_sqlite/cursor.c',
1368 '_sqlite/microprotocols.c',
1369 '_sqlite/module.c',
1370 '_sqlite/prepare_protocol.c',
1371 '_sqlite/row.c',
1372 '_sqlite/statement.c',
1373 '_sqlite/util.c', ]
1374
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001375 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001376 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001377 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1378 else:
1379 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1380
Benjamin Peterson076ed002010-10-31 17:11:02 +00001381 # Enable support for loadable extensions in the sqlite3 module
1382 # if --enable-loadable-sqlite-extensions configure option is used.
1383 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1384 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001385
Victor Stinner4cbea512019-02-28 17:48:38 +01001386 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001387 # In every directory on the search path search for a dynamic
1388 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001389 # for dynamic libraries on the entire path.
1390 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001391 # before the dynamic library in /usr/lib.
1392 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1393 else:
1394 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001395
Brett Cannonc5011fe2011-06-06 20:09:10 -07001396 include_dirs = ["Modules/_sqlite"]
1397 # Only include the directory where sqlite was found if it does
1398 # not already exist in set include directories, otherwise you
1399 # can end up with a bad search path order.
1400 if sqlite_incdir not in self.compiler.include_dirs:
1401 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001402 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001403 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001404 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001405 self.add(Extension('_sqlite3', sqlite_srcs,
1406 define_macros=sqlite_defines,
1407 include_dirs=include_dirs,
1408 library_dirs=sqlite_libdir,
1409 extra_link_args=sqlite_extra_link_args,
1410 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001411 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001412 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001413
Victor Stinner5ec33a12019-03-01 16:43:28 +01001414 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001415 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001416 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001417 if not VXWORKS:
1418 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001419 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001420 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001421 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001422 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001423 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001424
Victor Stinner5ec33a12019-03-01 16:43:28 +01001425 # Platform-specific libraries
1426 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1427 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001428 else:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001429 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001430
Victor Stinner5ec33a12019-03-01 16:43:28 +01001431 if MACOS:
1432 self.add(Extension('_scproxy', ['_scproxy.c'],
1433 extra_link_args=[
1434 '-framework', 'SystemConfiguration',
1435 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001436
Victor Stinner5ec33a12019-03-01 16:43:28 +01001437 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001438 # Andrew Kuchling's zlib module. Note that some versions of zlib
1439 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1440 # http://www.cert.org/advisories/CA-2002-07.html
1441 #
1442 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1443 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1444 # now, we still accept 1.1.3, because we think it's difficult to
1445 # exploit this in Python, and we'd rather make it RedHat's problem
1446 # than our problem <wink>.
1447 #
1448 # You can upgrade zlib to version 1.1.4 yourself by going to
1449 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001450 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001451 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001452 if zlib_inc is not None:
1453 zlib_h = zlib_inc[0] + '/zlib.h'
1454 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001455 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001456 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001457 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001458 with open(zlib_h) as fp:
1459 while 1:
1460 line = fp.readline()
1461 if not line:
1462 break
1463 if line.startswith('#define ZLIB_VERSION'):
1464 version = line.split()[2]
1465 break
Guido van Rossume6970912001-04-15 15:16:12 +00001466 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001467 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001468 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001469 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1470 else:
1471 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001472 self.add(Extension('zlib', ['zlibmodule.c'],
1473 libraries=['z'],
1474 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001475 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001476 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001477 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001478 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001479 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001480 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001481 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001482
Christian Heimes1dc54002008-03-24 02:19:29 +00001483 # Helper module for various ascii-encoders. Uses zlib for an optimized
1484 # crc32 if we have it. Otherwise binascii uses its own.
1485 if have_zlib:
1486 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1487 libraries = ['z']
1488 extra_link_args = zlib_extra_link_args
1489 else:
1490 extra_compile_args = []
1491 libraries = []
1492 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001493 self.add(Extension('binascii', ['binascii.c'],
1494 extra_compile_args=extra_compile_args,
1495 libraries=libraries,
1496 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001497
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001498 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001499 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001500 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001501 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1502 else:
1503 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001504 self.add(Extension('_bz2', ['_bz2module.c'],
1505 libraries=['bz2'],
1506 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001507 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001508 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001509
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001510 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001511 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001512 self.add(Extension('_lzma', ['_lzmamodule.c'],
1513 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001514 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001515 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001516
Victor Stinner5ec33a12019-03-01 16:43:28 +01001517 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001518 # Interface to the Expat XML parser
1519 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001520 # Expat was written by James Clark and is now maintained by a group of
1521 # developers on SourceForge; see www.libexpat.org for more information.
1522 # The pyexpat module was written by Paul Prescod after a prototype by
1523 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1524 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001525 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001526 #
1527 # More information on Expat can be found at www.libexpat.org.
1528 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001529 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1530 expat_inc = []
1531 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001532 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001533 expat_lib = ['expat']
1534 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001535 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001536 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001537 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001538 define_macros = [
1539 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001540 # bpo-30947: Python uses best available entropy sources to
1541 # call XML_SetHashSalt(), expat entropy sources are not needed
1542 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001543 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001544 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001545 expat_lib = []
1546 expat_sources = ['expat/xmlparse.c',
1547 'expat/xmlrole.c',
1548 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001549 expat_depends = ['expat/ascii.h',
1550 'expat/asciitab.h',
1551 'expat/expat.h',
1552 'expat/expat_config.h',
1553 'expat/expat_external.h',
1554 'expat/internal.h',
1555 'expat/latin1tab.h',
1556 'expat/utf8tab.h',
1557 'expat/xmlrole.h',
1558 'expat/xmltok.h',
1559 'expat/xmltok_impl.h'
1560 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001561
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001562 cc = sysconfig.get_config_var('CC').split()[0]
1563 ret = os.system(
1564 '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc)
1565 if ret >> 8 == 0:
1566 extra_compile_args.append('-Wno-implicit-fallthrough')
1567
Victor Stinner8058bda2019-03-01 15:31:45 +01001568 self.add(Extension('pyexpat',
1569 define_macros=define_macros,
1570 extra_compile_args=extra_compile_args,
1571 include_dirs=expat_inc,
1572 libraries=expat_lib,
1573 sources=['pyexpat.c'] + expat_sources,
1574 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001575
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001576 # Fredrik Lundh's cElementTree module. Note that this also
1577 # uses expat (via the CAPI hook in pyexpat).
1578
Victor Stinner625dbf22019-03-01 15:59:39 +01001579 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001580 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001581 self.add(Extension('_elementtree',
1582 define_macros=define_macros,
1583 include_dirs=expat_inc,
1584 libraries=expat_lib,
1585 sources=['_elementtree.c'],
1586 depends=['pyexpat.c', *expat_sources,
1587 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001588 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001589 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001590
Victor Stinner5ec33a12019-03-01 16:43:28 +01001591 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001592 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001593 self.add(Extension('_multibytecodec',
1594 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001595 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001596 self.add(Extension('_codecs_%s' % loc,
1597 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001598
Victor Stinner5ec33a12019-03-01 16:43:28 +01001599 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001600 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001601 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001602 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1603 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001604
1605 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001606 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001607 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1608 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001609 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001610 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1611 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001612 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001613 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001614 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1615 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001616 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001617 self.add(Extension('_posixshmem', posixshmem_srcs,
1618 define_macros={},
1619 libraries=libs,
1620 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001621
Victor Stinner8058bda2019-03-01 15:31:45 +01001622 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001623 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001624
Victor Stinner5ec33a12019-03-01 16:43:28 +01001625 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001626 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001627 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001628 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001629 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001630 uuid_libs = ['uuid']
1631 else:
1632 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001633 self.add(Extension('_uuid', ['_uuidmodule.c'],
1634 libraries=uuid_libs,
1635 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001636 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001637 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001638
Victor Stinner5ec33a12019-03-01 16:43:28 +01001639 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001640 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001641 self.init_inc_lib_dirs()
1642
1643 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001644 if TEST_EXTENSIONS:
1645 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001646 self.detect_readline_curses()
1647 self.detect_crypt()
1648 self.detect_socket()
1649 self.detect_openssl_hashlib()
xdegaye2ee077f2019-04-09 17:20:08 +02001650 self.detect_hash_builtins()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001651 self.detect_dbm_gdbm()
1652 self.detect_sqlite()
1653 self.detect_platform_specific_exts()
1654 self.detect_nis()
1655 self.detect_compress_exts()
1656 self.detect_expat_elementtree()
1657 self.detect_multibytecodecs()
1658 self.detect_decimal()
1659 self.detect_ctypes()
1660 self.detect_multiprocessing()
1661 if not self.detect_tkinter():
1662 self.missing.append('_tkinter')
1663 self.detect_uuid()
1664
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001665## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001666## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001667
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001668 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001669 self.add(Extension('xxlimited', ['xxlimited.c'],
1670 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001671
Ned Deilyd819b932013-09-06 01:07:05 -07001672 def detect_tkinter_explicitly(self):
1673 # Build _tkinter using explicit locations for Tcl/Tk.
1674 #
1675 # This is enabled when both arguments are given to ./configure:
1676 #
1677 # --with-tcltk-includes="-I/path/to/tclincludes \
1678 # -I/path/to/tkincludes"
1679 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1680 # -L/path/to/tklibs -ltkm.n"
1681 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001682 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001683 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1684 #
1685 # This can be useful for building and testing tkinter with multiple
1686 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1687 # build of Tcl so you need to specify both arguments and use care when
1688 # overriding.
1689
1690 # The _TCLTK variables are created in the Makefile sharedmods target.
1691 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1692 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1693 if not (tcltk_includes and tcltk_libs):
1694 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001695 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001696
1697 extra_compile_args = tcltk_includes.split()
1698 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001699 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1700 define_macros=[('WITH_APPINIT', 1)],
1701 extra_compile_args = extra_compile_args,
1702 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001703 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001704
Victor Stinner625dbf22019-03-01 15:59:39 +01001705 def detect_tkinter_darwin(self):
Jack Jansen0b06be72002-06-21 14:48:38 +00001706 # The _tkinter module, using frameworks. Since frameworks are quite
1707 # different the UNIX search logic is not sharable.
1708 from os.path import join, exists
1709 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001710 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001711 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001712 join(os.getenv('HOME'), '/Library/Frameworks')
1713 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001714
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001715 sysroot = macosx_sdk_root()
1716
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001717 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001718 # bundles.
1719 # XXX distutils should support -F!
1720 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001721 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001722
1723
Jack Jansen0b06be72002-06-21 14:48:38 +00001724 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001725 if is_macosx_sdk_path(F):
1726 if not exists(join(sysroot, F[1:], fw + '.framework')):
1727 break
1728 else:
1729 if not exists(join(F, fw + '.framework')):
1730 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001731 else:
1732 # ok, F is now directory with both frameworks. Continure
1733 # building
1734 break
1735 else:
1736 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1737 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001738 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001739
Jack Jansen0b06be72002-06-21 14:48:38 +00001740 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1741 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001742 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001743 #
1744 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001745 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001746 for fw in ('Tcl', 'Tk')
1747 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001748 ]
1749
Tim Peters2c60f7a2003-01-29 03:49:43 +00001750 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001751 # complicated search, this is a hard-coded path. It could bail out
1752 # if X11 libs are not found...
1753 include_dirs.append('/usr/X11R6/include')
1754 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1755
Georg Brandlfcaf9102008-07-16 02:17:56 +00001756 # All existing framework builds of Tcl/Tk don't support 64-bit
1757 # architectures.
1758 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001759 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001760
Ronald Oussorend097efe2009-09-15 19:07:58 +00001761 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1762 if not os.path.exists(self.build_temp):
1763 os.makedirs(self.build_temp)
1764
1765 # Note: cannot use os.popen or subprocess here, that
1766 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001767 if is_macosx_sdk_path(F):
1768 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1769 else:
1770 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001771
Brett Cannon9f5db072010-10-29 20:19:27 +00001772 with open(tmpfile) as fp:
1773 detected_archs = []
1774 for ln in fp:
1775 a = ln.split()[-1]
1776 if a in archs:
1777 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001778 os.unlink(tmpfile)
1779
1780 for a in detected_archs:
1781 frameworks.append('-arch')
1782 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001783
Victor Stinnercfe172d2019-03-01 18:21:49 +01001784 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1785 define_macros=[('WITH_APPINIT', 1)],
1786 include_dirs=include_dirs,
1787 libraries=[],
1788 extra_compile_args=frameworks[2:],
1789 extra_link_args=frameworks))
Victor Stinner4cbea512019-02-28 17:48:38 +01001790 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001791
Victor Stinner625dbf22019-03-01 15:59:39 +01001792 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001793 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001794
Ned Deilyd819b932013-09-06 01:07:05 -07001795 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1796 # configured or passed into the make target. If so, use these values
1797 # to build tkinter and bypass the searches for Tcl and TK in standard
1798 # locations.
1799 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01001800 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001801
Jack Jansen0b06be72002-06-21 14:48:38 +00001802 # Rather than complicate the code below, detecting and building
1803 # AquaTk is a separate method. Only one Tkinter will be built on
1804 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01001805 if (MACOS and self.detect_tkinter_darwin()):
1806 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001807
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001808 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001809 # The versions with dots are used on Unix, and the versions without
1810 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001811 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001812 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1813 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01001814 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001815 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01001816 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001817 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001818 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001819 # Exit the loop when we've found the Tcl/Tk libraries
1820 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001821
Fredrik Lundhade711a2001-01-24 08:00:28 +00001822 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001823 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001824 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001825 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001826 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01001827 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001828 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1829 # but the include subdirs are named like .../include/tcl8.3.
1830 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1831 tcl_include_sub = []
1832 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001833 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001834 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1835 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1836 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01001837 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
1838 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001839
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001840 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001841 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001842 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01001843 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00001844
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001845 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001846
Victor Stinnercfe172d2019-03-01 18:21:49 +01001847 include_dirs = []
1848 libs = []
1849 defs = []
1850 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001851 for dir in tcl_includes + tk_includes:
1852 if dir not in include_dirs:
1853 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001854
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001855 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01001856 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001857 include_dirs.append('/usr/openwin/include')
1858 added_lib_dirs.append('/usr/openwin/lib')
1859 elif os.path.exists('/usr/X11R6/include'):
1860 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001861 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001862 added_lib_dirs.append('/usr/X11R6/lib')
1863 elif os.path.exists('/usr/X11R5/include'):
1864 include_dirs.append('/usr/X11R5/include')
1865 added_lib_dirs.append('/usr/X11R5/lib')
1866 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001867 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001868 include_dirs.append('/usr/X11/include')
1869 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001870
Jason Tishler9181c942003-02-05 15:16:17 +00001871 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01001872 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00001873 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1874 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001875 return False
Jason Tishler9181c942003-02-05 15:16:17 +00001876
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001877 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01001878 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001879 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001880 defs.append( ('WITH_BLT', 1) )
1881 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01001882 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001883 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001884 defs.append( ('WITH_BLT', 1) )
1885 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001886
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001887 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001888 libs.append('tk'+ version)
1889 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001890
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001891 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01001892 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001893 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001894
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001895 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001896 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001897 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001898 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001899 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001900 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001901 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001902
Victor Stinnercfe172d2019-03-01 18:21:49 +01001903 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1904 define_macros=[('WITH_APPINIT', 1)] + defs,
1905 include_dirs=include_dirs,
1906 libraries=libs,
1907 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01001908 return True
1909
Christian Heimes78644762008-03-04 23:39:23 +00001910 def configure_ctypes_darwin(self, ext):
1911 # Darwin (OS X) uses preconfigured files, in
1912 # the Modules/_ctypes/libffi_osx directory.
Victor Stinner625dbf22019-03-01 15:59:39 +01001913 ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules',
Christian Heimes78644762008-03-04 23:39:23 +00001914 '_ctypes', 'libffi_osx'))
1915 sources = [os.path.join(ffi_srcdir, p)
1916 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001917 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001918 'x86/x86-darwin.S',
1919 'x86/x86-ffi_darwin.c',
1920 'x86/x86-ffi64.c',
1921 'powerpc/ppc-darwin.S',
1922 'powerpc/ppc-darwin_closure.S',
1923 'powerpc/ppc-ffi_darwin.c',
1924 'powerpc/ppc64-darwin_closure.S',
1925 ]]
1926
1927 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001928 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001929
1930 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1931 os.path.join(ffi_srcdir, 'powerpc')]
1932 ext.include_dirs.extend(include_dirs)
1933 ext.sources.extend(sources)
1934 return True
1935
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001936 def configure_ctypes(self, ext):
1937 if not self.use_system_libffi:
Victor Stinner4cbea512019-02-28 17:48:38 +01001938 if MACOS:
Christian Heimes78644762008-03-04 23:39:23 +00001939 return self.configure_ctypes_darwin(ext)
Zachary Waref40d4dd2016-09-17 01:25:24 -05001940 print('INFO: Could not locate ffi libs and/or headers')
1941 return False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001942 return True
1943
Victor Stinner625dbf22019-03-01 15:59:39 +01001944 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001945 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001946 self.use_system_libffi = False
1947 include_dirs = []
1948 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001949 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001950 sources = ['_ctypes/_ctypes.c',
1951 '_ctypes/callbacks.c',
1952 '_ctypes/callproc.c',
1953 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001954 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001955 depends = ['_ctypes/ctypes.h']
1956
Victor Stinner4cbea512019-02-28 17:48:38 +01001957 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00001958 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001959 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001960 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001961 include_dirs.append('_ctypes/darwin')
Victor Stinner5ec33a12019-03-01 16:43:28 +01001962 # XXX Is this still needed?
1963 # extra_link_args.extend(['-read_only_relocs', 'warning'])
Thomas Hellercf567c12006-03-08 19:51:58 +00001964
Victor Stinner4cbea512019-02-28 17:48:38 +01001965 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001966 # XXX This shouldn't be necessary; it appears that some
1967 # of the assembler code is non-PIC (i.e. it has relocations
1968 # when it shouldn't. The proper fix would be to rewrite
1969 # the assembler code to be PIC.
1970 # This only works with GCC; the Sun compiler likely refuses
1971 # this option. If you want to compile ctypes with the Sun
1972 # compiler, please research a proper solution, instead of
1973 # finding some -z option for the Sun compiler.
1974 extra_link_args.append('-mimpure-text')
1975
Victor Stinner4cbea512019-02-28 17:48:38 +01001976 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001977 extra_link_args.append('-fPIC')
1978
Thomas Hellercf567c12006-03-08 19:51:58 +00001979 ext = Extension('_ctypes',
1980 include_dirs=include_dirs,
1981 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001982 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001983 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001984 sources=sources,
1985 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01001986 self.add(ext)
1987 if TEST_EXTENSIONS:
1988 # function my_sqrt() needs libm for sqrt()
1989 self.add(Extension('_ctypes_test',
1990 sources=['_ctypes/_ctypes_test.c'],
1991 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00001992
Victor Stinner625dbf22019-03-01 15:59:39 +01001993 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01001994 if MACOS:
Zachary Ware935043d2016-09-09 17:01:21 -07001995 if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
1996 return
Christian Heimes78644762008-03-04 23:39:23 +00001997 # OS X 10.5 comes with libffi.dylib; the include files are
1998 # in /usr/include/ffi
Victor Stinner96d81582019-03-01 13:53:46 +01001999 ffi_inc_dirs.append('/usr/include/ffi')
Christian Heimes78644762008-03-04 23:39:23 +00002000
Benjamin Petersond78735d2010-01-01 16:04:23 +00002001 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00002002 if not ffi_inc or ffi_inc[0] == '':
Victor Stinner96d81582019-03-01 13:53:46 +01002003 ffi_inc = find_file('ffi.h', [], ffi_inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002004 if ffi_inc is not None:
2005 ffi_h = ffi_inc[0] + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002006 if not os.path.exists(ffi_h):
2007 ffi_inc = None
2008 print('Header file {} does not exist'.format(ffi_h))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002009 ffi_lib = None
2010 if ffi_inc is not None:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002011 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002012 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002013 ffi_lib = lib_name
2014 break
2015
2016 if ffi_inc and ffi_lib:
2017 ext.include_dirs.extend(ffi_inc)
2018 ext.libraries.append(ffi_lib)
2019 self.use_system_libffi = True
2020
Christian Heimes5bb96922018-02-25 10:22:14 +01002021 if sysconfig.get_config_var('HAVE_LIBDL'):
2022 # for dlopen, see bpo-32647
2023 ext.libraries.append('dl')
2024
Victor Stinner5ec33a12019-03-01 16:43:28 +01002025 def detect_decimal(self):
2026 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002027 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002028 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002029 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2030 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002031 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002032 sources = ['_decimal/_decimal.c']
2033 depends = ['_decimal/docstrings.h']
2034 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002035 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002036 'Modules',
2037 '_decimal',
2038 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002039 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002040 sources = [
2041 '_decimal/_decimal.c',
2042 '_decimal/libmpdec/basearith.c',
2043 '_decimal/libmpdec/constants.c',
2044 '_decimal/libmpdec/context.c',
2045 '_decimal/libmpdec/convolute.c',
2046 '_decimal/libmpdec/crt.c',
2047 '_decimal/libmpdec/difradix2.c',
2048 '_decimal/libmpdec/fnt.c',
2049 '_decimal/libmpdec/fourstep.c',
2050 '_decimal/libmpdec/io.c',
2051 '_decimal/libmpdec/memory.c',
2052 '_decimal/libmpdec/mpdecimal.c',
2053 '_decimal/libmpdec/numbertheory.c',
2054 '_decimal/libmpdec/sixstep.c',
2055 '_decimal/libmpdec/transpose.c',
2056 ]
2057 depends = [
2058 '_decimal/docstrings.h',
2059 '_decimal/libmpdec/basearith.h',
2060 '_decimal/libmpdec/bits.h',
2061 '_decimal/libmpdec/constants.h',
2062 '_decimal/libmpdec/convolute.h',
2063 '_decimal/libmpdec/crt.h',
2064 '_decimal/libmpdec/difradix2.h',
2065 '_decimal/libmpdec/fnt.h',
2066 '_decimal/libmpdec/fourstep.h',
2067 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002068 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002069 '_decimal/libmpdec/mpdecimal.h',
2070 '_decimal/libmpdec/numbertheory.h',
2071 '_decimal/libmpdec/sixstep.h',
2072 '_decimal/libmpdec/transpose.h',
2073 '_decimal/libmpdec/typearith.h',
2074 '_decimal/libmpdec/umodarith.h',
2075 ]
2076
Stefan Krah1919b7e2012-03-21 18:25:23 +01002077 config = {
2078 'x64': [('CONFIG_64','1'), ('ASM','1')],
2079 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2080 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2081 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2082 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2083 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2084 ('LEGACY_COMPILER','1')],
2085 'universal': [('UNIVERSAL','1')]
2086 }
2087
Stefan Krah1919b7e2012-03-21 18:25:23 +01002088 cc = sysconfig.get_config_var('CC')
2089 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2090 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2091
2092 if machine:
2093 # Override automatic configuration to facilitate testing.
2094 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002095 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002096 # Universal here means: build with the same options Python
2097 # was built with.
2098 define_macros = config['universal']
2099 elif sizeof_size_t == 8:
2100 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2101 define_macros = config['x64']
2102 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2103 define_macros = config['uint128']
2104 else:
2105 define_macros = config['ansi64']
2106 elif sizeof_size_t == 4:
2107 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2108 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002109 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002110 # solaris: problems with register allocation.
2111 # icc >= 11.0 works as well.
2112 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002113 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002114 else:
2115 define_macros = config['ansi32']
2116 else:
2117 raise DistutilsError("_decimal: unsupported architecture")
2118
2119 # Workarounds for toolchain bugs:
2120 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2121 # Some versions of gcc miscompile inline asm:
2122 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2123 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2124 extra_compile_args.append('-fno-ipa-pure-const')
2125 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2126 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2127 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2128 undef_macros.append('_FORTIFY_SOURCE')
2129
Stefan Krah1919b7e2012-03-21 18:25:23 +01002130 # Uncomment for extra functionality:
2131 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002132 self.add(Extension('_decimal',
2133 include_dirs=include_dirs,
2134 libraries=libraries,
2135 define_macros=define_macros,
2136 undef_macros=undef_macros,
2137 extra_compile_args=extra_compile_args,
2138 sources=sources,
2139 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140
Victor Stinner5ec33a12019-03-01 16:43:28 +01002141 def detect_openssl_hashlib(self):
2142 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002143 config_vars = sysconfig.get_config_vars()
2144
2145 def split_var(name, sep):
2146 # poor man's shlex, the re module is not available yet.
2147 value = config_vars.get(name)
2148 if not value:
2149 return ()
2150 # This trick works because ax_check_openssl uses --libs-only-L,
2151 # --libs-only-l, and --cflags-only-I.
2152 value = ' ' + value
2153 sep = ' ' + sep
2154 return [v.strip() for v in value.split(sep) if v.strip()]
2155
2156 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2157 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2158 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2159 if not openssl_libs:
2160 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002161 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002162 return None, None
2163
2164 # Find OpenSSL includes
2165 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002166 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002167 )
2168 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002169 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002170 return None, None
2171
2172 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2173 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002174 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002175 ['/usr/kerberos/include']
2176 )
2177 if krb5_h:
2178 ssl_incs.extend(krb5_h)
2179
Christian Heimes61d478c2018-01-27 15:51:38 +01002180 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Victor Stinner8058bda2019-03-01 15:31:45 +01002181 self.add(Extension('_ssl', ['_ssl.c'],
2182 include_dirs=openssl_includes,
2183 library_dirs=openssl_libdirs,
2184 libraries=openssl_libs,
2185 depends=['socketmodule.h']))
Christian Heimes61d478c2018-01-27 15:51:38 +01002186 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002187 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002188
Victor Stinner8058bda2019-03-01 15:31:45 +01002189 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2190 depends=['hashlib.h'],
2191 include_dirs=openssl_includes,
2192 library_dirs=openssl_libdirs,
2193 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002194
xdegaye2ee077f2019-04-09 17:20:08 +02002195 def detect_hash_builtins(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002196 # We always compile these even when OpenSSL is available (issue #14693).
2197 # It's harmless and the object code is tiny (40-50 KiB per module,
2198 # only loaded when actually used).
2199 self.add(Extension('_sha256', ['sha256module.c'],
2200 depends=['hashlib.h']))
2201 self.add(Extension('_sha512', ['sha512module.c'],
2202 depends=['hashlib.h']))
2203 self.add(Extension('_md5', ['md5module.c'],
2204 depends=['hashlib.h']))
2205 self.add(Extension('_sha1', ['sha1module.c'],
2206 depends=['hashlib.h']))
2207
2208 blake2_deps = glob(os.path.join(self.srcdir,
2209 'Modules/_blake2/impl/*'))
2210 blake2_deps.append('hashlib.h')
2211
2212 self.add(Extension('_blake2',
2213 ['_blake2/blake2module.c',
2214 '_blake2/blake2b_impl.c',
2215 '_blake2/blake2s_impl.c'],
2216 depends=blake2_deps))
2217
2218 sha3_deps = glob(os.path.join(self.srcdir,
2219 'Modules/_sha3/kcp/*'))
2220 sha3_deps.append('hashlib.h')
2221 self.add(Extension('_sha3',
2222 ['_sha3/sha3module.c'],
2223 depends=sha3_deps))
2224
2225 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002226 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002227 self.missing.append('nis')
2228 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002229
2230 libs = []
2231 library_dirs = []
2232 includes_dirs = []
2233
2234 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2235 # moved headers and libraries to libtirpc and libnsl. The headers
2236 # are in tircp and nsl sub directories.
2237 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002238 'rpcsvc/yp_prot.h', self.inc_dirs,
2239 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002240 )
2241 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002242 'rpc/rpc.h', self.inc_dirs,
2243 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002244 )
2245 if rpcsvc_inc is None or rpc_inc is None:
2246 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002247 self.missing.append('nis')
2248 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002249 includes_dirs.extend(rpcsvc_inc)
2250 includes_dirs.extend(rpc_inc)
2251
Victor Stinner625dbf22019-03-01 15:59:39 +01002252 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002253 libs.append('nsl')
2254 else:
2255 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002256 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002257 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2258 if libnsl is not None:
2259 library_dirs.append(os.path.dirname(libnsl))
2260 libs.append('nsl')
2261
Victor Stinner625dbf22019-03-01 15:59:39 +01002262 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002263 libs.append('tirpc')
2264
Victor Stinner8058bda2019-03-01 15:31:45 +01002265 self.add(Extension('nis', ['nismodule.c'],
2266 libraries=libs,
2267 library_dirs=library_dirs,
2268 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002269
Christian Heimesff5be6e2018-01-20 13:19:21 +01002270
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002271class PyBuildInstall(install):
2272 # Suppress the warning about installation into the lib_dynload
2273 # directory, which is not in sys.path when running Python during
2274 # installation:
2275 def initialize_options (self):
2276 install.initialize_options(self)
2277 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002278
Éric Araujoe6792c12011-06-09 14:07:02 +02002279 # Customize subcommands to not install an egg-info file for Python
2280 sub_commands = [('install_lib', install.has_lib),
2281 ('install_headers', install.has_headers),
2282 ('install_scripts', install.has_scripts),
2283 ('install_data', install.has_data)]
2284
2285
Michael W. Hudson529a5052002-12-17 16:47:17 +00002286class PyBuildInstallLib(install_lib):
2287 # Do exactly what install_lib does but make sure correct access modes get
2288 # set on installed directories and files. All installed files with get
2289 # mode 644 unless they are a shared library in which case they will get
2290 # mode 755. All installed directories will get mode 755.
2291
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002292 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2293 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002294
2295 def install(self):
2296 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002297 self.set_file_modes(outfiles, 0o644, 0o755)
2298 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002299 return outfiles
2300
2301 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002302 if not files: return
2303
2304 for filename in files:
2305 if os.path.islink(filename): continue
2306 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002307 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002308 log.info("changing mode of %s to %o", filename, mode)
2309 if not self.dry_run: os.chmod(filename, mode)
2310
2311 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002312 for dirpath, dirnames, fnames in os.walk(dirname):
2313 if os.path.islink(dirpath):
2314 continue
2315 log.info("changing mode of %s to %o", dirpath, mode)
2316 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002317
Victor Stinnerc991f242019-03-01 17:19:04 +01002318
Georg Brandlff52f762010-12-28 09:51:43 +00002319class PyBuildScripts(build_scripts):
2320 def copy_scripts(self):
2321 outfiles, updated_files = build_scripts.copy_scripts(self)
2322 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2323 minoronly = '.{0[1]}'.format(sys.version_info)
2324 newoutfiles = []
2325 newupdated_files = []
2326 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002327 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002328 newfilename = filename + fullversion
2329 else:
2330 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002331 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002332 os.rename(filename, newfilename)
2333 newoutfiles.append(newfilename)
2334 if filename in updated_files:
2335 newupdated_files.append(newfilename)
2336 return newoutfiles, newupdated_files
2337
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002338
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002339def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002340 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2341 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2342
2343 class DummyProcess:
2344 """Hack for parallel build"""
2345 ProcessPoolExecutor = None
2346
2347 sys.modules['concurrent.futures.process'] = DummyProcess
2348
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002349 # turn off warnings when deprecated modules are imported
2350 import warnings
2351 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002352 setup(# PyPI Metadata (PEP 301)
2353 name = "Python",
2354 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002355 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002356 maintainer = "Guido van Rossum and the Python community",
2357 maintainer_email = "python-dev@python.org",
2358 description = "A high-level object-oriented programming language",
2359 long_description = SUMMARY.strip(),
2360 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002361 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002362 platforms = ["Many"],
2363
2364 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002365 cmdclass = {'build_ext': PyBuildExt,
2366 'build_scripts': PyBuildScripts,
2367 'install': PyBuildInstall,
2368 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002369 # The struct module is defined here, because build_ext won't be
2370 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002371 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002372
Georg Brandlff52f762010-12-28 09:51:43 +00002373 # If you change the scripts installed here, you also need to
2374 # check the PyBuildScripts command above, and change the links
2375 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002376 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002377 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002378 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002379
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002380# --install-platlib
2381if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002382 main()