blob: b96961073b987b776d77a5cbaa1d64e8d26a8eef [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.
Victor Stinner4d61e6e2019-03-04 14:21:28 +0100787 self.add(Extension('_xxsubinterpreters',
788 ['_xxsubinterpretersmodule.c'],
789 define_macros=[('Py_BUILD_CORE', '')]))
Eric Snow7f8bfc92018-01-29 18:23:44 -0700790
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000791 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000792 # Here ends the simple stuff. From here on, modules need certain
793 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000794 #
795
796 # Multimedia modules
797 # These don't work for 64-bit platforms!!!
798 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200799 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000800 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000801 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000802 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200803 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800804 # audioop needs libm for floor() in multiple functions.
Victor Stinner8058bda2019-03-01 15:31:45 +0100805 self.add(Extension('audioop', ['audioop.c'],
806 libraries=['m']))
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000807
Victor Stinner5ec33a12019-03-01 16:43:28 +0100808 # CSV files
809 self.add(Extension('_csv', ['_csv.c']))
810
811 # POSIX subprocess module helper.
812 self.add(Extension('_posixsubprocess', ['_posixsubprocess.c']))
813
Victor Stinnercfe172d2019-03-01 18:21:49 +0100814 def detect_test_extensions(self):
815 # Python C API test module
816 self.add(Extension('_testcapi', ['_testcapimodule.c'],
817 depends=['testcapi_long.h']))
818
819 # Python PEP-3118 (buffer protocol) test module
820 self.add(Extension('_testbuffer', ['_testbuffer.c']))
821
822 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
823 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
824
825 # Test multi-phase extension module init (PEP 489)
826 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
827
828 # Fuzz tests.
829 self.add(Extension('_xxtestfuzz',
830 ['_xxtestfuzz/_xxtestfuzz.c',
831 '_xxtestfuzz/fuzzer.c']))
832
Victor Stinner5ec33a12019-03-01 16:43:28 +0100833 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000834 # readline
Victor Stinner625dbf22019-03-01 15:59:39 +0100835 do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000836 readline_termcap_library = ""
837 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200838 # Cannot use os.popen here in py3k.
839 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
840 if not os.path.exists(self.build_temp):
841 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000842 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200843 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100844 if CROSS_COMPILING:
doko@ubuntu.com58844492012-06-30 18:25:32 +0200845 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
846 % (sysconfig.get_config_var('READELF'),
847 do_readline, tmpfile))
848 elif find_executable('ldd'):
849 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
850 else:
851 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200852 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000853 with open(tmpfile) as fp:
854 for ln in fp:
855 if 'curses' in ln:
856 readline_termcap_library = re.sub(
857 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
858 ).rstrip()
859 break
860 # termcap interface split out from ncurses
861 if 'tinfo' in ln:
862 readline_termcap_library = 'tinfo'
863 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200864 if os.path.exists(tmpfile):
865 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000866 # Issue 7384: If readline is already linked against curses,
867 # use the same library for the readline and curses modules.
868 if 'curses' in readline_termcap_library:
869 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +0100870 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000871 curses_library = 'ncursesw'
Victor Stinner625dbf22019-03-01 15:59:39 +0100872 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000873 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +0100874 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000875 curses_library = 'curses'
876
Victor Stinner4cbea512019-02-28 17:48:38 +0100877 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000878 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000879 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -0700880 if (dep_target and
881 (tuple(int(n) for n in dep_target.split('.')[0:2])
882 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +0000883 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000884 if os_release < 9:
885 # MacOSX 10.4 has a broken readline. Don't try to build
886 # the readline module unless the user has installed a fixed
887 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +0100888 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000889 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000890 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100891 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000892 # In every directory on the search path search for a dynamic
893 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000894 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +0000895 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000896 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000897 readline_extra_link_args = ('-Wl,-search_paths_first',)
898 else:
899 readline_extra_link_args = ()
900
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000901 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000902 if readline_termcap_library:
903 pass # Issue 7384: Already linked against curses or tinfo.
904 elif curses_library:
905 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +0100906 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000907 ['/usr/lib/termcap'],
908 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000909 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +0100910 self.add(Extension('readline', ['readline.c'],
911 library_dirs=['/usr/lib/termcap'],
912 extra_link_args=readline_extra_link_args,
913 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000914 else:
Victor Stinner8058bda2019-03-01 15:31:45 +0100915 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000916
Victor Stinner5ec33a12019-03-01 16:43:28 +0100917 # Curses support, requiring the System V version of curses, often
918 # provided by the ncurses library.
919 curses_defines = []
920 curses_includes = []
921 panel_library = 'panel'
922 if curses_library == 'ncursesw':
923 curses_defines.append(('HAVE_NCURSESW', '1'))
924 if not CROSS_COMPILING:
925 curses_includes.append('/usr/include/ncursesw')
926 # Bug 1464056: If _curses.so links with ncursesw,
927 # _curses_panel.so must link with panelw.
928 panel_library = 'panelw'
929 if MACOS:
930 # On OS X, there is no separate /usr/lib/libncursesw nor
931 # libpanelw. If we are here, we found a locally-supplied
932 # version of libncursesw. There should also be a
933 # libpanelw. _XOPEN_SOURCE defines are usually excluded
934 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
935 # ncurses wide char support
936 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
937 elif MACOS and curses_library == 'ncurses':
938 # Building with the system-suppied combined libncurses/libpanel
939 curses_defines.append(('HAVE_NCURSESW', '1'))
940 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +0000941
Victor Stinnercfe172d2019-03-01 18:21:49 +0100942 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +0100943 if curses_library.startswith('ncurses'):
944 curses_libs = [curses_library]
945 self.add(Extension('_curses', ['_cursesmodule.c'],
946 include_dirs=curses_includes,
947 define_macros=curses_defines,
948 libraries=curses_libs))
949 elif curses_library == 'curses' and not MACOS:
950 # OSX has an old Berkeley curses, not good enough for
951 # the _curses module.
952 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
953 curses_libs = ['curses', 'terminfo']
954 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
955 curses_libs = ['curses', 'termcap']
956 else:
957 curses_libs = ['curses']
958
959 self.add(Extension('_curses', ['_cursesmodule.c'],
960 define_macros=curses_defines,
961 libraries=curses_libs))
962 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +0100963 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +0100964 self.missing.append('_curses')
965
966 # If the curses module is enabled, check for the panel module
Victor Stinnercfe172d2019-03-01 18:21:49 +0100967 if (curses_enabled and
Victor Stinner5ec33a12019-03-01 16:43:28 +0100968 self.compiler.find_library_file(self.lib_dirs, panel_library)):
969 self.add(Extension('_curses_panel', ['_curses_panel.c'],
970 include_dirs=curses_includes,
971 define_macros=curses_defines,
972 libraries=[panel_library, *curses_libs]))
973 else:
974 self.missing.append('_curses_panel')
975
976 def detect_crypt(self):
977 # crypt module.
Victor Stinner625dbf22019-03-01 15:59:39 +0100978 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000979 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000980 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000981 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +0800982
983 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100984 self.add(Extension('_crypt', ['_cryptmodule.c'],
985 libraries=libs))
Victor Stinner625dbf22019-03-01 15:59:39 +0100986 elif self.compiler.find_library_file(self.lib_dirs, 'OPENSSL'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800987 libs = ['OPENSSL']
Victor Stinner8058bda2019-03-01 15:31:45 +0100988 self.add(Extension('_crypt', ['_cryptmodule.c'],
989 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000990
Victor Stinner5ec33a12019-03-01 16:43:28 +0100991 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000992 # socket(2)
pxinwr32f5fdd2019-02-27 19:09:28 +0800993 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100994 self.add(Extension('_socket', ['socketmodule.c'],
995 depends=['socketmodule.h']))
Victor Stinner625dbf22019-03-01 15:59:39 +0100996 elif self.compiler.find_library_file(self.lib_dirs, 'net'):
pxinwr32f5fdd2019-02-27 19:09:28 +0800997 libs = ['net']
Victor Stinner8058bda2019-03-01 15:31:45 +0100998 self.add(Extension('_socket', ['socketmodule.c'],
999 depends=['socketmodule.h'],
1000 libraries=libs))
pxinwr32f5fdd2019-02-27 19:09:28 +08001001
Victor Stinner5ec33a12019-03-01 16:43:28 +01001002 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001003 # Modules that provide persistent dictionary-like semantics. You will
1004 # probably want to arrange for at least one of them to be available on
1005 # your machine, though none are defined by default because of library
1006 # dependencies. The Python module dbm/__init__.py provides an
1007 # implementation independent wrapper for these; dbm/dumb.py provides
1008 # similar functionality (but slower of course) implemented in Python.
1009
1010 # Sleepycat^WOracle Berkeley DB interface.
1011 # http://www.oracle.com/database/berkeley-db/db/index.html
1012 #
1013 # This requires the Sleepycat^WOracle DB code. The supported versions
1014 # are set below. Visit the URL above to download
1015 # a release. Most open source OSes come with one or more
1016 # versions of BerkeleyDB already installed.
1017
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001018 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001019 min_db_ver = (3, 3)
1020 db_setup_debug = False # verbose debug prints from this script?
1021
1022 def allow_db_ver(db_ver):
1023 """Returns a boolean if the given BerkeleyDB version is acceptable.
1024
1025 Args:
1026 db_ver: A tuple of the version to verify.
1027 """
1028 if not (min_db_ver <= db_ver <= max_db_ver):
1029 return False
1030 return True
1031
1032 def gen_db_minor_ver_nums(major):
1033 if major == 4:
1034 for x in range(max_db_ver[1]+1):
1035 if allow_db_ver((4, x)):
1036 yield x
1037 elif major == 3:
1038 for x in (3,):
1039 if allow_db_ver((3, x)):
1040 yield x
1041 else:
1042 raise ValueError("unknown major BerkeleyDB version", major)
1043
1044 # construct a list of paths to look for the header file in on
1045 # top of the normal inc_dirs.
1046 db_inc_paths = [
1047 '/usr/include/db4',
1048 '/usr/local/include/db4',
1049 '/opt/sfw/include/db4',
1050 '/usr/include/db3',
1051 '/usr/local/include/db3',
1052 '/opt/sfw/include/db3',
1053 # Fink defaults (http://fink.sourceforge.net/)
1054 '/sw/include/db4',
1055 '/sw/include/db3',
1056 ]
1057 # 4.x minor number specific paths
1058 for x in gen_db_minor_ver_nums(4):
1059 db_inc_paths.append('/usr/include/db4%d' % x)
1060 db_inc_paths.append('/usr/include/db4.%d' % x)
1061 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1062 db_inc_paths.append('/usr/local/include/db4%d' % x)
1063 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1064 db_inc_paths.append('/opt/db-4.%d/include' % x)
1065 # MacPorts default (http://www.macports.org/)
1066 db_inc_paths.append('/opt/local/include/db4%d' % x)
1067 # 3.x minor number specific paths
1068 for x in gen_db_minor_ver_nums(3):
1069 db_inc_paths.append('/usr/include/db3%d' % x)
1070 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1071 db_inc_paths.append('/usr/local/include/db3%d' % x)
1072 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1073 db_inc_paths.append('/opt/db-3.%d/include' % x)
1074
Victor Stinner4cbea512019-02-28 17:48:38 +01001075 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001076 db_inc_paths = []
1077
Georg Brandl489cb4f2009-07-11 10:08:49 +00001078 # Add some common subdirectories for Sleepycat DB to the list,
1079 # based on the standard include directories. This way DB3/4 gets
1080 # picked up when it is installed in a non-standard prefix and
1081 # the user has added that prefix into inc_dirs.
1082 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001083 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001084 std_variants.append(os.path.join(dn, 'db3'))
1085 std_variants.append(os.path.join(dn, 'db4'))
1086 for x in gen_db_minor_ver_nums(4):
1087 std_variants.append(os.path.join(dn, "db4%d"%x))
1088 std_variants.append(os.path.join(dn, "db4.%d"%x))
1089 for x in gen_db_minor_ver_nums(3):
1090 std_variants.append(os.path.join(dn, "db3%d"%x))
1091 std_variants.append(os.path.join(dn, "db3.%d"%x))
1092
1093 db_inc_paths = std_variants + db_inc_paths
1094 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1095
1096 db_ver_inc_map = {}
1097
Victor Stinner4cbea512019-02-28 17:48:38 +01001098 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001099 sysroot = macosx_sdk_root()
1100
Georg Brandl489cb4f2009-07-11 10:08:49 +00001101 class db_found(Exception): pass
1102 try:
1103 # See whether there is a Sleepycat header in the standard
1104 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001105 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001106 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001107 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001108 f = os.path.join(sysroot, d[1:], "db.h")
1109
Georg Brandl489cb4f2009-07-11 10:08:49 +00001110 if db_setup_debug: print("db: looking for db.h in", f)
1111 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001112 with open(f, 'rb') as file:
1113 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001114 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001115 if m:
1116 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001117 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001118 db_minor = int(m.group(1))
1119 db_ver = (db_major, db_minor)
1120
1121 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1122 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001123 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001124 db_patch = int(m.group(1))
1125 if db_patch < 21:
1126 print("db.h:", db_ver, "patch", db_patch,
1127 "being ignored (4.6.x must be >= 4.6.21)")
1128 continue
1129
1130 if ( (db_ver not in db_ver_inc_map) and
1131 allow_db_ver(db_ver) ):
1132 # save the include directory with the db.h version
1133 # (first occurrence only)
1134 db_ver_inc_map[db_ver] = d
1135 if db_setup_debug:
1136 print("db.h: found", db_ver, "in", d)
1137 else:
1138 # we already found a header for this library version
1139 if db_setup_debug: print("db.h: ignoring", d)
1140 else:
1141 # ignore this header, it didn't contain a version number
1142 if db_setup_debug:
1143 print("db.h: no version number version in", d)
1144
1145 db_found_vers = list(db_ver_inc_map.keys())
1146 db_found_vers.sort()
1147
1148 while db_found_vers:
1149 db_ver = db_found_vers.pop()
1150 db_incdir = db_ver_inc_map[db_ver]
1151
1152 # check lib directories parallel to the location of the header
1153 db_dirs_to_check = [
1154 db_incdir.replace("include", 'lib64'),
1155 db_incdir.replace("include", 'lib'),
1156 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001157
Victor Stinner4cbea512019-02-28 17:48:38 +01001158 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001159 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1160
1161 else:
1162 # Same as other branch, but takes OSX SDK into account
1163 tmp = []
1164 for dn in db_dirs_to_check:
1165 if is_macosx_sdk_path(dn):
1166 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1167 tmp.append(dn)
1168 else:
1169 if os.path.isdir(dn):
1170 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001171 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001172
1173 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001174
Ezio Melotti42da6632011-03-15 05:18:48 +02001175 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001176 # XXX should we -ever- look for a dbX name? Do any
1177 # systems really not name their library by version and
1178 # symlink to more general names?
1179 for dblib in (('db-%d.%d' % db_ver),
1180 ('db%d%d' % db_ver),
1181 ('db%d' % db_ver[0])):
1182 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001183 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001184 if dblib_file:
1185 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1186 raise db_found
1187 else:
1188 if db_setup_debug: print("db lib: ", dblib, "not found")
1189
1190 except db_found:
1191 if db_setup_debug:
1192 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1193 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001194 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001195 # Only add the found library and include directories if they aren't
1196 # already being searched. This avoids an explicit runtime library
1197 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001198 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001199 db_incs = None
1200 else:
1201 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001202 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001203 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001204 else:
1205 if db_setup_debug: print("db: no appropriate library found")
1206 db_incs = None
1207 dblibs = []
1208 dblib_dir = None
1209
Victor Stinner5ec33a12019-03-01 16:43:28 +01001210 dbm_setup_debug = False # verbose debug prints from this script?
1211 dbm_order = ['gdbm']
1212 # The standard Unix dbm module:
1213 if not CYGWIN:
1214 config_args = [arg.strip("'")
1215 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1216 dbm_args = [arg for arg in config_args
1217 if arg.startswith('--with-dbmliborder=')]
1218 if dbm_args:
1219 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1220 else:
1221 dbm_order = "ndbm:gdbm:bdb".split(":")
1222 dbmext = None
1223 for cand in dbm_order:
1224 if cand == "ndbm":
1225 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1226 # Some systems have -lndbm, others have -lgdbm_compat,
1227 # others don't have either
1228 if self.compiler.find_library_file(self.lib_dirs,
1229 'ndbm'):
1230 ndbm_libs = ['ndbm']
1231 elif self.compiler.find_library_file(self.lib_dirs,
1232 'gdbm_compat'):
1233 ndbm_libs = ['gdbm_compat']
1234 else:
1235 ndbm_libs = []
1236 if dbm_setup_debug: print("building dbm using ndbm")
1237 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1238 define_macros=[
1239 ('HAVE_NDBM_H',None),
1240 ],
1241 libraries=ndbm_libs)
1242 break
1243
1244 elif cand == "gdbm":
1245 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1246 gdbm_libs = ['gdbm']
1247 if self.compiler.find_library_file(self.lib_dirs,
1248 'gdbm_compat'):
1249 gdbm_libs.append('gdbm_compat')
1250 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1251 if dbm_setup_debug: print("building dbm using gdbm")
1252 dbmext = Extension(
1253 '_dbm', ['_dbmmodule.c'],
1254 define_macros=[
1255 ('HAVE_GDBM_NDBM_H', None),
1256 ],
1257 libraries = gdbm_libs)
1258 break
1259 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1260 if dbm_setup_debug: print("building dbm using gdbm")
1261 dbmext = Extension(
1262 '_dbm', ['_dbmmodule.c'],
1263 define_macros=[
1264 ('HAVE_GDBM_DASH_NDBM_H', None),
1265 ],
1266 libraries = gdbm_libs)
1267 break
1268 elif cand == "bdb":
1269 if dblibs:
1270 if dbm_setup_debug: print("building dbm using bdb")
1271 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1272 library_dirs=dblib_dir,
1273 runtime_library_dirs=dblib_dir,
1274 include_dirs=db_incs,
1275 define_macros=[
1276 ('HAVE_BERKDB_H', None),
1277 ('DB_DBM_HSEARCH', None),
1278 ],
1279 libraries=dblibs)
1280 break
1281 if dbmext is not None:
1282 self.add(dbmext)
1283 else:
1284 self.missing.append('_dbm')
1285
1286 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1287 if ('gdbm' in dbm_order and
1288 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1289 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1290 libraries=['gdbm']))
1291 else:
1292 self.missing.append('_gdbm')
1293
1294 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001295 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001296 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001297
1298 # We hunt for #define SQLITE_VERSION "n.n.n"
1299 # We need to find >= sqlite version 3.0.8
1300 sqlite_incdir = sqlite_libdir = None
1301 sqlite_inc_paths = [ '/usr/include',
1302 '/usr/include/sqlite',
1303 '/usr/include/sqlite3',
1304 '/usr/local/include',
1305 '/usr/local/include/sqlite',
1306 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001307 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001308 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001309 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001310 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1311 MIN_SQLITE_VERSION = ".".join([str(x)
1312 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001313
1314 # Scan the default include directories before the SQLite specific
1315 # ones. This allows one to override the copy of sqlite on OSX,
1316 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001317 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001318 sysroot = macosx_sdk_root()
1319
Victor Stinner625dbf22019-03-01 15:59:39 +01001320 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001321 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001322 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001323 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001324
Ned Deily9b635832012-08-05 15:13:33 -07001325 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001326 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001327 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001328 with open(f) as file:
1329 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001330 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001331 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001332 if m:
1333 sqlite_version = m.group(1)
1334 sqlite_version_tuple = tuple([int(x)
1335 for x in sqlite_version.split(".")])
1336 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1337 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001338 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001339 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001340 sqlite_incdir = d
1341 break
1342 else:
1343 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001344 print("%s: version %d is too old, need >= %s"%(d,
1345 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001346 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001347 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001348
1349 if sqlite_incdir:
1350 sqlite_dirs_to_check = [
1351 os.path.join(sqlite_incdir, '..', 'lib64'),
1352 os.path.join(sqlite_incdir, '..', 'lib'),
1353 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1354 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1355 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001356 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001357 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001358 if sqlite_libfile:
1359 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001360
1361 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001362 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001363 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001364 '_sqlite/cursor.c',
1365 '_sqlite/microprotocols.c',
1366 '_sqlite/module.c',
1367 '_sqlite/prepare_protocol.c',
1368 '_sqlite/row.c',
1369 '_sqlite/statement.c',
1370 '_sqlite/util.c', ]
1371
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001372 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001373 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001374 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1375 else:
1376 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1377
Benjamin Peterson076ed002010-10-31 17:11:02 +00001378 # Enable support for loadable extensions in the sqlite3 module
1379 # if --enable-loadable-sqlite-extensions configure option is used.
1380 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1381 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001382
Victor Stinner4cbea512019-02-28 17:48:38 +01001383 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001384 # In every directory on the search path search for a dynamic
1385 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001386 # for dynamic libraries on the entire path.
1387 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001388 # before the dynamic library in /usr/lib.
1389 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1390 else:
1391 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001392
Brett Cannonc5011fe2011-06-06 20:09:10 -07001393 include_dirs = ["Modules/_sqlite"]
1394 # Only include the directory where sqlite was found if it does
1395 # not already exist in set include directories, otherwise you
1396 # can end up with a bad search path order.
1397 if sqlite_incdir not in self.compiler.include_dirs:
1398 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001399 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001400 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001401 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001402 self.add(Extension('_sqlite3', sqlite_srcs,
1403 define_macros=sqlite_defines,
1404 include_dirs=include_dirs,
1405 library_dirs=sqlite_libdir,
1406 extra_link_args=sqlite_extra_link_args,
1407 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001408 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001409 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001410
Victor Stinner5ec33a12019-03-01 16:43:28 +01001411 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001412 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001413 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001414 if not VXWORKS:
1415 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001416 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001417 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001418 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001419 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001420 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001421
Victor Stinner5ec33a12019-03-01 16:43:28 +01001422 # Platform-specific libraries
1423 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1424 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001425 else:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001426 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001427
Victor Stinner5ec33a12019-03-01 16:43:28 +01001428 if MACOS:
1429 self.add(Extension('_scproxy', ['_scproxy.c'],
1430 extra_link_args=[
1431 '-framework', 'SystemConfiguration',
1432 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001433
Victor Stinner5ec33a12019-03-01 16:43:28 +01001434 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001435 # Andrew Kuchling's zlib module. Note that some versions of zlib
1436 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1437 # http://www.cert.org/advisories/CA-2002-07.html
1438 #
1439 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1440 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1441 # now, we still accept 1.1.3, because we think it's difficult to
1442 # exploit this in Python, and we'd rather make it RedHat's problem
1443 # than our problem <wink>.
1444 #
1445 # You can upgrade zlib to version 1.1.4 yourself by going to
1446 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001447 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001448 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001449 if zlib_inc is not None:
1450 zlib_h = zlib_inc[0] + '/zlib.h'
1451 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001452 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001453 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001454 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001455 with open(zlib_h) as fp:
1456 while 1:
1457 line = fp.readline()
1458 if not line:
1459 break
1460 if line.startswith('#define ZLIB_VERSION'):
1461 version = line.split()[2]
1462 break
Guido van Rossume6970912001-04-15 15:16:12 +00001463 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001464 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001465 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001466 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1467 else:
1468 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001469 self.add(Extension('zlib', ['zlibmodule.c'],
1470 libraries=['z'],
1471 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001472 have_zlib = True
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')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001477 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001478 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001479
Christian Heimes1dc54002008-03-24 02:19:29 +00001480 # Helper module for various ascii-encoders. Uses zlib for an optimized
1481 # crc32 if we have it. Otherwise binascii uses its own.
1482 if have_zlib:
1483 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1484 libraries = ['z']
1485 extra_link_args = zlib_extra_link_args
1486 else:
1487 extra_compile_args = []
1488 libraries = []
1489 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001490 self.add(Extension('binascii', ['binascii.c'],
1491 extra_compile_args=extra_compile_args,
1492 libraries=libraries,
1493 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001494
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001495 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001496 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001497 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001498 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1499 else:
1500 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001501 self.add(Extension('_bz2', ['_bz2module.c'],
1502 libraries=['bz2'],
1503 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001504 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001505 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001506
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001507 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001508 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001509 self.add(Extension('_lzma', ['_lzmamodule.c'],
1510 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001511 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001512 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001513
Victor Stinner5ec33a12019-03-01 16:43:28 +01001514 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001515 # Interface to the Expat XML parser
1516 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001517 # Expat was written by James Clark and is now maintained by a group of
1518 # developers on SourceForge; see www.libexpat.org for more information.
1519 # The pyexpat module was written by Paul Prescod after a prototype by
1520 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1521 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001522 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001523 #
1524 # More information on Expat can be found at www.libexpat.org.
1525 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001526 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1527 expat_inc = []
1528 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001529 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001530 expat_lib = ['expat']
1531 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001532 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001533 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001534 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001535 define_macros = [
1536 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001537 # bpo-30947: Python uses best available entropy sources to
1538 # call XML_SetHashSalt(), expat entropy sources are not needed
1539 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001540 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001541 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001542 expat_lib = []
1543 expat_sources = ['expat/xmlparse.c',
1544 'expat/xmlrole.c',
1545 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001546 expat_depends = ['expat/ascii.h',
1547 'expat/asciitab.h',
1548 'expat/expat.h',
1549 'expat/expat_config.h',
1550 'expat/expat_external.h',
1551 'expat/internal.h',
1552 'expat/latin1tab.h',
1553 'expat/utf8tab.h',
1554 'expat/xmlrole.h',
1555 'expat/xmltok.h',
1556 'expat/xmltok_impl.h'
1557 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001558
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001559 cc = sysconfig.get_config_var('CC').split()[0]
1560 ret = os.system(
1561 '"%s" -Werror -Wimplicit-fallthrough -E -xc /dev/null >/dev/null 2>&1' % cc)
1562 if ret >> 8 == 0:
1563 extra_compile_args.append('-Wno-implicit-fallthrough')
1564
Victor Stinner8058bda2019-03-01 15:31:45 +01001565 self.add(Extension('pyexpat',
1566 define_macros=define_macros,
1567 extra_compile_args=extra_compile_args,
1568 include_dirs=expat_inc,
1569 libraries=expat_lib,
1570 sources=['pyexpat.c'] + expat_sources,
1571 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001572
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001573 # Fredrik Lundh's cElementTree module. Note that this also
1574 # uses expat (via the CAPI hook in pyexpat).
1575
Victor Stinner625dbf22019-03-01 15:59:39 +01001576 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001577 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001578 self.add(Extension('_elementtree',
1579 define_macros=define_macros,
1580 include_dirs=expat_inc,
1581 libraries=expat_lib,
1582 sources=['_elementtree.c'],
1583 depends=['pyexpat.c', *expat_sources,
1584 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001585 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001586 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001587
Victor Stinner5ec33a12019-03-01 16:43:28 +01001588 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001589 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001590 self.add(Extension('_multibytecodec',
1591 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001592 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001593 self.add(Extension('_codecs_%s' % loc,
1594 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001595
Victor Stinner5ec33a12019-03-01 16:43:28 +01001596 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001597 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001598 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001599 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1600 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001601
1602 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001603 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001604 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1605 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001606 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001607 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1608 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001609 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001610 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001611 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1612 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001613 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001614 self.add(Extension('_posixshmem', posixshmem_srcs,
1615 define_macros={},
1616 libraries=libs,
1617 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001618
Victor Stinner8058bda2019-03-01 15:31:45 +01001619 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001620 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001621
Victor Stinner5ec33a12019-03-01 16:43:28 +01001622 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001623 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001624 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001625 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001626 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001627 uuid_libs = ['uuid']
1628 else:
1629 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001630 self.add(Extension('_uuid', ['_uuidmodule.c'],
1631 libraries=uuid_libs,
1632 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001633 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001634 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001635
Victor Stinner5ec33a12019-03-01 16:43:28 +01001636 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001637 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001638 self.init_inc_lib_dirs()
1639
1640 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001641 if TEST_EXTENSIONS:
1642 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001643 self.detect_readline_curses()
1644 self.detect_crypt()
1645 self.detect_socket()
1646 self.detect_openssl_hashlib()
1647 self.detect_dbm_gdbm()
1648 self.detect_sqlite()
1649 self.detect_platform_specific_exts()
1650 self.detect_nis()
1651 self.detect_compress_exts()
1652 self.detect_expat_elementtree()
1653 self.detect_multibytecodecs()
1654 self.detect_decimal()
1655 self.detect_ctypes()
1656 self.detect_multiprocessing()
1657 if not self.detect_tkinter():
1658 self.missing.append('_tkinter')
1659 self.detect_uuid()
1660
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001661## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001662## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001663
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001664 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001665 self.add(Extension('xxlimited', ['xxlimited.c'],
1666 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001667
Ned Deilyd819b932013-09-06 01:07:05 -07001668 def detect_tkinter_explicitly(self):
1669 # Build _tkinter using explicit locations for Tcl/Tk.
1670 #
1671 # This is enabled when both arguments are given to ./configure:
1672 #
1673 # --with-tcltk-includes="-I/path/to/tclincludes \
1674 # -I/path/to/tkincludes"
1675 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1676 # -L/path/to/tklibs -ltkm.n"
1677 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001678 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001679 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1680 #
1681 # This can be useful for building and testing tkinter with multiple
1682 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1683 # build of Tcl so you need to specify both arguments and use care when
1684 # overriding.
1685
1686 # The _TCLTK variables are created in the Makefile sharedmods target.
1687 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1688 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1689 if not (tcltk_includes and tcltk_libs):
1690 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001691 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001692
1693 extra_compile_args = tcltk_includes.split()
1694 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001695 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1696 define_macros=[('WITH_APPINIT', 1)],
1697 extra_compile_args = extra_compile_args,
1698 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001699 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001700
Victor Stinner625dbf22019-03-01 15:59:39 +01001701 def detect_tkinter_darwin(self):
Jack Jansen0b06be72002-06-21 14:48:38 +00001702 # The _tkinter module, using frameworks. Since frameworks are quite
1703 # different the UNIX search logic is not sharable.
1704 from os.path import join, exists
1705 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001706 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001707 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001708 join(os.getenv('HOME'), '/Library/Frameworks')
1709 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001710
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001711 sysroot = macosx_sdk_root()
1712
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001713 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001714 # bundles.
1715 # XXX distutils should support -F!
1716 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001717 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001718
1719
Jack Jansen0b06be72002-06-21 14:48:38 +00001720 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001721 if is_macosx_sdk_path(F):
1722 if not exists(join(sysroot, F[1:], fw + '.framework')):
1723 break
1724 else:
1725 if not exists(join(F, fw + '.framework')):
1726 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001727 else:
1728 # ok, F is now directory with both frameworks. Continure
1729 # building
1730 break
1731 else:
1732 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1733 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001734 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001735
Jack Jansen0b06be72002-06-21 14:48:38 +00001736 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1737 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001738 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001739 #
1740 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001741 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001742 for fw in ('Tcl', 'Tk')
1743 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001744 ]
1745
Tim Peters2c60f7a2003-01-29 03:49:43 +00001746 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001747 # complicated search, this is a hard-coded path. It could bail out
1748 # if X11 libs are not found...
1749 include_dirs.append('/usr/X11R6/include')
1750 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1751
Georg Brandlfcaf9102008-07-16 02:17:56 +00001752 # All existing framework builds of Tcl/Tk don't support 64-bit
1753 # architectures.
1754 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001755 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001756
Ronald Oussorend097efe2009-09-15 19:07:58 +00001757 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1758 if not os.path.exists(self.build_temp):
1759 os.makedirs(self.build_temp)
1760
1761 # Note: cannot use os.popen or subprocess here, that
1762 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001763 if is_macosx_sdk_path(F):
1764 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1765 else:
1766 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001767
Brett Cannon9f5db072010-10-29 20:19:27 +00001768 with open(tmpfile) as fp:
1769 detected_archs = []
1770 for ln in fp:
1771 a = ln.split()[-1]
1772 if a in archs:
1773 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001774 os.unlink(tmpfile)
1775
1776 for a in detected_archs:
1777 frameworks.append('-arch')
1778 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001779
Victor Stinnercfe172d2019-03-01 18:21:49 +01001780 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1781 define_macros=[('WITH_APPINIT', 1)],
1782 include_dirs=include_dirs,
1783 libraries=[],
1784 extra_compile_args=frameworks[2:],
1785 extra_link_args=frameworks))
Victor Stinner4cbea512019-02-28 17:48:38 +01001786 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001787
Victor Stinner625dbf22019-03-01 15:59:39 +01001788 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001789 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001790
Ned Deilyd819b932013-09-06 01:07:05 -07001791 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1792 # configured or passed into the make target. If so, use these values
1793 # to build tkinter and bypass the searches for Tcl and TK in standard
1794 # locations.
1795 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01001796 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001797
Jack Jansen0b06be72002-06-21 14:48:38 +00001798 # Rather than complicate the code below, detecting and building
1799 # AquaTk is a separate method. Only one Tkinter will be built on
1800 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01001801 if (MACOS and self.detect_tkinter_darwin()):
1802 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001803
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001804 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001805 # The versions with dots are used on Unix, and the versions without
1806 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001807 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001808 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1809 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01001810 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001811 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01001812 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001813 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001814 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001815 # Exit the loop when we've found the Tcl/Tk libraries
1816 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001817
Fredrik Lundhade711a2001-01-24 08:00:28 +00001818 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001819 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001820 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001821 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001822 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01001823 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001824 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1825 # but the include subdirs are named like .../include/tcl8.3.
1826 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1827 tcl_include_sub = []
1828 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001829 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001830 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1831 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1832 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01001833 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
1834 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001835
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001836 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001837 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001838 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01001839 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00001840
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001841 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001842
Victor Stinnercfe172d2019-03-01 18:21:49 +01001843 include_dirs = []
1844 libs = []
1845 defs = []
1846 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001847 for dir in tcl_includes + tk_includes:
1848 if dir not in include_dirs:
1849 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001850
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001851 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01001852 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001853 include_dirs.append('/usr/openwin/include')
1854 added_lib_dirs.append('/usr/openwin/lib')
1855 elif os.path.exists('/usr/X11R6/include'):
1856 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001857 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001858 added_lib_dirs.append('/usr/X11R6/lib')
1859 elif os.path.exists('/usr/X11R5/include'):
1860 include_dirs.append('/usr/X11R5/include')
1861 added_lib_dirs.append('/usr/X11R5/lib')
1862 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001863 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001864 include_dirs.append('/usr/X11/include')
1865 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001866
Jason Tishler9181c942003-02-05 15:16:17 +00001867 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01001868 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00001869 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1870 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001871 return False
Jason Tishler9181c942003-02-05 15:16:17 +00001872
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001873 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01001874 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001875 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001876 defs.append( ('WITH_BLT', 1) )
1877 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01001878 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001879 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001880 defs.append( ('WITH_BLT', 1) )
1881 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001882
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001883 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001884 libs.append('tk'+ version)
1885 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001886
Victor Stinner4cbea512019-02-28 17:48:38 +01001887 if HOST_PLATFORM in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001888 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001889
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001890 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01001891 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001892 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001893
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001894 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001895 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001896 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001897 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001898 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001899 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001900 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001901
Victor Stinnercfe172d2019-03-01 18:21:49 +01001902 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1903 define_macros=[('WITH_APPINIT', 1)] + defs,
1904 include_dirs=include_dirs,
1905 libraries=libs,
1906 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01001907 return True
1908
Christian Heimes78644762008-03-04 23:39:23 +00001909 def configure_ctypes_darwin(self, ext):
1910 # Darwin (OS X) uses preconfigured files, in
1911 # the Modules/_ctypes/libffi_osx directory.
Victor Stinner625dbf22019-03-01 15:59:39 +01001912 ffi_srcdir = os.path.abspath(os.path.join(self.srcdir, 'Modules',
Christian Heimes78644762008-03-04 23:39:23 +00001913 '_ctypes', 'libffi_osx'))
1914 sources = [os.path.join(ffi_srcdir, p)
1915 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001916 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001917 'x86/x86-darwin.S',
1918 'x86/x86-ffi_darwin.c',
1919 'x86/x86-ffi64.c',
1920 'powerpc/ppc-darwin.S',
1921 'powerpc/ppc-darwin_closure.S',
1922 'powerpc/ppc-ffi_darwin.c',
1923 'powerpc/ppc64-darwin_closure.S',
1924 ]]
1925
1926 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001927 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001928
1929 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1930 os.path.join(ffi_srcdir, 'powerpc')]
1931 ext.include_dirs.extend(include_dirs)
1932 ext.sources.extend(sources)
1933 return True
1934
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001935 def configure_ctypes(self, ext):
1936 if not self.use_system_libffi:
Victor Stinner4cbea512019-02-28 17:48:38 +01001937 if MACOS:
Christian Heimes78644762008-03-04 23:39:23 +00001938 return self.configure_ctypes_darwin(ext)
Zachary Waref40d4dd2016-09-17 01:25:24 -05001939 print('INFO: Could not locate ffi libs and/or headers')
1940 return False
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001941 return True
1942
Victor Stinner625dbf22019-03-01 15:59:39 +01001943 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001944 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001945 self.use_system_libffi = False
1946 include_dirs = []
1947 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001948 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001949 sources = ['_ctypes/_ctypes.c',
1950 '_ctypes/callbacks.c',
1951 '_ctypes/callproc.c',
1952 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001953 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001954 depends = ['_ctypes/ctypes.h']
1955
Victor Stinner4cbea512019-02-28 17:48:38 +01001956 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00001957 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001958 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001959 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001960 include_dirs.append('_ctypes/darwin')
Victor Stinner5ec33a12019-03-01 16:43:28 +01001961 # XXX Is this still needed?
1962 # extra_link_args.extend(['-read_only_relocs', 'warning'])
Thomas Hellercf567c12006-03-08 19:51:58 +00001963
Victor Stinner4cbea512019-02-28 17:48:38 +01001964 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001965 # XXX This shouldn't be necessary; it appears that some
1966 # of the assembler code is non-PIC (i.e. it has relocations
1967 # when it shouldn't. The proper fix would be to rewrite
1968 # the assembler code to be PIC.
1969 # This only works with GCC; the Sun compiler likely refuses
1970 # this option. If you want to compile ctypes with the Sun
1971 # compiler, please research a proper solution, instead of
1972 # finding some -z option for the Sun compiler.
1973 extra_link_args.append('-mimpure-text')
1974
Victor Stinner4cbea512019-02-28 17:48:38 +01001975 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001976 extra_link_args.append('-fPIC')
1977
Thomas Hellercf567c12006-03-08 19:51:58 +00001978 ext = Extension('_ctypes',
1979 include_dirs=include_dirs,
1980 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001981 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001982 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001983 sources=sources,
1984 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01001985 self.add(ext)
1986 if TEST_EXTENSIONS:
1987 # function my_sqrt() needs libm for sqrt()
1988 self.add(Extension('_ctypes_test',
1989 sources=['_ctypes/_ctypes_test.c'],
1990 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00001991
Victor Stinner625dbf22019-03-01 15:59:39 +01001992 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01001993 if MACOS:
Zachary Ware935043d2016-09-09 17:01:21 -07001994 if '--with-system-ffi' not in sysconfig.get_config_var("CONFIG_ARGS"):
1995 return
Christian Heimes78644762008-03-04 23:39:23 +00001996 # OS X 10.5 comes with libffi.dylib; the include files are
1997 # in /usr/include/ffi
Victor Stinner96d81582019-03-01 13:53:46 +01001998 ffi_inc_dirs.append('/usr/include/ffi')
Christian Heimes78644762008-03-04 23:39:23 +00001999
Benjamin Petersond78735d2010-01-01 16:04:23 +00002000 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00002001 if not ffi_inc or ffi_inc[0] == '':
Victor Stinner96d81582019-03-01 13:53:46 +01002002 ffi_inc = find_file('ffi.h', [], ffi_inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002003 if ffi_inc is not None:
2004 ffi_h = ffi_inc[0] + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002005 if not os.path.exists(ffi_h):
2006 ffi_inc = None
2007 print('Header file {} does not exist'.format(ffi_h))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002008 ffi_lib = None
2009 if ffi_inc is not None:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002010 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002011 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002012 ffi_lib = lib_name
2013 break
2014
2015 if ffi_inc and ffi_lib:
2016 ext.include_dirs.extend(ffi_inc)
2017 ext.libraries.append(ffi_lib)
2018 self.use_system_libffi = True
2019
Christian Heimes5bb96922018-02-25 10:22:14 +01002020 if sysconfig.get_config_var('HAVE_LIBDL'):
2021 # for dlopen, see bpo-32647
2022 ext.libraries.append('dl')
2023
Victor Stinner5ec33a12019-03-01 16:43:28 +01002024 def detect_decimal(self):
2025 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002026 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002027 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002028 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2029 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002030 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002031 sources = ['_decimal/_decimal.c']
2032 depends = ['_decimal/docstrings.h']
2033 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002034 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002035 'Modules',
2036 '_decimal',
2037 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002038 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002039 sources = [
2040 '_decimal/_decimal.c',
2041 '_decimal/libmpdec/basearith.c',
2042 '_decimal/libmpdec/constants.c',
2043 '_decimal/libmpdec/context.c',
2044 '_decimal/libmpdec/convolute.c',
2045 '_decimal/libmpdec/crt.c',
2046 '_decimal/libmpdec/difradix2.c',
2047 '_decimal/libmpdec/fnt.c',
2048 '_decimal/libmpdec/fourstep.c',
2049 '_decimal/libmpdec/io.c',
2050 '_decimal/libmpdec/memory.c',
2051 '_decimal/libmpdec/mpdecimal.c',
2052 '_decimal/libmpdec/numbertheory.c',
2053 '_decimal/libmpdec/sixstep.c',
2054 '_decimal/libmpdec/transpose.c',
2055 ]
2056 depends = [
2057 '_decimal/docstrings.h',
2058 '_decimal/libmpdec/basearith.h',
2059 '_decimal/libmpdec/bits.h',
2060 '_decimal/libmpdec/constants.h',
2061 '_decimal/libmpdec/convolute.h',
2062 '_decimal/libmpdec/crt.h',
2063 '_decimal/libmpdec/difradix2.h',
2064 '_decimal/libmpdec/fnt.h',
2065 '_decimal/libmpdec/fourstep.h',
2066 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002067 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002068 '_decimal/libmpdec/mpdecimal.h',
2069 '_decimal/libmpdec/numbertheory.h',
2070 '_decimal/libmpdec/sixstep.h',
2071 '_decimal/libmpdec/transpose.h',
2072 '_decimal/libmpdec/typearith.h',
2073 '_decimal/libmpdec/umodarith.h',
2074 ]
2075
Stefan Krah1919b7e2012-03-21 18:25:23 +01002076 config = {
2077 'x64': [('CONFIG_64','1'), ('ASM','1')],
2078 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2079 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2080 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2081 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2082 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2083 ('LEGACY_COMPILER','1')],
2084 'universal': [('UNIVERSAL','1')]
2085 }
2086
Stefan Krah1919b7e2012-03-21 18:25:23 +01002087 cc = sysconfig.get_config_var('CC')
2088 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2089 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2090
2091 if machine:
2092 # Override automatic configuration to facilitate testing.
2093 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002094 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002095 # Universal here means: build with the same options Python
2096 # was built with.
2097 define_macros = config['universal']
2098 elif sizeof_size_t == 8:
2099 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2100 define_macros = config['x64']
2101 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2102 define_macros = config['uint128']
2103 else:
2104 define_macros = config['ansi64']
2105 elif sizeof_size_t == 4:
2106 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2107 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002108 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002109 # solaris: problems with register allocation.
2110 # icc >= 11.0 works as well.
2111 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002112 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002113 else:
2114 define_macros = config['ansi32']
2115 else:
2116 raise DistutilsError("_decimal: unsupported architecture")
2117
2118 # Workarounds for toolchain bugs:
2119 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2120 # Some versions of gcc miscompile inline asm:
2121 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2122 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2123 extra_compile_args.append('-fno-ipa-pure-const')
2124 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2125 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2126 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2127 undef_macros.append('_FORTIFY_SOURCE')
2128
Stefan Krah1919b7e2012-03-21 18:25:23 +01002129 # Uncomment for extra functionality:
2130 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002131 self.add(Extension('_decimal',
2132 include_dirs=include_dirs,
2133 libraries=libraries,
2134 define_macros=define_macros,
2135 undef_macros=undef_macros,
2136 extra_compile_args=extra_compile_args,
2137 sources=sources,
2138 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002139
Victor Stinner5ec33a12019-03-01 16:43:28 +01002140 def detect_openssl_hashlib(self):
2141 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002142 config_vars = sysconfig.get_config_vars()
2143
2144 def split_var(name, sep):
2145 # poor man's shlex, the re module is not available yet.
2146 value = config_vars.get(name)
2147 if not value:
2148 return ()
2149 # This trick works because ax_check_openssl uses --libs-only-L,
2150 # --libs-only-l, and --cflags-only-I.
2151 value = ' ' + value
2152 sep = ' ' + sep
2153 return [v.strip() for v in value.split(sep) if v.strip()]
2154
2155 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2156 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2157 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2158 if not openssl_libs:
2159 # libssl and libcrypto not found
2160 return None, None
2161
2162 # Find OpenSSL includes
2163 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002164 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002165 )
2166 if ssl_incs is None:
2167 return None, None
2168
2169 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2170 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002171 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002172 ['/usr/kerberos/include']
2173 )
2174 if krb5_h:
2175 ssl_incs.extend(krb5_h)
2176
Christian Heimes61d478c2018-01-27 15:51:38 +01002177 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Victor Stinner8058bda2019-03-01 15:31:45 +01002178 self.add(Extension('_ssl', ['_ssl.c'],
2179 include_dirs=openssl_includes,
2180 library_dirs=openssl_libdirs,
2181 libraries=openssl_libs,
2182 depends=['socketmodule.h']))
Christian Heimes61d478c2018-01-27 15:51:38 +01002183 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002184 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002185
Victor Stinner8058bda2019-03-01 15:31:45 +01002186 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2187 depends=['hashlib.h'],
2188 include_dirs=openssl_includes,
2189 library_dirs=openssl_libdirs,
2190 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002191
Victor Stinner5ec33a12019-03-01 16:43:28 +01002192 # We always compile these even when OpenSSL is available (issue #14693).
2193 # It's harmless and the object code is tiny (40-50 KiB per module,
2194 # only loaded when actually used).
2195 self.add(Extension('_sha256', ['sha256module.c'],
2196 depends=['hashlib.h']))
2197 self.add(Extension('_sha512', ['sha512module.c'],
2198 depends=['hashlib.h']))
2199 self.add(Extension('_md5', ['md5module.c'],
2200 depends=['hashlib.h']))
2201 self.add(Extension('_sha1', ['sha1module.c'],
2202 depends=['hashlib.h']))
2203
2204 blake2_deps = glob(os.path.join(self.srcdir,
2205 'Modules/_blake2/impl/*'))
2206 blake2_deps.append('hashlib.h')
2207
2208 self.add(Extension('_blake2',
2209 ['_blake2/blake2module.c',
2210 '_blake2/blake2b_impl.c',
2211 '_blake2/blake2s_impl.c'],
2212 depends=blake2_deps))
2213
2214 sha3_deps = glob(os.path.join(self.srcdir,
2215 'Modules/_sha3/kcp/*'))
2216 sha3_deps.append('hashlib.h')
2217 self.add(Extension('_sha3',
2218 ['_sha3/sha3module.c'],
2219 depends=sha3_deps))
2220
2221 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002222 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002223 self.missing.append('nis')
2224 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002225
2226 libs = []
2227 library_dirs = []
2228 includes_dirs = []
2229
2230 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2231 # moved headers and libraries to libtirpc and libnsl. The headers
2232 # are in tircp and nsl sub directories.
2233 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002234 'rpcsvc/yp_prot.h', self.inc_dirs,
2235 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002236 )
2237 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002238 'rpc/rpc.h', self.inc_dirs,
2239 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002240 )
2241 if rpcsvc_inc is None or rpc_inc is None:
2242 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002243 self.missing.append('nis')
2244 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002245 includes_dirs.extend(rpcsvc_inc)
2246 includes_dirs.extend(rpc_inc)
2247
Victor Stinner625dbf22019-03-01 15:59:39 +01002248 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002249 libs.append('nsl')
2250 else:
2251 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002252 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002253 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2254 if libnsl is not None:
2255 library_dirs.append(os.path.dirname(libnsl))
2256 libs.append('nsl')
2257
Victor Stinner625dbf22019-03-01 15:59:39 +01002258 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002259 libs.append('tirpc')
2260
Victor Stinner8058bda2019-03-01 15:31:45 +01002261 self.add(Extension('nis', ['nismodule.c'],
2262 libraries=libs,
2263 library_dirs=library_dirs,
2264 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002265
Christian Heimesff5be6e2018-01-20 13:19:21 +01002266
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002267class PyBuildInstall(install):
2268 # Suppress the warning about installation into the lib_dynload
2269 # directory, which is not in sys.path when running Python during
2270 # installation:
2271 def initialize_options (self):
2272 install.initialize_options(self)
2273 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002274
Éric Araujoe6792c12011-06-09 14:07:02 +02002275 # Customize subcommands to not install an egg-info file for Python
2276 sub_commands = [('install_lib', install.has_lib),
2277 ('install_headers', install.has_headers),
2278 ('install_scripts', install.has_scripts),
2279 ('install_data', install.has_data)]
2280
2281
Michael W. Hudson529a5052002-12-17 16:47:17 +00002282class PyBuildInstallLib(install_lib):
2283 # Do exactly what install_lib does but make sure correct access modes get
2284 # set on installed directories and files. All installed files with get
2285 # mode 644 unless they are a shared library in which case they will get
2286 # mode 755. All installed directories will get mode 755.
2287
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002288 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2289 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002290
2291 def install(self):
2292 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002293 self.set_file_modes(outfiles, 0o644, 0o755)
2294 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002295 return outfiles
2296
2297 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002298 if not files: return
2299
2300 for filename in files:
2301 if os.path.islink(filename): continue
2302 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002303 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002304 log.info("changing mode of %s to %o", filename, mode)
2305 if not self.dry_run: os.chmod(filename, mode)
2306
2307 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002308 for dirpath, dirnames, fnames in os.walk(dirname):
2309 if os.path.islink(dirpath):
2310 continue
2311 log.info("changing mode of %s to %o", dirpath, mode)
2312 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002313
Victor Stinnerc991f242019-03-01 17:19:04 +01002314
Georg Brandlff52f762010-12-28 09:51:43 +00002315class PyBuildScripts(build_scripts):
2316 def copy_scripts(self):
2317 outfiles, updated_files = build_scripts.copy_scripts(self)
2318 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2319 minoronly = '.{0[1]}'.format(sys.version_info)
2320 newoutfiles = []
2321 newupdated_files = []
2322 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002323 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002324 newfilename = filename + fullversion
2325 else:
2326 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002327 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002328 os.rename(filename, newfilename)
2329 newoutfiles.append(newfilename)
2330 if filename in updated_files:
2331 newupdated_files.append(newfilename)
2332 return newoutfiles, newupdated_files
2333
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002334
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002335def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002336 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2337 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2338
2339 class DummyProcess:
2340 """Hack for parallel build"""
2341 ProcessPoolExecutor = None
2342
2343 sys.modules['concurrent.futures.process'] = DummyProcess
2344
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002345 # turn off warnings when deprecated modules are imported
2346 import warnings
2347 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002348 setup(# PyPI Metadata (PEP 301)
2349 name = "Python",
2350 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002351 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002352 maintainer = "Guido van Rossum and the Python community",
2353 maintainer_email = "python-dev@python.org",
2354 description = "A high-level object-oriented programming language",
2355 long_description = SUMMARY.strip(),
2356 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002357 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002358 platforms = ["Many"],
2359
2360 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002361 cmdclass = {'build_ext': PyBuildExt,
2362 'build_scripts': PyBuildScripts,
2363 'install': PyBuildInstall,
2364 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002365 # The struct module is defined here, because build_ext won't be
2366 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002367 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002368
Georg Brandlff52f762010-12-28 09:51:43 +00002369 # If you change the scripts installed here, you also need to
2370 # check the PyBuildScripts command above, and change the links
2371 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002372 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002373 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002374 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002375
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002376# --install-platlib
2377if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002378 main()