blob: c278f08b8e6d2f41cdf86713b9eb27572004c442 [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +00002
Victor Stinner625dbf22019-03-01 15:59:39 +01003import argparse
Eric Snow335e14d2014-01-04 15:09:28 -07004import importlib._bootstrap
Victor Stinner625dbf22019-03-01 15:59:39 +01005import importlib.machinery
Eric Snow335e14d2014-01-04 15:09:28 -07006import importlib.util
Victor Stinner625dbf22019-03-01 15:59:39 +01007import os
8import re
9import sys
Tarek Ziadéedacea32010-01-29 11:41:03 +000010import sysconfig
Victor Stinner625dbf22019-03-01 15:59:39 +010011from glob import glob
Michael W. Hudson529a5052002-12-17 16:47:17 +000012
13from distutils import log
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000014from distutils.command.build_ext import build_ext
Victor Stinner625dbf22019-03-01 15:59:39 +010015from distutils.command.build_scripts import build_scripts
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000016from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000017from distutils.command.install_lib import install_lib
Victor Stinner625dbf22019-03-01 15:59:39 +010018from distutils.core import Extension, setup
19from distutils.errors import CCompilerError, DistutilsError
Stefan Krah095b2732010-06-08 13:41:44 +000020from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000021
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020022
Victor Stinnercfe172d2019-03-01 18:21:49 +010023# Compile extensions used to test Python?
24TEST_EXTENSIONS = True
25
26# This global variable is used to hold the list of modules to be disabled.
27DISABLED_MODULE_LIST = []
28
29
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020030def get_platform():
Victor Stinnerc991f242019-03-01 17:19:04 +010031 # Cross compiling
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020032 if "_PYTHON_HOST_PLATFORM" in os.environ:
33 return os.environ["_PYTHON_HOST_PLATFORM"]
Victor Stinnerc991f242019-03-01 17:19:04 +010034
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020035 # Get value of sys.platform
36 if sys.platform.startswith('osf1'):
37 return 'osf1'
38 return sys.platform
Victor Stinnerc991f242019-03-01 17:19:04 +010039
40
41CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ)
Victor Stinner4cbea512019-02-28 17:48:38 +010042HOST_PLATFORM = get_platform()
43MS_WINDOWS = (HOST_PLATFORM == 'win32')
44CYGWIN = (HOST_PLATFORM == 'cygwin')
45MACOS = (HOST_PLATFORM == 'darwin')
Victor Stinner4cbea512019-02-28 17:48:38 +010046VXWORKS = ('vxworks' in HOST_PLATFORM)
pxinwr32f5fdd2019-02-27 19:09:28 +080047
Victor Stinnerc991f242019-03-01 17:19:04 +010048
49SUMMARY = """
50Python is an interpreted, interactive, object-oriented programming
51language. It is often compared to Tcl, Perl, Scheme or Java.
52
53Python combines remarkable power with very clear syntax. It has
54modules, classes, exceptions, very high level dynamic data types, and
55dynamic typing. There are interfaces to many system calls and
56libraries, as well as to various windowing systems (X11, Motif, Tk,
57Mac, MFC). New built-in modules are easily written in C or C++. Python
58is also usable as an extension language for applications that need a
59programmable interface.
60
61The Python implementation is portable: it runs on many brands of UNIX,
62on Windows, DOS, Mac, Amiga... If your favorite system isn't
63listed here, it may still be supported, if there's a C compiler for
64it. Ask around on comp.lang.python -- or just try compiling Python
65yourself.
66"""
67
68CLASSIFIERS = """
69Development Status :: 6 - Mature
70License :: OSI Approved :: Python Software Foundation License
71Natural Language :: English
72Programming Language :: C
73Programming Language :: Python
74Topic :: Software Development
75"""
76
77
78# Set common compiler and linker flags derived from the Makefile,
79# reserved for building the interpreter and the stdlib modules.
80# See bpo-21121 and bpo-35257
81def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
82 flags = sysconfig.get_config_var(compiler_flags)
83 py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
84 sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
85
86
Michael W. Hudson39230b32002-01-16 15:26:48 +000087def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000088 """Add the directory 'dir' to the list 'dirlist' (after any relative
89 directories) if:
90
Michael W. Hudson39230b32002-01-16 15:26:48 +000091 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000092 2) 'dir' actually exists, and is a directory.
93 """
94 if dir is None or not os.path.isdir(dir) or dir in dirlist:
95 return
96 for i, path in enumerate(dirlist):
97 if not os.path.isabs(path):
98 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000099 return
100 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +0000101
Victor Stinnerc991f242019-03-01 17:19:04 +0100102
xdegaye77f51392017-11-25 17:25:30 +0100103def sysroot_paths(make_vars, subdirs):
104 """Get the paths of sysroot sub-directories.
105
106 * make_vars: a sequence of names of variables of the Makefile where
107 sysroot may be set.
108 * subdirs: a sequence of names of subdirectories used as the location for
109 headers or libraries.
110 """
111
112 dirs = []
113 for var_name in make_vars:
114 var = sysconfig.get_config_var(var_name)
115 if var is not None:
116 m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
117 if m is not None:
118 sysroot = m.group(1).strip('"')
119 for subdir in subdirs:
120 if os.path.isabs(subdir):
121 subdir = subdir[1:]
122 path = os.path.join(sysroot, subdir)
123 if os.path.isdir(path):
124 dirs.append(path)
125 break
126 return dirs
127
Victor Stinnerc991f242019-03-01 17:19:04 +0100128
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000129def macosx_sdk_root():
130 """
131 Return the directory of the current OSX SDK,
132 or '/' if no SDK was specified.
133 """
134 cflags = sysconfig.get_config_var('CFLAGS')
135 m = re.search(r'-isysroot\s+(\S+)', cflags)
136 if m is None:
137 sysroot = '/'
138 else:
139 sysroot = m.group(1)
140 return sysroot
141
Victor Stinnerc991f242019-03-01 17:19:04 +0100142
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000143def is_macosx_sdk_path(path):
144 """
145 Returns True if 'path' can be located in an OSX SDK
146 """
Ned Deily2910a7b2012-07-30 02:35:58 -0700147 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
148 or path.startswith('/System/')
149 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000150
Victor Stinnerc991f242019-03-01 17:19:04 +0100151
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000152def find_file(filename, std_dirs, paths):
153 """Searches for the directory where a given file is located,
154 and returns a possibly-empty list of additional directories, or None
155 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +0000156
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000157 'filename' is the name of a file, such as readline.h or libcrypto.a.
158 'std_dirs' is the list of standard system directories; if the
159 file is found in one of them, no additional directives are needed.
160 'paths' is a list of additional locations to check; if the file is
161 found in one of them, the resulting list will contain the directory.
162 """
Victor Stinner4cbea512019-02-28 17:48:38 +0100163 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000164 # Honor the MacOSX SDK setting when one was specified.
165 # An SDK is a directory with the same structure as a real
166 # system, but with only header files and libraries.
167 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000168
169 # Check the standard locations
170 for dir in std_dirs:
171 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000172
Victor Stinner4cbea512019-02-28 17:48:38 +0100173 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000174 f = os.path.join(sysroot, dir[1:], filename)
175
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000176 if os.path.exists(f): return []
177
178 # Check the additional directories
179 for dir in paths:
180 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000181
Victor Stinner4cbea512019-02-28 17:48:38 +0100182 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000183 f = os.path.join(sysroot, dir[1:], filename)
184
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000185 if os.path.exists(f):
186 return [dir]
187
188 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000189 return None
190
Victor Stinnerc991f242019-03-01 17:19:04 +0100191
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000192def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000193 result = compiler.find_library_file(std_dirs + paths, libname)
194 if result is None:
195 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000196
Victor Stinner4cbea512019-02-28 17:48:38 +0100197 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000198 sysroot = macosx_sdk_root()
199
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000200 # Check whether the found file is in one of the standard directories
201 dirname = os.path.dirname(result)
202 for p in std_dirs:
203 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000204 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000205
Victor Stinner4cbea512019-02-28 17:48:38 +0100206 if MACOS and is_macosx_sdk_path(p):
Ned Deily020250f2016-02-25 00:56:38 +1100207 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
208 # libraries with .tbd extensions rather than the normal .dylib
209 # shared libraries installed in /. The Apple compiler tool
210 # chain handles this transparently but it can cause problems
211 # for programs that are being built with an SDK and searching
212 # for specific libraries. Distutils find_library_file() now
213 # knows to also search for and return .tbd files. But callers
214 # of find_library_file need to keep in mind that the base filename
215 # of the returned SDK library file might have a different extension
216 # from that of the library file installed on the running system,
217 # for example:
218 # /Applications/Xcode.app/Contents/Developer/Platforms/
219 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
220 # usr/lib/libedit.tbd
221 # vs
222 # /usr/lib/libedit.dylib
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000223 if os.path.join(sysroot, p[1:]) == dirname:
224 return [ ]
225
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000226 if p == dirname:
227 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000228
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000229 # Otherwise, it must have been in one of the additional directories,
230 # so we have to figure out which one.
231 for p in paths:
232 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000233 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000234
Victor Stinner4cbea512019-02-28 17:48:38 +0100235 if MACOS and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000236 if os.path.join(sysroot, p[1:]) == dirname:
237 return [ p ]
238
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000239 if p == dirname:
240 return [p]
241 else:
242 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000243
Victor Stinnerc991f242019-03-01 17:19:04 +0100244
Jack Jansen144ebcc2001-08-05 22:31:19 +0000245def find_module_file(module, dirlist):
246 """Find a module in a set of possible folders. If it is not found
247 return the unadorned filename"""
248 list = find_file(module, [], dirlist)
249 if not list:
250 return module
251 if len(list) > 1:
Vinay Sajipdd917f82016-08-31 08:22:29 +0100252 log.info("WARNING: multiple copies of %s found", module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000253 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000254
Victor Stinnerc991f242019-03-01 17:19:04 +0100255
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000256class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000257
Guido van Rossumd8faa362007-04-27 19:54:29 +0000258 def __init__(self, dist):
259 build_ext.__init__(self, dist)
Victor Stinner625dbf22019-03-01 15:59:39 +0100260 self.srcdir = None
261 self.lib_dirs = None
262 self.inc_dirs = None
Victor Stinner5ec33a12019-03-01 16:43:28 +0100263 self.config_h_vars = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400265 self.failed_on_import = []
Victor Stinner8058bda2019-03-01 15:31:45 +0100266 self.missing = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200267 if '-j' in os.environ.get('MAKEFLAGS', ''):
268 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000269
Victor Stinner8058bda2019-03-01 15:31:45 +0100270 def add(self, ext):
271 self.extensions.append(ext)
272
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000273 def build_extensions(self):
Victor Stinner625dbf22019-03-01 15:59:39 +0100274 self.srcdir = sysconfig.get_config_var('srcdir')
275 if not self.srcdir:
276 # Maybe running on Windows but not using CYGWIN?
277 raise ValueError("No source directory; cannot proceed.")
278 self.srcdir = os.path.abspath(self.srcdir)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000279
280 # Detect which modules should be compiled
Victor Stinner8058bda2019-03-01 15:31:45 +0100281 self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000282
283 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000284 extensions = [ext for ext in self.extensions
Victor Stinner4cbea512019-02-28 17:48:38 +0100285 if ext.name not in DISABLED_MODULE_LIST]
Christian Heimes679db4a2008-01-18 09:56:22 +0000286 # move ctypes to the end, it depends on other modules
287 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
288 if "_ctypes" in ext_map:
289 ctypes = extensions.pop(ext_map["_ctypes"])
290 extensions.append(ctypes)
291 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000292
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000293 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000294 # with Modules/.
Victor Stinner625dbf22019-03-01 15:59:39 +0100295 moddirlist = [os.path.join(self.srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000296
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000297 # Fix up the paths for scripts, too
Victor Stinner625dbf22019-03-01 15:59:39 +0100298 self.distribution.scripts = [os.path.join(self.srcdir, filename)
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000299 for filename in self.distribution.scripts]
300
Christian Heimesaf98da12008-01-27 15:18:18 +0000301 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000302 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100303 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000304
xdegayec0364fc2017-05-27 18:25:03 +0200305 # The sysconfig variables built by makesetup that list the already
306 # built modules and the disabled modules as configured by the Setup
307 # files.
308 sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
309 sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200310
xdegayec0364fc2017-05-27 18:25:03 +0200311 mods_built = []
312 mods_disabled = []
Xavier de Gaye84968b72016-10-29 16:57:20 +0200313 for ext in self.extensions:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000314 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000315 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000316 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000317 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000318 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000319 else:
320 ext.depends = []
321 # re-compile extensions if a header file has been changed
322 ext.depends.extend(headers)
323
xdegayec0364fc2017-05-27 18:25:03 +0200324 # If a module has already been built or has been disabled in the
325 # Setup files, don't build it here.
326 if ext.name in sysconf_built:
327 mods_built.append(ext)
328 if ext.name in sysconf_dis:
329 mods_disabled.append(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000330
xdegayec0364fc2017-05-27 18:25:03 +0200331 mods_configured = mods_built + mods_disabled
332 if mods_configured:
Xavier de Gaye84968b72016-10-29 16:57:20 +0200333 self.extensions = [x for x in self.extensions if x not in
xdegayec0364fc2017-05-27 18:25:03 +0200334 mods_configured]
335 # Remove the shared libraries built by a previous build.
336 for ext in mods_configured:
337 fullpath = self.get_ext_fullpath(ext.name)
338 if os.path.exists(fullpath):
339 os.unlink(fullpath)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000340
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000341 # When you run "make CC=altcc" or something similar, you really want
342 # those environment variables passed into the setup.py phase. Here's
343 # a small set of useful ones.
344 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000345 args = {}
346 # unfortunately, distutils doesn't let us provide separate C and C++
347 # compilers
348 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000349 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
350 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000351 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000352
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000353 build_ext.build_extensions(self)
354
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200355 for ext in self.extensions:
356 self.check_extension_import(ext)
357
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300358 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400359 if self.failed or self.failed_on_import:
360 all_failed = self.failed + self.failed_on_import
361 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000362
363 def print_three_column(lst):
364 lst.sort(key=str.lower)
365 # guarantee zip() doesn't drop anything
366 while len(lst) % 3:
367 lst.append("")
368 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
369 print("%-*s %-*s %-*s" % (longest, e, longest, f,
370 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000371
Victor Stinner8058bda2019-03-01 15:31:45 +0100372 if self.missing:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000373 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400374 print("Python build finished successfully!")
375 print("The necessary bits to build these optional modules were not "
376 "found:")
Victor Stinner8058bda2019-03-01 15:31:45 +0100377 print_three_column(self.missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000378 print("To find the necessary bits, look in setup.py in"
379 " detect_modules() for the module's name.")
380 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000381
xdegayec0364fc2017-05-27 18:25:03 +0200382 if mods_built:
383 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200384 print("The following modules found by detect_modules() in"
385 " setup.py, have been")
386 print("built by the Makefile instead, as configured by the"
387 " Setup files:")
xdegayec0364fc2017-05-27 18:25:03 +0200388 print_three_column([ext.name for ext in mods_built])
389 print()
390
391 if mods_disabled:
392 print()
393 print("The following modules found by detect_modules() in"
394 " setup.py have not")
395 print("been built, they are *disabled* in the Setup files:")
396 print_three_column([ext.name for ext in mods_disabled])
397 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200398
Guido van Rossumd8faa362007-04-27 19:54:29 +0000399 if self.failed:
400 failed = self.failed[:]
401 print()
402 print("Failed to build these modules:")
403 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000404 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000405
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400406 if self.failed_on_import:
407 failed = self.failed_on_import[:]
408 print()
409 print("Following modules built successfully"
410 " but were removed because they could not be imported:")
411 print_three_column(failed)
412 print()
413
Christian Heimes61d478c2018-01-27 15:51:38 +0100414 if any('_ssl' in l
Victor Stinner8058bda2019-03-01 15:31:45 +0100415 for l in (self.missing, self.failed, self.failed_on_import)):
Christian Heimes61d478c2018-01-27 15:51:38 +0100416 print()
417 print("Could not build the ssl module!")
418 print("Python requires an OpenSSL 1.0.2 or 1.1 compatible "
419 "libssl with X509_VERIFY_PARAM_set1_host().")
420 print("LibreSSL 2.6.4 and earlier do not provide the necessary "
421 "APIs, https://github.com/libressl-portable/portable/issues/381")
422 print()
423
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000424 def build_extension(self, ext):
425
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000426 if ext.name == '_ctypes':
427 if not self.configure_ctypes(ext):
Zachary Waref40d4dd2016-09-17 01:25:24 -0500428 self.failed.append(ext.name)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000429 return
430
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000431 try:
432 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000433 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000434 self.announce('WARNING: building of extension "%s" failed: %s' %
Victor Stinner625dbf22019-03-01 15:59:39 +0100435 (ext.name, why))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000436 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000437 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200438
439 def check_extension_import(self, ext):
440 # Don't try to import an extension that has failed to compile
441 if ext.name in self.failed:
442 self.announce(
443 'WARNING: skipping import check for failed build "%s"' %
444 ext.name, level=1)
445 return
446
Jack Jansenf49c6f92001-11-01 14:44:15 +0000447 # Workaround for Mac OS X: The Carbon-based modules cannot be
448 # reliably imported into a command-line Python
449 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000450 self.announce(
451 'WARNING: skipping import check for Carbon-based "%s"' %
452 ext.name)
453 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000454
Victor Stinner4cbea512019-02-28 17:48:38 +0100455 if MACOS and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000456 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000457 # Don't bother doing an import check when an extension was
458 # build with an explicit '-arch' flag on OSX. That's currently
459 # only used to build 32-bit only extensions in a 4-way
460 # universal build and loading 32-bit code into a 64-bit
461 # process will fail.
462 self.announce(
463 'WARNING: skipping import check for "%s"' %
464 ext.name)
465 return
466
Jason Tishler24cf7762002-05-22 16:46:15 +0000467 # Workaround for Cygwin: Cygwin currently has fork issues when many
468 # modules have been imported
Victor Stinner4cbea512019-02-28 17:48:38 +0100469 if CYGWIN:
Jason Tishler24cf7762002-05-22 16:46:15 +0000470 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
471 % ext.name)
472 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000473 ext_filename = os.path.join(
474 self.build_lib,
475 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000476
477 # If the build directory didn't exist when setup.py was
478 # started, sys.path_importer_cache has a negative result
479 # cached. Clear that cache before trying to import.
480 sys.path_importer_cache.clear()
481
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200482 # Don't try to load extensions for cross builds
Victor Stinner4cbea512019-02-28 17:48:38 +0100483 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200484 return
485
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400486 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700487 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
488 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000489 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400490 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000491 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400492 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000493 self.announce('*** WARNING: renaming "%s" since importing it'
494 ' failed: %s' % (ext.name, why), level=3)
495 assert not self.inplace
496 basename, tail = os.path.splitext(ext_filename)
497 newname = basename + "_failed" + tail
498 if os.path.exists(newname):
499 os.remove(newname)
500 os.rename(ext_filename, newname)
501
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000502 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000503 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000504 self.announce('*** WARNING: importing extension "%s" '
505 'failed with %s: %s' % (ext.name, exc_type, why),
506 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000507 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000508
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400509 def add_multiarch_paths(self):
510 # Debian/Ubuntu multiarch support.
511 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200512 cc = sysconfig.get_config_var('CC')
513 tmpfile = os.path.join(self.build_temp, 'multiarch')
514 if not os.path.exists(self.build_temp):
515 os.makedirs(self.build_temp)
516 ret = os.system(
517 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
518 multiarch_path_component = ''
519 try:
520 if ret >> 8 == 0:
521 with open(tmpfile) as fp:
522 multiarch_path_component = fp.readline().strip()
523 finally:
524 os.unlink(tmpfile)
525
526 if multiarch_path_component != '':
527 add_dir_to_list(self.compiler.library_dirs,
528 '/usr/lib/' + multiarch_path_component)
529 add_dir_to_list(self.compiler.include_dirs,
530 '/usr/include/' + multiarch_path_component)
531 return
532
Barry Warsaw88e19452011-04-07 10:40:36 -0400533 if not find_executable('dpkg-architecture'):
534 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200535 opt = ''
Victor Stinner4cbea512019-02-28 17:48:38 +0100536 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200537 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400538 tmpfile = os.path.join(self.build_temp, 'multiarch')
539 if not os.path.exists(self.build_temp):
540 os.makedirs(self.build_temp)
541 ret = os.system(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200542 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
543 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400544 try:
545 if ret >> 8 == 0:
546 with open(tmpfile) as fp:
547 multiarch_path_component = fp.readline().strip()
548 add_dir_to_list(self.compiler.library_dirs,
549 '/usr/lib/' + multiarch_path_component)
550 add_dir_to_list(self.compiler.include_dirs,
551 '/usr/include/' + multiarch_path_component)
552 finally:
553 os.unlink(tmpfile)
554
pxinwr32f5fdd2019-02-27 19:09:28 +0800555 def add_cross_compiling_paths(self):
556 cc = sysconfig.get_config_var('CC')
557 tmpfile = os.path.join(self.build_temp, 'ccpaths')
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200558 if not os.path.exists(self.build_temp):
559 os.makedirs(self.build_temp)
pxinwr32f5fdd2019-02-27 19:09:28 +0800560 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200561 is_gcc = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800562 is_clang = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200563 in_incdirs = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200564 try:
565 if ret >> 8 == 0:
566 with open(tmpfile) as fp:
567 for line in fp.readlines():
568 if line.startswith("gcc version"):
569 is_gcc = True
pxinwr32f5fdd2019-02-27 19:09:28 +0800570 elif line.startswith("clang version"):
571 is_clang = True
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200572 elif line.startswith("#include <...>"):
573 in_incdirs = True
574 elif line.startswith("End of search list"):
575 in_incdirs = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800576 elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200577 for d in line.strip().split("=")[1].split(":"):
578 d = os.path.normpath(d)
579 if '/gcc/' not in d:
580 add_dir_to_list(self.compiler.library_dirs,
581 d)
pxinwr32f5fdd2019-02-27 19:09:28 +0800582 elif (is_gcc or is_clang) and in_incdirs and '/gcc/' not in line and '/clang/' not in line:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200583 add_dir_to_list(self.compiler.include_dirs,
584 line.strip())
585 finally:
586 os.unlink(tmpfile)
587
Victor Stinnercfe172d2019-03-01 18:21:49 +0100588 def add_ldflags_cppflags(self):
Brett Cannon516592f2004-12-07 00:42:59 +0000589 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000590 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000591 # We must get the values from the Makefile and not the environment
592 # directly since an inconsistently reproducible issue comes up where
593 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000594 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000595 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000596 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
597 ('LDFLAGS', '-L', self.compiler.library_dirs),
598 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000599 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000600 if env_val:
Chih-Hsuan Yen09b2bec2018-07-11 16:48:43 +0800601 parser = argparse.ArgumentParser()
602 parser.add_argument(arg_name, dest="dirs", action="append")
603 options, _ = parser.parse_known_args(env_val.split())
Brett Cannon44837712005-01-02 21:54:07 +0000604 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000605 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000606 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000607
Victor Stinnercfe172d2019-03-01 18:21:49 +0100608 def configure_compiler(self):
609 # Ensure that /usr/local is always used, but the local build
610 # directories (i.e. '.' and 'Include') must be first. See issue
611 # 10520.
612 if not CROSS_COMPILING:
613 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
614 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
615 # only change this for cross builds for 3.3, issues on Mageia
616 if CROSS_COMPILING:
617 self.add_cross_compiling_paths()
618 self.add_multiarch_paths()
619 self.add_ldflags_cppflags()
620
Victor Stinner5ec33a12019-03-01 16:43:28 +0100621 def init_inc_lib_dirs(self):
Victor Stinner4cbea512019-02-28 17:48:38 +0100622 if (not CROSS_COMPILING and
Xavier de Gaye1351c312016-12-14 11:14:33 +0100623 os.path.normpath(sys.base_prefix) != '/usr' and
624 not sysconfig.get_config_var('PYTHONFRAMEWORK')):
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000625 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
626 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
627 # building a framework with different architectures than
628 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000629 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000630 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000631 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000632 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000633
xdegaye77f51392017-11-25 17:25:30 +0100634 system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
635 system_include_dirs = ['/usr/include']
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000636 # lib_dirs and inc_dirs are used to search for files;
637 # if a file is found in one of those directories, it can
638 # be assumed that no additional -I,-L directives are needed.
Victor Stinner4cbea512019-02-28 17:48:38 +0100639 if not CROSS_COMPILING:
Victor Stinner625dbf22019-03-01 15:59:39 +0100640 self.lib_dirs = self.compiler.library_dirs + system_lib_dirs
641 self.inc_dirs = self.compiler.include_dirs + system_include_dirs
Christian Heimesf19529c2012-12-12 12:41:00 +0100642 else:
xdegaye77f51392017-11-25 17:25:30 +0100643 # Add the sysroot paths. 'sysroot' is a compiler option used to
644 # set the logical path of the standard system headers and
645 # libraries.
Victor Stinner625dbf22019-03-01 15:59:39 +0100646 self.lib_dirs = (self.compiler.library_dirs +
647 sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs))
648 self.inc_dirs = (self.compiler.include_dirs +
649 sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'),
650 system_include_dirs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000651
Brett Cannon4454a1f2005-04-15 20:32:39 +0000652 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000653 with open(config_h) as file:
Victor Stinner5ec33a12019-03-01 16:43:28 +0100654 self.config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000655
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000656 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
Victor Stinner4cbea512019-02-28 17:48:38 +0100657 if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']:
Victor Stinner625dbf22019-03-01 15:59:39 +0100658 self.lib_dirs += ['/usr/ccs/lib']
Skip Montanaro22e00c42003-05-06 20:43:34 +0000659
Charles-François Natali5739e102012-04-12 19:07:25 +0200660 # HP-UX11iv3 keeps files in lib/hpux folders.
Victor Stinner4cbea512019-02-28 17:48:38 +0100661 if HOST_PLATFORM == 'hp-ux11':
Victor Stinner625dbf22019-03-01 15:59:39 +0100662 self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
Charles-François Natali5739e102012-04-12 19:07:25 +0200663
Victor Stinner4cbea512019-02-28 17:48:38 +0100664 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000665 # This should work on any unixy platform ;-)
666 # If the user has bothered specifying additional -I and -L flags
667 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000668 #
669 # NOTE: using shlex.split would technically be more correct, but
670 # also gives a bootstrap problem. Let's hope nobody uses
671 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000672 cflags, ldflags = sysconfig.get_config_vars(
673 'CFLAGS', 'LDFLAGS')
674 for item in cflags.split():
675 if item.startswith('-I'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100676 self.inc_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000677
678 for item in ldflags.split():
679 if item.startswith('-L'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100680 self.lib_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000681
Victor Stinner5ec33a12019-03-01 16:43:28 +0100682 def detect_simple_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000683 #
684 # The following modules are all pretty straightforward, and compile
685 # on pretty much any POSIXish platform.
686 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000687
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000688 # array objects
Victor Stinner8058bda2019-03-01 15:31:45 +0100689 self.add(Extension('array', ['arraymodule.c']))
Martin Panterc9deece2016-02-03 05:19:44 +0000690
Yury Selivanovf23746a2018-01-22 19:11:18 -0500691 # Context Variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100692 self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
Yury Selivanovf23746a2018-01-22 19:11:18 -0500693
Martin Panterc9deece2016-02-03 05:19:44 +0000694 shared_math = 'Modules/_math.o'
Victor Stinnercfe172d2019-03-01 18:21:49 +0100695
696 # math library functions, e.g. sin()
697 self.add(Extension('math', ['mathmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100698 extra_objects=[shared_math],
699 depends=['_math.h', shared_math],
700 libraries=['m']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100701
702 # complex math library functions
703 self.add(Extension('cmath', ['cmathmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100704 extra_objects=[shared_math],
705 depends=['_math.h', shared_math],
706 libraries=['m']))
Victor Stinnere0be4232011-10-25 13:06:09 +0200707
708 # time libraries: librt may be needed for clock_gettime()
709 time_libs = []
710 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
711 if lib:
712 time_libs.append(lib)
713
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000714 # time operations and variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100715 self.add(Extension('time', ['timemodule.c'],
716 libraries=time_libs))
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800717 # libm is needed by delta_new() that uses round() and by accum() that
718 # uses modf().
Victor Stinner8058bda2019-03-01 15:31:45 +0100719 self.add(Extension('_datetime', ['_datetimemodule.c'],
720 libraries=['m']))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000721 # random number generator implemented in C
Victor Stinner8058bda2019-03-01 15:31:45 +0100722 self.add(Extension("_random", ["_randommodule.c"]))
Raymond Hettinger0c410272004-01-05 10:13:35 +0000723 # bisect
Victor Stinner8058bda2019-03-01 15:31:45 +0100724 self.add(Extension("_bisect", ["_bisectmodule.c"]))
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000725 # heapq
Victor Stinner8058bda2019-03-01 15:31:45 +0100726 self.add(Extension("_heapq", ["_heapqmodule.c"]))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000727 # C-optimized pickle replacement
Victor Stinner8058bda2019-03-01 15:31:45 +0100728 self.add(Extension("_pickle", ["_pickle.c"]))
Collin Winter670e6922007-03-21 02:57:17 +0000729 # atexit
Victor Stinner8058bda2019-03-01 15:31:45 +0100730 self.add(Extension("atexit", ["atexitmodule.c"]))
Christian Heimes90540002008-05-08 14:29:10 +0000731 # _json speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100732 self.add(Extension("_json", ["_json.c"],
733 # pycore_accu.h requires Py_BUILD_CORE_BUILTIN
734 extra_compile_args=['-DPy_BUILD_CORE_BUILTIN']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100735
Fred Drake0e474a82007-10-11 18:01:43 +0000736 # profiler (_lsprof is for cProfile.py)
Victor Stinner8058bda2019-03-01 15:31:45 +0100737 self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000738 # static Unicode character database
Victor Stinner8058bda2019-03-01 15:31:45 +0100739 self.add(Extension('unicodedata', ['unicodedata.c'],
740 depends=['unicodedata_db.h', 'unicodename_db.h']))
Larry Hastings3a907972013-11-23 14:49:22 -0800741 # _opcode module
Victor Stinner8058bda2019-03-01 15:31:45 +0100742 self.add(Extension('_opcode', ['_opcode.c']))
INADA Naoki9f2ce252016-10-15 15:39:19 +0900743 # asyncio speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100744 self.add(Extension("_asyncio", ["_asynciomodule.c"]))
Ivan Levkivskyi03e3c342018-02-18 12:41:58 +0000745 # _abc speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100746 self.add(Extension("_abc", ["_abc.c"]))
Antoine Pitrou94e16962018-01-16 00:27:16 +0100747 # _queue module
Victor Stinner8058bda2019-03-01 15:31:45 +0100748 self.add(Extension("_queue", ["_queuemodule.c"]))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000749
750 # Modules with some UNIX dependencies -- on by default:
751 # (If you have a really backward UNIX, select and socket may not be
752 # supported...)
753
754 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000755 libs = []
Victor Stinner5ec33a12019-03-01 16:43:28 +0100756 if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
Antoine Pitroua3000072010-09-07 14:52:42 +0000757 # May be necessary on AIX for flock function
758 libs = ['bsd']
Victor Stinner8058bda2019-03-01 15:31:45 +0100759 self.add(Extension('fcntl', ['fcntlmodule.c'],
760 libraries=libs))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000761 # pwd(3)
Victor Stinner8058bda2019-03-01 15:31:45 +0100762 self.add(Extension('pwd', ['pwdmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000763 # grp(3)
pxinwr32f5fdd2019-02-27 19:09:28 +0800764 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100765 self.add(Extension('grp', ['grpmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000766 # spwd, shadow passwords
Victor Stinner5ec33a12019-03-01 16:43:28 +0100767 if (self.config_h_vars.get('HAVE_GETSPNAM', False) or
768 self.config_h_vars.get('HAVE_GETSPENT', False)):
Victor Stinner8058bda2019-03-01 15:31:45 +0100769 self.add(Extension('spwd', ['spwdmodule.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000770 else:
Victor Stinner8058bda2019-03-01 15:31:45 +0100771 self.missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000772
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000773 # select(2); not on ancient System V
Victor Stinner8058bda2019-03-01 15:31:45 +0100774 self.add(Extension('select', ['selectmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000775
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000776 # Fred Drake's interface to the Python parser
Victor Stinner8058bda2019-03-01 15:31:45 +0100777 self.add(Extension('parser', ['parsermodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000778
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000779 # Memory-mapped files (also works on Win32).
Victor Stinner8058bda2019-03-01 15:31:45 +0100780 self.add(Extension('mmap', ['mmapmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000781
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000782 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000783 # syslog daemon interface
Victor Stinner8058bda2019-03-01 15:31:45 +0100784 self.add(Extension('syslog', ['syslogmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000785
Eric Snow7f8bfc92018-01-29 18:23:44 -0700786 # Python interface to subinterpreter C-API.
Eric Snowc11183c2019-03-15 16:35:46 -0600787 self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c']))
Eric Snow7f8bfc92018-01-29 18:23:44 -0700788
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000789 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000790 # Here ends the simple stuff. From here on, modules need certain
791 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000792 #
793
794 # Multimedia modules
795 # These don't work for 64-bit platforms!!!
796 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200797 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000798 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000799 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000800 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200801 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800802 # audioop needs libm for floor() in multiple functions.
Victor Stinner8058bda2019-03-01 15:31:45 +0100803 self.add(Extension('audioop', ['audioop.c'],
804 libraries=['m']))
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000805
Victor Stinner5ec33a12019-03-01 16:43:28 +0100806 # CSV files
807 self.add(Extension('_csv', ['_csv.c']))
808
809 # POSIX subprocess module helper.
810 self.add(Extension('_posixsubprocess', ['_posixsubprocess.c']))
811
Victor Stinnercfe172d2019-03-01 18:21:49 +0100812 def detect_test_extensions(self):
813 # Python C API test module
814 self.add(Extension('_testcapi', ['_testcapimodule.c'],
815 depends=['testcapi_long.h']))
816
817 # Python PEP-3118 (buffer protocol) test module
818 self.add(Extension('_testbuffer', ['_testbuffer.c']))
819
820 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
821 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
822
823 # Test multi-phase extension module init (PEP 489)
824 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
825
826 # Fuzz tests.
827 self.add(Extension('_xxtestfuzz',
828 ['_xxtestfuzz/_xxtestfuzz.c',
829 '_xxtestfuzz/fuzzer.c']))
830
Victor Stinner5ec33a12019-03-01 16:43:28 +0100831 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000832 # readline
Victor Stinner625dbf22019-03-01 15:59:39 +0100833 do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000834 readline_termcap_library = ""
835 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200836 # Cannot use os.popen here in py3k.
837 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
838 if not os.path.exists(self.build_temp):
839 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000840 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200841 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100842 if CROSS_COMPILING:
doko@ubuntu.com58844492012-06-30 18:25:32 +0200843 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
844 % (sysconfig.get_config_var('READELF'),
845 do_readline, tmpfile))
846 elif find_executable('ldd'):
847 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
848 else:
849 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200850 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000851 with open(tmpfile) as fp:
852 for ln in fp:
853 if 'curses' in ln:
854 readline_termcap_library = re.sub(
855 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
856 ).rstrip()
857 break
858 # termcap interface split out from ncurses
859 if 'tinfo' in ln:
860 readline_termcap_library = 'tinfo'
861 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200862 if os.path.exists(tmpfile):
863 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000864 # Issue 7384: If readline is already linked against curses,
865 # use the same library for the readline and curses modules.
866 if 'curses' in readline_termcap_library:
867 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +0100868 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000869 curses_library = 'ncursesw'
Victor Stinner625dbf22019-03-01 15:59:39 +0100870 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000871 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +0100872 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000873 curses_library = 'curses'
874
Victor Stinner4cbea512019-02-28 17:48:38 +0100875 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000876 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000877 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -0700878 if (dep_target and
879 (tuple(int(n) for n in dep_target.split('.')[0:2])
880 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +0000881 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000882 if os_release < 9:
883 # MacOSX 10.4 has a broken readline. Don't try to build
884 # the readline module unless the user has installed a fixed
885 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +0100886 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000887 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000888 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100889 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000890 # In every directory on the search path search for a dynamic
891 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000892 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +0000893 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000894 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000895 readline_extra_link_args = ('-Wl,-search_paths_first',)
896 else:
897 readline_extra_link_args = ()
898
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000899 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000900 if readline_termcap_library:
901 pass # Issue 7384: Already linked against curses or tinfo.
902 elif curses_library:
903 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +0100904 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000905 ['/usr/lib/termcap'],
906 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000907 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +0100908 self.add(Extension('readline', ['readline.c'],
909 library_dirs=['/usr/lib/termcap'],
910 extra_link_args=readline_extra_link_args,
911 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000912 else:
Victor Stinner8058bda2019-03-01 15:31:45 +0100913 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000914
Victor Stinner5ec33a12019-03-01 16:43:28 +0100915 # Curses support, requiring the System V version of curses, often
916 # provided by the ncurses library.
917 curses_defines = []
918 curses_includes = []
919 panel_library = 'panel'
920 if curses_library == 'ncursesw':
921 curses_defines.append(('HAVE_NCURSESW', '1'))
922 if not CROSS_COMPILING:
923 curses_includes.append('/usr/include/ncursesw')
924 # Bug 1464056: If _curses.so links with ncursesw,
925 # _curses_panel.so must link with panelw.
926 panel_library = 'panelw'
927 if MACOS:
928 # On OS X, there is no separate /usr/lib/libncursesw nor
929 # libpanelw. If we are here, we found a locally-supplied
930 # version of libncursesw. There should also be a
931 # libpanelw. _XOPEN_SOURCE defines are usually excluded
932 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
933 # ncurses wide char support
934 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
935 elif MACOS and curses_library == 'ncurses':
936 # Building with the system-suppied combined libncurses/libpanel
937 curses_defines.append(('HAVE_NCURSESW', '1'))
938 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +0000939
Victor Stinnercfe172d2019-03-01 18:21:49 +0100940 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +0100941 if curses_library.startswith('ncurses'):
942 curses_libs = [curses_library]
943 self.add(Extension('_curses', ['_cursesmodule.c'],
944 include_dirs=curses_includes,
945 define_macros=curses_defines,
946 libraries=curses_libs))
947 elif curses_library == 'curses' and not MACOS:
948 # OSX has an old Berkeley curses, not good enough for
949 # the _curses module.
950 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
951 curses_libs = ['curses', 'terminfo']
952 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
953 curses_libs = ['curses', 'termcap']
954 else:
955 curses_libs = ['curses']
956
957 self.add(Extension('_curses', ['_cursesmodule.c'],
958 define_macros=curses_defines,
959 libraries=curses_libs))
960 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +0100961 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +0100962 self.missing.append('_curses')
963
964 # If the curses module is enabled, check for the panel module
Victor Stinnercfe172d2019-03-01 18:21:49 +0100965 if (curses_enabled and
Victor Stinner5ec33a12019-03-01 16:43:28 +0100966 self.compiler.find_library_file(self.lib_dirs, panel_library)):
967 self.add(Extension('_curses_panel', ['_curses_panel.c'],
968 include_dirs=curses_includes,
969 define_macros=curses_defines,
970 libraries=[panel_library, *curses_libs]))
971 else:
972 self.missing.append('_curses_panel')
973
974 def detect_crypt(self):
975 # crypt module.
Victor Stinner625dbf22019-03-01 15:59:39 +0100976 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000977 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000978 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000979 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +0800980
981 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100982 self.add(Extension('_crypt', ['_cryptmodule.c'],
983 libraries=libs))
Victor Stinner625dbf22019-03-01 15:59:39 +0100984 elif self.compiler.find_library_file(self.lib_dirs, 'OPENSSL'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800985 libs = ['OPENSSL']
Victor Stinner8058bda2019-03-01 15:31:45 +0100986 self.add(Extension('_crypt', ['_cryptmodule.c'],
987 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000988
Victor Stinner5ec33a12019-03-01 16:43:28 +0100989 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000990 # socket(2)
pxinwr32f5fdd2019-02-27 19:09:28 +0800991 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100992 self.add(Extension('_socket', ['socketmodule.c'],
993 depends=['socketmodule.h']))
Victor Stinner625dbf22019-03-01 15:59:39 +0100994 elif self.compiler.find_library_file(self.lib_dirs, 'net'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800995 libs = ['net']
Victor Stinner8058bda2019-03-01 15:31:45 +0100996 self.add(Extension('_socket', ['socketmodule.c'],
997 depends=['socketmodule.h'],
998 libraries=libs))
pxinwr32f5fdd2019-02-27 19:09:28 +0800999
Victor Stinner5ec33a12019-03-01 16:43:28 +01001000 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001001 # Modules that provide persistent dictionary-like semantics. You will
1002 # probably want to arrange for at least one of them to be available on
1003 # your machine, though none are defined by default because of library
1004 # dependencies. The Python module dbm/__init__.py provides an
1005 # implementation independent wrapper for these; dbm/dumb.py provides
1006 # similar functionality (but slower of course) implemented in Python.
1007
1008 # Sleepycat^WOracle Berkeley DB interface.
1009 # http://www.oracle.com/database/berkeley-db/db/index.html
1010 #
1011 # This requires the Sleepycat^WOracle DB code. The supported versions
1012 # are set below. Visit the URL above to download
1013 # a release. Most open source OSes come with one or more
1014 # versions of BerkeleyDB already installed.
1015
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001016 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001017 min_db_ver = (3, 3)
1018 db_setup_debug = False # verbose debug prints from this script?
1019
1020 def allow_db_ver(db_ver):
1021 """Returns a boolean if the given BerkeleyDB version is acceptable.
1022
1023 Args:
1024 db_ver: A tuple of the version to verify.
1025 """
1026 if not (min_db_ver <= db_ver <= max_db_ver):
1027 return False
1028 return True
1029
1030 def gen_db_minor_ver_nums(major):
1031 if major == 4:
1032 for x in range(max_db_ver[1]+1):
1033 if allow_db_ver((4, x)):
1034 yield x
1035 elif major == 3:
1036 for x in (3,):
1037 if allow_db_ver((3, x)):
1038 yield x
1039 else:
1040 raise ValueError("unknown major BerkeleyDB version", major)
1041
1042 # construct a list of paths to look for the header file in on
1043 # top of the normal inc_dirs.
1044 db_inc_paths = [
1045 '/usr/include/db4',
1046 '/usr/local/include/db4',
1047 '/opt/sfw/include/db4',
1048 '/usr/include/db3',
1049 '/usr/local/include/db3',
1050 '/opt/sfw/include/db3',
1051 # Fink defaults (http://fink.sourceforge.net/)
1052 '/sw/include/db4',
1053 '/sw/include/db3',
1054 ]
1055 # 4.x minor number specific paths
1056 for x in gen_db_minor_ver_nums(4):
1057 db_inc_paths.append('/usr/include/db4%d' % x)
1058 db_inc_paths.append('/usr/include/db4.%d' % x)
1059 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1060 db_inc_paths.append('/usr/local/include/db4%d' % x)
1061 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1062 db_inc_paths.append('/opt/db-4.%d/include' % x)
1063 # MacPorts default (http://www.macports.org/)
1064 db_inc_paths.append('/opt/local/include/db4%d' % x)
1065 # 3.x minor number specific paths
1066 for x in gen_db_minor_ver_nums(3):
1067 db_inc_paths.append('/usr/include/db3%d' % x)
1068 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1069 db_inc_paths.append('/usr/local/include/db3%d' % x)
1070 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1071 db_inc_paths.append('/opt/db-3.%d/include' % x)
1072
Victor Stinner4cbea512019-02-28 17:48:38 +01001073 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001074 db_inc_paths = []
1075
Georg Brandl489cb4f2009-07-11 10:08:49 +00001076 # Add some common subdirectories for Sleepycat DB to the list,
1077 # based on the standard include directories. This way DB3/4 gets
1078 # picked up when it is installed in a non-standard prefix and
1079 # the user has added that prefix into inc_dirs.
1080 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001081 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001082 std_variants.append(os.path.join(dn, 'db3'))
1083 std_variants.append(os.path.join(dn, 'db4'))
1084 for x in gen_db_minor_ver_nums(4):
1085 std_variants.append(os.path.join(dn, "db4%d"%x))
1086 std_variants.append(os.path.join(dn, "db4.%d"%x))
1087 for x in gen_db_minor_ver_nums(3):
1088 std_variants.append(os.path.join(dn, "db3%d"%x))
1089 std_variants.append(os.path.join(dn, "db3.%d"%x))
1090
1091 db_inc_paths = std_variants + db_inc_paths
1092 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1093
1094 db_ver_inc_map = {}
1095
Victor Stinner4cbea512019-02-28 17:48:38 +01001096 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001097 sysroot = macosx_sdk_root()
1098
Georg Brandl489cb4f2009-07-11 10:08:49 +00001099 class db_found(Exception): pass
1100 try:
1101 # See whether there is a Sleepycat header in the standard
1102 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001103 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001104 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001105 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001106 f = os.path.join(sysroot, d[1:], "db.h")
1107
Georg Brandl489cb4f2009-07-11 10:08:49 +00001108 if db_setup_debug: print("db: looking for db.h in", f)
1109 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001110 with open(f, 'rb') as file:
1111 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001112 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001113 if m:
1114 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001115 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001116 db_minor = int(m.group(1))
1117 db_ver = (db_major, db_minor)
1118
1119 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1120 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001121 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001122 db_patch = int(m.group(1))
1123 if db_patch < 21:
1124 print("db.h:", db_ver, "patch", db_patch,
1125 "being ignored (4.6.x must be >= 4.6.21)")
1126 continue
1127
1128 if ( (db_ver not in db_ver_inc_map) and
1129 allow_db_ver(db_ver) ):
1130 # save the include directory with the db.h version
1131 # (first occurrence only)
1132 db_ver_inc_map[db_ver] = d
1133 if db_setup_debug:
1134 print("db.h: found", db_ver, "in", d)
1135 else:
1136 # we already found a header for this library version
1137 if db_setup_debug: print("db.h: ignoring", d)
1138 else:
1139 # ignore this header, it didn't contain a version number
1140 if db_setup_debug:
1141 print("db.h: no version number version in", d)
1142
1143 db_found_vers = list(db_ver_inc_map.keys())
1144 db_found_vers.sort()
1145
1146 while db_found_vers:
1147 db_ver = db_found_vers.pop()
1148 db_incdir = db_ver_inc_map[db_ver]
1149
1150 # check lib directories parallel to the location of the header
1151 db_dirs_to_check = [
1152 db_incdir.replace("include", 'lib64'),
1153 db_incdir.replace("include", 'lib'),
1154 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001155
Victor Stinner4cbea512019-02-28 17:48:38 +01001156 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001157 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1158
1159 else:
1160 # Same as other branch, but takes OSX SDK into account
1161 tmp = []
1162 for dn in db_dirs_to_check:
1163 if is_macosx_sdk_path(dn):
1164 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1165 tmp.append(dn)
1166 else:
1167 if os.path.isdir(dn):
1168 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001169 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001170
1171 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001172
Ezio Melotti42da6632011-03-15 05:18:48 +02001173 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001174 # XXX should we -ever- look for a dbX name? Do any
1175 # systems really not name their library by version and
1176 # symlink to more general names?
1177 for dblib in (('db-%d.%d' % db_ver),
1178 ('db%d%d' % db_ver),
1179 ('db%d' % db_ver[0])):
1180 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001181 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001182 if dblib_file:
1183 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1184 raise db_found
1185 else:
1186 if db_setup_debug: print("db lib: ", dblib, "not found")
1187
1188 except db_found:
1189 if db_setup_debug:
1190 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1191 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001192 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001193 # Only add the found library and include directories if they aren't
1194 # already being searched. This avoids an explicit runtime library
1195 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001196 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001197 db_incs = None
1198 else:
1199 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001200 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001201 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001202 else:
1203 if db_setup_debug: print("db: no appropriate library found")
1204 db_incs = None
1205 dblibs = []
1206 dblib_dir = None
1207
Victor Stinner5ec33a12019-03-01 16:43:28 +01001208 dbm_setup_debug = False # verbose debug prints from this script?
1209 dbm_order = ['gdbm']
1210 # The standard Unix dbm module:
1211 if not CYGWIN:
1212 config_args = [arg.strip("'")
1213 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1214 dbm_args = [arg for arg in config_args
1215 if arg.startswith('--with-dbmliborder=')]
1216 if dbm_args:
1217 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1218 else:
1219 dbm_order = "ndbm:gdbm:bdb".split(":")
1220 dbmext = None
1221 for cand in dbm_order:
1222 if cand == "ndbm":
1223 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1224 # Some systems have -lndbm, others have -lgdbm_compat,
1225 # others don't have either
1226 if self.compiler.find_library_file(self.lib_dirs,
1227 'ndbm'):
1228 ndbm_libs = ['ndbm']
1229 elif self.compiler.find_library_file(self.lib_dirs,
1230 'gdbm_compat'):
1231 ndbm_libs = ['gdbm_compat']
1232 else:
1233 ndbm_libs = []
1234 if dbm_setup_debug: print("building dbm using ndbm")
1235 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1236 define_macros=[
1237 ('HAVE_NDBM_H',None),
1238 ],
1239 libraries=ndbm_libs)
1240 break
1241
1242 elif cand == "gdbm":
1243 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1244 gdbm_libs = ['gdbm']
1245 if self.compiler.find_library_file(self.lib_dirs,
1246 'gdbm_compat'):
1247 gdbm_libs.append('gdbm_compat')
1248 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1249 if dbm_setup_debug: print("building dbm using gdbm")
1250 dbmext = Extension(
1251 '_dbm', ['_dbmmodule.c'],
1252 define_macros=[
1253 ('HAVE_GDBM_NDBM_H', None),
1254 ],
1255 libraries = gdbm_libs)
1256 break
1257 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1258 if dbm_setup_debug: print("building dbm using gdbm")
1259 dbmext = Extension(
1260 '_dbm', ['_dbmmodule.c'],
1261 define_macros=[
1262 ('HAVE_GDBM_DASH_NDBM_H', None),
1263 ],
1264 libraries = gdbm_libs)
1265 break
1266 elif cand == "bdb":
1267 if dblibs:
1268 if dbm_setup_debug: print("building dbm using bdb")
1269 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1270 library_dirs=dblib_dir,
1271 runtime_library_dirs=dblib_dir,
1272 include_dirs=db_incs,
1273 define_macros=[
1274 ('HAVE_BERKDB_H', None),
1275 ('DB_DBM_HSEARCH', None),
1276 ],
1277 libraries=dblibs)
1278 break
1279 if dbmext is not None:
1280 self.add(dbmext)
1281 else:
1282 self.missing.append('_dbm')
1283
1284 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1285 if ('gdbm' in dbm_order and
1286 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1287 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1288 libraries=['gdbm']))
1289 else:
1290 self.missing.append('_gdbm')
1291
1292 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001293 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001294 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001295
1296 # We hunt for #define SQLITE_VERSION "n.n.n"
1297 # We need to find >= sqlite version 3.0.8
1298 sqlite_incdir = sqlite_libdir = None
1299 sqlite_inc_paths = [ '/usr/include',
1300 '/usr/include/sqlite',
1301 '/usr/include/sqlite3',
1302 '/usr/local/include',
1303 '/usr/local/include/sqlite',
1304 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001305 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001306 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001307 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001308 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1309 MIN_SQLITE_VERSION = ".".join([str(x)
1310 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001311
1312 # Scan the default include directories before the SQLite specific
1313 # ones. This allows one to override the copy of sqlite on OSX,
1314 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001315 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001316 sysroot = macosx_sdk_root()
1317
Victor Stinner625dbf22019-03-01 15:59:39 +01001318 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001319 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001320 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001321 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001322
Ned Deily9b635832012-08-05 15:13:33 -07001323 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001324 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001325 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001326 with open(f) as file:
1327 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001328 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001329 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001330 if m:
1331 sqlite_version = m.group(1)
1332 sqlite_version_tuple = tuple([int(x)
1333 for x in sqlite_version.split(".")])
1334 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1335 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001336 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001337 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001338 sqlite_incdir = d
1339 break
1340 else:
1341 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001342 print("%s: version %d is too old, need >= %s"%(d,
1343 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001344 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001345 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001346
1347 if sqlite_incdir:
1348 sqlite_dirs_to_check = [
1349 os.path.join(sqlite_incdir, '..', 'lib64'),
1350 os.path.join(sqlite_incdir, '..', 'lib'),
1351 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1352 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1353 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001354 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001355 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001356 if sqlite_libfile:
1357 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001358
1359 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001360 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001361 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001362 '_sqlite/cursor.c',
1363 '_sqlite/microprotocols.c',
1364 '_sqlite/module.c',
1365 '_sqlite/prepare_protocol.c',
1366 '_sqlite/row.c',
1367 '_sqlite/statement.c',
1368 '_sqlite/util.c', ]
1369
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001370 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001371 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001372 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1373 else:
1374 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1375
Benjamin Peterson076ed002010-10-31 17:11:02 +00001376 # Enable support for loadable extensions in the sqlite3 module
1377 # if --enable-loadable-sqlite-extensions configure option is used.
1378 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1379 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001380
Victor Stinner4cbea512019-02-28 17:48:38 +01001381 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382 # In every directory on the search path search for a dynamic
1383 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001384 # for dynamic libraries on the entire path.
1385 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001386 # before the dynamic library in /usr/lib.
1387 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1388 else:
1389 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001390
Brett Cannonc5011fe2011-06-06 20:09:10 -07001391 include_dirs = ["Modules/_sqlite"]
1392 # Only include the directory where sqlite was found if it does
1393 # not already exist in set include directories, otherwise you
1394 # can end up with a bad search path order.
1395 if sqlite_incdir not in self.compiler.include_dirs:
1396 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001397 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001398 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001399 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001400 self.add(Extension('_sqlite3', sqlite_srcs,
1401 define_macros=sqlite_defines,
1402 include_dirs=include_dirs,
1403 library_dirs=sqlite_libdir,
1404 extra_link_args=sqlite_extra_link_args,
1405 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001406 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001407 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001408
Victor Stinner5ec33a12019-03-01 16:43:28 +01001409 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001410 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001411 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001412 if not VXWORKS:
1413 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001414 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001415 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001416 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001417 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001418 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001419
Victor Stinner5ec33a12019-03-01 16:43:28 +01001420 # Platform-specific libraries
1421 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1422 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001423 else:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001424 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001425
Victor Stinner5ec33a12019-03-01 16:43:28 +01001426 if MACOS:
1427 self.add(Extension('_scproxy', ['_scproxy.c'],
1428 extra_link_args=[
1429 '-framework', 'SystemConfiguration',
1430 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001431
Victor Stinner5ec33a12019-03-01 16:43:28 +01001432 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001433 # Andrew Kuchling's zlib module. Note that some versions of zlib
1434 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1435 # http://www.cert.org/advisories/CA-2002-07.html
1436 #
1437 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1438 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1439 # now, we still accept 1.1.3, because we think it's difficult to
1440 # exploit this in Python, and we'd rather make it RedHat's problem
1441 # than our problem <wink>.
1442 #
1443 # You can upgrade zlib to version 1.1.4 yourself by going to
1444 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001445 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001446 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001447 if zlib_inc is not None:
1448 zlib_h = zlib_inc[0] + '/zlib.h'
1449 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001450 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001451 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001452 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001453 with open(zlib_h) as fp:
1454 while 1:
1455 line = fp.readline()
1456 if not line:
1457 break
1458 if line.startswith('#define ZLIB_VERSION'):
1459 version = line.split()[2]
1460 break
Guido van Rossume6970912001-04-15 15:16:12 +00001461 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001462 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001463 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001464 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1465 else:
1466 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001467 self.add(Extension('zlib', ['zlibmodule.c'],
1468 libraries=['z'],
1469 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001470 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001471 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001472 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001473 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001474 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001475 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001476 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001477
Christian Heimes1dc54002008-03-24 02:19:29 +00001478 # Helper module for various ascii-encoders. Uses zlib for an optimized
1479 # crc32 if we have it. Otherwise binascii uses its own.
1480 if have_zlib:
1481 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1482 libraries = ['z']
1483 extra_link_args = zlib_extra_link_args
1484 else:
1485 extra_compile_args = []
1486 libraries = []
1487 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001488 self.add(Extension('binascii', ['binascii.c'],
1489 extra_compile_args=extra_compile_args,
1490 libraries=libraries,
1491 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001492
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001493 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001494 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001495 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001496 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1497 else:
1498 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001499 self.add(Extension('_bz2', ['_bz2module.c'],
1500 libraries=['bz2'],
1501 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001502 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001503 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001504
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001505 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001506 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001507 self.add(Extension('_lzma', ['_lzmamodule.c'],
1508 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001509 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001510 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001511
Victor Stinner5ec33a12019-03-01 16:43:28 +01001512 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001513 # Interface to the Expat XML parser
1514 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001515 # Expat was written by James Clark and is now maintained by a group of
1516 # developers on SourceForge; see www.libexpat.org for more information.
1517 # The pyexpat module was written by Paul Prescod after a prototype by
1518 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1519 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001520 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001521 #
1522 # More information on Expat can be found at www.libexpat.org.
1523 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001524 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1525 expat_inc = []
1526 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001527 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001528 expat_lib = ['expat']
1529 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001530 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001531 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001532 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001533 define_macros = [
1534 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001535 # bpo-30947: Python uses best available entropy sources to
1536 # call XML_SetHashSalt(), expat entropy sources are not needed
1537 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001538 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001539 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001540 expat_lib = []
1541 expat_sources = ['expat/xmlparse.c',
1542 'expat/xmlrole.c',
1543 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001544 expat_depends = ['expat/ascii.h',
1545 'expat/asciitab.h',
1546 'expat/expat.h',
1547 'expat/expat_config.h',
1548 'expat/expat_external.h',
1549 'expat/internal.h',
1550 'expat/latin1tab.h',
1551 'expat/utf8tab.h',
1552 'expat/xmlrole.h',
1553 'expat/xmltok.h',
1554 'expat/xmltok_impl.h'
1555 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001556
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001557 cc = sysconfig.get_config_var('CC').split()[0]
1558 ret = os.system(
1559 '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc)
1560 if ret >> 8 == 0:
1561 extra_compile_args.append('-Wno-implicit-fallthrough')
1562
Victor Stinner8058bda2019-03-01 15:31:45 +01001563 self.add(Extension('pyexpat',
1564 define_macros=define_macros,
1565 extra_compile_args=extra_compile_args,
1566 include_dirs=expat_inc,
1567 libraries=expat_lib,
1568 sources=['pyexpat.c'] + expat_sources,
1569 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001570
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001571 # Fredrik Lundh's cElementTree module. Note that this also
1572 # uses expat (via the CAPI hook in pyexpat).
1573
Victor Stinner625dbf22019-03-01 15:59:39 +01001574 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001575 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001576 self.add(Extension('_elementtree',
1577 define_macros=define_macros,
1578 include_dirs=expat_inc,
1579 libraries=expat_lib,
1580 sources=['_elementtree.c'],
1581 depends=['pyexpat.c', *expat_sources,
1582 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001583 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001584 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001585
Victor Stinner5ec33a12019-03-01 16:43:28 +01001586 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001587 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001588 self.add(Extension('_multibytecodec',
1589 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001590 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001591 self.add(Extension('_codecs_%s' % loc,
1592 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001593
Victor Stinner5ec33a12019-03-01 16:43:28 +01001594 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001595 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001596 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001597 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1598 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001599
1600 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001601 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001602 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1603 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001604 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001605 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1606 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001607 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001608 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001609 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1610 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001611 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001612 self.add(Extension('_posixshmem', posixshmem_srcs,
1613 define_macros={},
1614 libraries=libs,
1615 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001616
Victor Stinner8058bda2019-03-01 15:31:45 +01001617 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001618 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001619
Victor Stinner5ec33a12019-03-01 16:43:28 +01001620 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001621 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001622 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001623 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001624 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001625 uuid_libs = ['uuid']
1626 else:
1627 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001628 self.add(Extension('_uuid', ['_uuidmodule.c'],
1629 libraries=uuid_libs,
1630 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001631 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001632 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001633
Victor Stinner5ec33a12019-03-01 16:43:28 +01001634 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001635 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001636 self.init_inc_lib_dirs()
1637
1638 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001639 if TEST_EXTENSIONS:
1640 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001641 self.detect_readline_curses()
1642 self.detect_crypt()
1643 self.detect_socket()
1644 self.detect_openssl_hashlib()
1645 self.detect_dbm_gdbm()
1646 self.detect_sqlite()
1647 self.detect_platform_specific_exts()
1648 self.detect_nis()
1649 self.detect_compress_exts()
1650 self.detect_expat_elementtree()
1651 self.detect_multibytecodecs()
1652 self.detect_decimal()
1653 self.detect_ctypes()
1654 self.detect_multiprocessing()
1655 if not self.detect_tkinter():
1656 self.missing.append('_tkinter')
1657 self.detect_uuid()
1658
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001659## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001660## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001661
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001662 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001663 self.add(Extension('xxlimited', ['xxlimited.c'],
1664 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001665
Ned Deilyd819b932013-09-06 01:07:05 -07001666 def detect_tkinter_explicitly(self):
1667 # Build _tkinter using explicit locations for Tcl/Tk.
1668 #
1669 # This is enabled when both arguments are given to ./configure:
1670 #
1671 # --with-tcltk-includes="-I/path/to/tclincludes \
1672 # -I/path/to/tkincludes"
1673 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1674 # -L/path/to/tklibs -ltkm.n"
1675 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001676 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001677 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1678 #
1679 # This can be useful for building and testing tkinter with multiple
1680 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1681 # build of Tcl so you need to specify both arguments and use care when
1682 # overriding.
1683
1684 # The _TCLTK variables are created in the Makefile sharedmods target.
1685 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1686 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1687 if not (tcltk_includes and tcltk_libs):
1688 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001689 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001690
1691 extra_compile_args = tcltk_includes.split()
1692 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001693 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1694 define_macros=[('WITH_APPINIT', 1)],
1695 extra_compile_args = extra_compile_args,
1696 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001697 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001698
Victor Stinner625dbf22019-03-01 15:59:39 +01001699 def detect_tkinter_darwin(self):
Jack Jansen0b06be72002-06-21 14:48:38 +00001700 # The _tkinter module, using frameworks. Since frameworks are quite
1701 # different the UNIX search logic is not sharable.
1702 from os.path import join, exists
1703 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001704 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001705 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001706 join(os.getenv('HOME'), '/Library/Frameworks')
1707 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001708
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001709 sysroot = macosx_sdk_root()
1710
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001711 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001712 # bundles.
1713 # XXX distutils should support -F!
1714 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001715 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001716
1717
Jack Jansen0b06be72002-06-21 14:48:38 +00001718 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001719 if is_macosx_sdk_path(F):
1720 if not exists(join(sysroot, F[1:], fw + '.framework')):
1721 break
1722 else:
1723 if not exists(join(F, fw + '.framework')):
1724 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001725 else:
1726 # ok, F is now directory with both frameworks. Continure
1727 # building
1728 break
1729 else:
1730 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1731 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001732 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001733
Jack Jansen0b06be72002-06-21 14:48:38 +00001734 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1735 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001736 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001737 #
1738 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001739 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001740 for fw in ('Tcl', 'Tk')
1741 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001742 ]
1743
Tim Peters2c60f7a2003-01-29 03:49:43 +00001744 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001745 # complicated search, this is a hard-coded path. It could bail out
1746 # if X11 libs are not found...
1747 include_dirs.append('/usr/X11R6/include')
1748 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1749
Georg Brandlfcaf9102008-07-16 02:17:56 +00001750 # All existing framework builds of Tcl/Tk don't support 64-bit
1751 # architectures.
1752 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001753 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001754
Ronald Oussorend097efe2009-09-15 19:07:58 +00001755 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1756 if not os.path.exists(self.build_temp):
1757 os.makedirs(self.build_temp)
1758
1759 # Note: cannot use os.popen or subprocess here, that
1760 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001761 if is_macosx_sdk_path(F):
1762 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1763 else:
1764 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001765
Brett Cannon9f5db072010-10-29 20:19:27 +00001766 with open(tmpfile) as fp:
1767 detected_archs = []
1768 for ln in fp:
1769 a = ln.split()[-1]
1770 if a in archs:
1771 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001772 os.unlink(tmpfile)
1773
1774 for a in detected_archs:
1775 frameworks.append('-arch')
1776 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001777
Victor Stinnercfe172d2019-03-01 18:21:49 +01001778 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1779 define_macros=[('WITH_APPINIT', 1)],
1780 include_dirs=include_dirs,
1781 libraries=[],
1782 extra_compile_args=frameworks[2:],
1783 extra_link_args=frameworks))
Victor Stinner4cbea512019-02-28 17:48:38 +01001784 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001785
Victor Stinner625dbf22019-03-01 15:59:39 +01001786 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001787 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001788
Ned Deilyd819b932013-09-06 01:07:05 -07001789 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1790 # configured or passed into the make target. If so, use these values
1791 # to build tkinter and bypass the searches for Tcl and TK in standard
1792 # locations.
1793 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01001794 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001795
Jack Jansen0b06be72002-06-21 14:48:38 +00001796 # Rather than complicate the code below, detecting and building
1797 # AquaTk is a separate method. Only one Tkinter will be built on
1798 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01001799 if (MACOS and self.detect_tkinter_darwin()):
1800 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001801
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001802 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001803 # The versions with dots are used on Unix, and the versions without
1804 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001805 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001806 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1807 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01001808 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001809 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01001810 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001811 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001812 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001813 # Exit the loop when we've found the Tcl/Tk libraries
1814 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001815
Fredrik Lundhade711a2001-01-24 08:00:28 +00001816 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001817 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001818 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001819 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001820 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01001821 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001822 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1823 # but the include subdirs are named like .../include/tcl8.3.
1824 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1825 tcl_include_sub = []
1826 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001827 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001828 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1829 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1830 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01001831 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
1832 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001833
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001834 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001835 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001836 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01001837 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00001838
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001839 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001840
Victor Stinnercfe172d2019-03-01 18:21:49 +01001841 include_dirs = []
1842 libs = []
1843 defs = []
1844 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001845 for dir in tcl_includes + tk_includes:
1846 if dir not in include_dirs:
1847 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001848
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001849 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01001850 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001851 include_dirs.append('/usr/openwin/include')
1852 added_lib_dirs.append('/usr/openwin/lib')
1853 elif os.path.exists('/usr/X11R6/include'):
1854 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001855 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001856 added_lib_dirs.append('/usr/X11R6/lib')
1857 elif os.path.exists('/usr/X11R5/include'):
1858 include_dirs.append('/usr/X11R5/include')
1859 added_lib_dirs.append('/usr/X11R5/lib')
1860 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001861 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001862 include_dirs.append('/usr/X11/include')
1863 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001864
Jason Tishler9181c942003-02-05 15:16:17 +00001865 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01001866 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00001867 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1868 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001869 return False
Jason Tishler9181c942003-02-05 15:16:17 +00001870
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001871 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01001872 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001873 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001874 defs.append( ('WITH_BLT', 1) )
1875 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01001876 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001877 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001878 defs.append( ('WITH_BLT', 1) )
1879 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001880
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001881 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001882 libs.append('tk'+ version)
1883 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001884
Victor Stinner4cbea512019-02-28 17:48:38 +01001885 if HOST_PLATFORM in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001886 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001887
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001888 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01001889 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001890 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001891
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001892 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001893 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001894 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001895 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001896 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001897 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001898 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001899
Victor Stinnercfe172d2019-03-01 18:21:49 +01001900 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1901 define_macros=[('WITH_APPINIT', 1)] + defs,
1902 include_dirs=include_dirs,
1903 libraries=libs,
1904 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01001905 return True
1906
Christian Heimes78644762008-03-04 23:39:23 +00001907 def configure_ctypes_darwin(self, ext):
1908 # Darwin (OS X) uses preconfigured files, in
1909 # the Modules/_ctypes/libffi_osx directory.
Victor Stinner625dbf22019-03-01 15:59:39 +01001910 ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules',
Christian Heimes78644762008-03-04 23:39:23 +00001911 '_ctypes', 'libffi_osx'))
1912 sources = [os.path.join(ffi_srcdir, p)
1913 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001914 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001915 'x86/x86-darwin.S',
1916 'x86/x86-ffi_darwin.c',
1917 'x86/x86-ffi64.c',
1918 'powerpc/ppc-darwin.S',
1919 'powerpc/ppc-darwin_closure.S',
1920 'powerpc/ppc-ffi_darwin.c',
1921 'powerpc/ppc64-darwin_closure.S',
1922 ]]
1923
1924 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001925 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001926
1927 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1928 os.path.join(ffi_srcdir, 'powerpc')]
1929 ext.include_dirs.extend(include_dirs)
1930 ext.sources.extend(sources)
1931 return True
1932
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001933 def configure_ctypes(self, ext):
1934 if not self.use_system_libffi:
Victor Stinner4cbea512019-02-28 17:48:38 +01001935 if MACOS:
Christian Heimes78644762008-03-04 23:39:23 +00001936 return self.configure_ctypes_darwin(ext)
Zachary Waref40d4dd2016-09-17 01:25:24 -05001937 print('INFO: Could not locate ffi libs and/or headers')
1938 return False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001939 return True
1940
Victor Stinner625dbf22019-03-01 15:59:39 +01001941 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001942 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001943 self.use_system_libffi = False
1944 include_dirs = []
1945 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001946 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001947 sources = ['_ctypes/_ctypes.c',
1948 '_ctypes/callbacks.c',
1949 '_ctypes/callproc.c',
1950 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001951 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001952 depends = ['_ctypes/ctypes.h']
1953
Victor Stinner4cbea512019-02-28 17:48:38 +01001954 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00001955 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001956 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001957 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001958 include_dirs.append('_ctypes/darwin')
Victor Stinner5ec33a12019-03-01 16:43:28 +01001959 # XXX Is this still needed?
1960 # extra_link_args.extend(['-read_only_relocs', 'warning'])
Thomas Hellercf567c12006-03-08 19:51:58 +00001961
Victor Stinner4cbea512019-02-28 17:48:38 +01001962 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001963 # XXX This shouldn't be necessary; it appears that some
1964 # of the assembler code is non-PIC (i.e. it has relocations
1965 # when it shouldn't. The proper fix would be to rewrite
1966 # the assembler code to be PIC.
1967 # This only works with GCC; the Sun compiler likely refuses
1968 # this option. If you want to compile ctypes with the Sun
1969 # compiler, please research a proper solution, instead of
1970 # finding some -z option for the Sun compiler.
1971 extra_link_args.append('-mimpure-text')
1972
Victor Stinner4cbea512019-02-28 17:48:38 +01001973 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001974 extra_link_args.append('-fPIC')
1975
Thomas Hellercf567c12006-03-08 19:51:58 +00001976 ext = Extension('_ctypes',
1977 include_dirs=include_dirs,
1978 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001979 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001980 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001981 sources=sources,
1982 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01001983 self.add(ext)
1984 if TEST_EXTENSIONS:
1985 # function my_sqrt() needs libm for sqrt()
1986 self.add(Extension('_ctypes_test',
1987 sources=['_ctypes/_ctypes_test.c'],
1988 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00001989
Victor Stinner625dbf22019-03-01 15:59:39 +01001990 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01001991 if MACOS:
Zachary Ware935043d2016-09-09 17:01:21 -07001992 if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
1993 return
Christian Heimes78644762008-03-04 23:39:23 +00001994 # OS X 10.5 comes with libffi.dylib; the include files are
1995 # in /usr/include/ffi
Victor Stinner96d81582019-03-01 13:53:46 +01001996 ffi_inc_dirs.append('/usr/include/ffi')
Christian Heimes78644762008-03-04 23:39:23 +00001997
Benjamin Petersond78735d2010-01-01 16:04:23 +00001998 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001999 if not ffi_inc or ffi_inc[0] == '':
Victor Stinner96d81582019-03-01 13:53:46 +01002000 ffi_inc = find_file('ffi.h', [], ffi_inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002001 if ffi_inc is not None:
2002 ffi_h = ffi_inc[0] + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002003 if not os.path.exists(ffi_h):
2004 ffi_inc = None
2005 print('Header file {} does not exist'.format(ffi_h))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002006 ffi_lib = None
2007 if ffi_inc is not None:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002008 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002009 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002010 ffi_lib = lib_name
2011 break
2012
2013 if ffi_inc and ffi_lib:
2014 ext.include_dirs.extend(ffi_inc)
2015 ext.libraries.append(ffi_lib)
2016 self.use_system_libffi = True
2017
Christian Heimes5bb96922018-02-25 10:22:14 +01002018 if sysconfig.get_config_var('HAVE_LIBDL'):
2019 # for dlopen, see bpo-32647
2020 ext.libraries.append('dl')
2021
Victor Stinner5ec33a12019-03-01 16:43:28 +01002022 def detect_decimal(self):
2023 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002024 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002025 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002026 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2027 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002028 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002029 sources = ['_decimal/_decimal.c']
2030 depends = ['_decimal/docstrings.h']
2031 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002032 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002033 'Modules',
2034 '_decimal',
2035 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002036 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002037 sources = [
2038 '_decimal/_decimal.c',
2039 '_decimal/libmpdec/basearith.c',
2040 '_decimal/libmpdec/constants.c',
2041 '_decimal/libmpdec/context.c',
2042 '_decimal/libmpdec/convolute.c',
2043 '_decimal/libmpdec/crt.c',
2044 '_decimal/libmpdec/difradix2.c',
2045 '_decimal/libmpdec/fnt.c',
2046 '_decimal/libmpdec/fourstep.c',
2047 '_decimal/libmpdec/io.c',
2048 '_decimal/libmpdec/memory.c',
2049 '_decimal/libmpdec/mpdecimal.c',
2050 '_decimal/libmpdec/numbertheory.c',
2051 '_decimal/libmpdec/sixstep.c',
2052 '_decimal/libmpdec/transpose.c',
2053 ]
2054 depends = [
2055 '_decimal/docstrings.h',
2056 '_decimal/libmpdec/basearith.h',
2057 '_decimal/libmpdec/bits.h',
2058 '_decimal/libmpdec/constants.h',
2059 '_decimal/libmpdec/convolute.h',
2060 '_decimal/libmpdec/crt.h',
2061 '_decimal/libmpdec/difradix2.h',
2062 '_decimal/libmpdec/fnt.h',
2063 '_decimal/libmpdec/fourstep.h',
2064 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002065 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002066 '_decimal/libmpdec/mpdecimal.h',
2067 '_decimal/libmpdec/numbertheory.h',
2068 '_decimal/libmpdec/sixstep.h',
2069 '_decimal/libmpdec/transpose.h',
2070 '_decimal/libmpdec/typearith.h',
2071 '_decimal/libmpdec/umodarith.h',
2072 ]
2073
Stefan Krah1919b7e2012-03-21 18:25:23 +01002074 config = {
2075 'x64': [('CONFIG_64','1'), ('ASM','1')],
2076 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2077 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2078 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2079 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2080 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2081 ('LEGACY_COMPILER','1')],
2082 'universal': [('UNIVERSAL','1')]
2083 }
2084
Stefan Krah1919b7e2012-03-21 18:25:23 +01002085 cc = sysconfig.get_config_var('CC')
2086 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2087 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2088
2089 if machine:
2090 # Override automatic configuration to facilitate testing.
2091 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002092 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002093 # Universal here means: build with the same options Python
2094 # was built with.
2095 define_macros = config['universal']
2096 elif sizeof_size_t == 8:
2097 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2098 define_macros = config['x64']
2099 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2100 define_macros = config['uint128']
2101 else:
2102 define_macros = config['ansi64']
2103 elif sizeof_size_t == 4:
2104 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2105 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002106 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002107 # solaris: problems with register allocation.
2108 # icc >= 11.0 works as well.
2109 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002110 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002111 else:
2112 define_macros = config['ansi32']
2113 else:
2114 raise DistutilsError("_decimal: unsupported architecture")
2115
2116 # Workarounds for toolchain bugs:
2117 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2118 # Some versions of gcc miscompile inline asm:
2119 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2120 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2121 extra_compile_args.append('-fno-ipa-pure-const')
2122 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2123 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2124 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2125 undef_macros.append('_FORTIFY_SOURCE')
2126
Stefan Krah1919b7e2012-03-21 18:25:23 +01002127 # Uncomment for extra functionality:
2128 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002129 self.add(Extension('_decimal',
2130 include_dirs=include_dirs,
2131 libraries=libraries,
2132 define_macros=define_macros,
2133 undef_macros=undef_macros,
2134 extra_compile_args=extra_compile_args,
2135 sources=sources,
2136 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002137
Victor Stinner5ec33a12019-03-01 16:43:28 +01002138 def detect_openssl_hashlib(self):
2139 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002140 config_vars = sysconfig.get_config_vars()
2141
2142 def split_var(name, sep):
2143 # poor man's shlex, the re module is not available yet.
2144 value = config_vars.get(name)
2145 if not value:
2146 return ()
2147 # This trick works because ax_check_openssl uses --libs-only-L,
2148 # --libs-only-l, and --cflags-only-I.
2149 value = ' ' + value
2150 sep = ' ' + sep
2151 return [v.strip() for v in value.split(sep) if v.strip()]
2152
2153 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2154 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2155 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2156 if not openssl_libs:
2157 # libssl and libcrypto not found
2158 return None, None
2159
2160 # Find OpenSSL includes
2161 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002162 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002163 )
2164 if ssl_incs is None:
2165 return None, None
2166
2167 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2168 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002169 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002170 ['/usr/kerberos/include']
2171 )
2172 if krb5_h:
2173 ssl_incs.extend(krb5_h)
2174
Christian Heimes61d478c2018-01-27 15:51:38 +01002175 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Victor Stinner8058bda2019-03-01 15:31:45 +01002176 self.add(Extension('_ssl', ['_ssl.c'],
2177 include_dirs=openssl_includes,
2178 library_dirs=openssl_libdirs,
2179 libraries=openssl_libs,
2180 depends=['socketmodule.h']))
Christian Heimes61d478c2018-01-27 15:51:38 +01002181 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002182 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002183
Victor Stinner8058bda2019-03-01 15:31:45 +01002184 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2185 depends=['hashlib.h'],
2186 include_dirs=openssl_includes,
2187 library_dirs=openssl_libdirs,
2188 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002189
Victor Stinner5ec33a12019-03-01 16:43:28 +01002190 # We always compile these even when OpenSSL is available (issue #14693).
2191 # It's harmless and the object code is tiny (40-50 KiB per module,
2192 # only loaded when actually used).
2193 self.add(Extension('_sha256', ['sha256module.c'],
2194 depends=['hashlib.h']))
2195 self.add(Extension('_sha512', ['sha512module.c'],
2196 depends=['hashlib.h']))
2197 self.add(Extension('_md5', ['md5module.c'],
2198 depends=['hashlib.h']))
2199 self.add(Extension('_sha1', ['sha1module.c'],
2200 depends=['hashlib.h']))
2201
2202 blake2_deps = glob(os.path.join(self.srcdir,
2203 'Modules/_blake2/impl/*'))
2204 blake2_deps.append('hashlib.h')
2205
2206 self.add(Extension('_blake2',
2207 ['_blake2/blake2module.c',
2208 '_blake2/blake2b_impl.c',
2209 '_blake2/blake2s_impl.c'],
2210 depends=blake2_deps))
2211
2212 sha3_deps = glob(os.path.join(self.srcdir,
2213 'Modules/_sha3/kcp/*'))
2214 sha3_deps.append('hashlib.h')
2215 self.add(Extension('_sha3',
2216 ['_sha3/sha3module.c'],
2217 depends=sha3_deps))
2218
2219 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002220 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002221 self.missing.append('nis')
2222 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002223
2224 libs = []
2225 library_dirs = []
2226 includes_dirs = []
2227
2228 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2229 # moved headers and libraries to libtirpc and libnsl. The headers
2230 # are in tircp and nsl sub directories.
2231 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002232 'rpcsvc/yp_prot.h', self.inc_dirs,
2233 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002234 )
2235 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002236 'rpc/rpc.h', self.inc_dirs,
2237 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002238 )
2239 if rpcsvc_inc is None or rpc_inc is None:
2240 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002241 self.missing.append('nis')
2242 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002243 includes_dirs.extend(rpcsvc_inc)
2244 includes_dirs.extend(rpc_inc)
2245
Victor Stinner625dbf22019-03-01 15:59:39 +01002246 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002247 libs.append('nsl')
2248 else:
2249 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002250 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002251 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2252 if libnsl is not None:
2253 library_dirs.append(os.path.dirname(libnsl))
2254 libs.append('nsl')
2255
Victor Stinner625dbf22019-03-01 15:59:39 +01002256 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002257 libs.append('tirpc')
2258
Victor Stinner8058bda2019-03-01 15:31:45 +01002259 self.add(Extension('nis', ['nismodule.c'],
2260 libraries=libs,
2261 library_dirs=library_dirs,
2262 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002263
Christian Heimesff5be6e2018-01-20 13:19:21 +01002264
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002265class PyBuildInstall(install):
2266 # Suppress the warning about installation into the lib_dynload
2267 # directory, which is not in sys.path when running Python during
2268 # installation:
2269 def initialize_options (self):
2270 install.initialize_options(self)
2271 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002272
Éric Araujoe6792c12011-06-09 14:07:02 +02002273 # Customize subcommands to not install an egg-info file for Python
2274 sub_commands = [('install_lib', install.has_lib),
2275 ('install_headers', install.has_headers),
2276 ('install_scripts', install.has_scripts),
2277 ('install_data', install.has_data)]
2278
2279
Michael W. Hudson529a5052002-12-17 16:47:17 +00002280class PyBuildInstallLib(install_lib):
2281 # Do exactly what install_lib does but make sure correct access modes get
2282 # set on installed directories and files. All installed files with get
2283 # mode 644 unless they are a shared library in which case they will get
2284 # mode 755. All installed directories will get mode 755.
2285
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002286 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2287 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002288
2289 def install(self):
2290 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002291 self.set_file_modes(outfiles, 0o644, 0o755)
2292 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002293 return outfiles
2294
2295 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002296 if not files: return
2297
2298 for filename in files:
2299 if os.path.islink(filename): continue
2300 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002301 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002302 log.info("changing mode of %s to %o", filename, mode)
2303 if not self.dry_run: os.chmod(filename, mode)
2304
2305 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002306 for dirpath, dirnames, fnames in os.walk(dirname):
2307 if os.path.islink(dirpath):
2308 continue
2309 log.info("changing mode of %s to %o", dirpath, mode)
2310 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002311
Victor Stinnerc991f242019-03-01 17:19:04 +01002312
Georg Brandlff52f762010-12-28 09:51:43 +00002313class PyBuildScripts(build_scripts):
2314 def copy_scripts(self):
2315 outfiles, updated_files = build_scripts.copy_scripts(self)
2316 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2317 minoronly = '.{0[1]}'.format(sys.version_info)
2318 newoutfiles = []
2319 newupdated_files = []
2320 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002321 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002322 newfilename = filename + fullversion
2323 else:
2324 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002325 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002326 os.rename(filename, newfilename)
2327 newoutfiles.append(newfilename)
2328 if filename in updated_files:
2329 newupdated_files.append(newfilename)
2330 return newoutfiles, newupdated_files
2331
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002332
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002333def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002334 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2335 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2336
2337 class DummyProcess:
2338 """Hack for parallel build"""
2339 ProcessPoolExecutor = None
2340
2341 sys.modules['concurrent.futures.process'] = DummyProcess
2342
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002343 # turn off warnings when deprecated modules are imported
2344 import warnings
2345 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002346 setup(# PyPI Metadata (PEP 301)
2347 name = "Python",
2348 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002349 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002350 maintainer = "Guido van Rossum and the Python community",
2351 maintainer_email = "python-dev@python.org",
2352 description = "A high-level object-oriented programming language",
2353 long_description = SUMMARY.strip(),
2354 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002355 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002356 platforms = ["Many"],
2357
2358 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002359 cmdclass = {'build_ext': PyBuildExt,
2360 'build_scripts': PyBuildScripts,
2361 'install': PyBuildInstall,
2362 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002363 # The struct module is defined here, because build_ext won't be
2364 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002365 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002366
Georg Brandlff52f762010-12-28 09:51:43 +00002367 # If you change the scripts installed here, you also need to
2368 # check the PyBuildScripts command above, and change the links
2369 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002370 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002371 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002372 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002373
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002374# --install-platlib
2375if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002376 main()