blob: ca5a04d2ae0d7f748c232cff433577bb8133b081 [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
Serhiy Storchaka93558682020-06-20 11:10:31 +030011from glob import glob, escape
Ronald Oussoren404a7192020-11-22 06:14:25 +010012import _osx_support
Michael W. Hudson529a5052002-12-17 16:47:17 +000013
Victor Stinner1ec63b62020-03-04 14:50:19 +010014
15try:
16 import subprocess
17 del subprocess
18 SUBPROCESS_BOOTSTRAP = False
19except ImportError:
Victor Stinner1ec63b62020-03-04 14:50:19 +010020 # Bootstrap Python: distutils.spawn uses subprocess to build C extensions,
21 # subprocess requires C extensions built by setup.py like _posixsubprocess.
22 #
Victor Stinneraddaaaa2020-03-09 23:45:59 +010023 # Use _bootsubprocess which only uses the os module.
Victor Stinner1ec63b62020-03-04 14:50:19 +010024 #
25 # It is dropped from sys.modules as soon as all C extension modules
26 # are built.
Victor Stinneraddaaaa2020-03-09 23:45:59 +010027 import _bootsubprocess
28 sys.modules['subprocess'] = _bootsubprocess
29 del _bootsubprocess
30 SUBPROCESS_BOOTSTRAP = True
Victor Stinner1ec63b62020-03-04 14:50:19 +010031
32
Michael W. Hudson529a5052002-12-17 16:47:17 +000033from distutils import log
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000034from distutils.command.build_ext import build_ext
Victor Stinner625dbf22019-03-01 15:59:39 +010035from distutils.command.build_scripts import build_scripts
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000036from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000037from distutils.command.install_lib import install_lib
Victor Stinner625dbf22019-03-01 15:59:39 +010038from distutils.core import Extension, setup
39from distutils.errors import CCompilerError, DistutilsError
Stefan Krah095b2732010-06-08 13:41:44 +000040from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000041
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020042
Victor Stinnercfe172d2019-03-01 18:21:49 +010043# Compile extensions used to test Python?
44TEST_EXTENSIONS = True
45
46# This global variable is used to hold the list of modules to be disabled.
47DISABLED_MODULE_LIST = []
48
49
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020050def get_platform():
Victor Stinnerc991f242019-03-01 17:19:04 +010051 # Cross compiling
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020052 if "_PYTHON_HOST_PLATFORM" in os.environ:
53 return os.environ["_PYTHON_HOST_PLATFORM"]
Victor Stinnerc991f242019-03-01 17:19:04 +010054
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020055 # Get value of sys.platform
56 if sys.platform.startswith('osf1'):
57 return 'osf1'
58 return sys.platform
Victor Stinnerc991f242019-03-01 17:19:04 +010059
60
61CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ)
Victor Stinner4cbea512019-02-28 17:48:38 +010062HOST_PLATFORM = get_platform()
63MS_WINDOWS = (HOST_PLATFORM == 'win32')
64CYGWIN = (HOST_PLATFORM == 'cygwin')
65MACOS = (HOST_PLATFORM == 'darwin')
Michael Felt08970cb2019-06-21 15:58:00 +020066AIX = (HOST_PLATFORM.startswith('aix'))
Victor Stinner4cbea512019-02-28 17:48:38 +010067VXWORKS = ('vxworks' in HOST_PLATFORM)
pxinwr32f5fdd2019-02-27 19:09:28 +080068
Victor Stinnerc991f242019-03-01 17:19:04 +010069
70SUMMARY = """
71Python is an interpreted, interactive, object-oriented programming
72language. It is often compared to Tcl, Perl, Scheme or Java.
73
74Python combines remarkable power with very clear syntax. It has
75modules, classes, exceptions, very high level dynamic data types, and
76dynamic typing. There are interfaces to many system calls and
77libraries, as well as to various windowing systems (X11, Motif, Tk,
78Mac, MFC). New built-in modules are easily written in C or C++. Python
79is also usable as an extension language for applications that need a
80programmable interface.
81
82The Python implementation is portable: it runs on many brands of UNIX,
83on Windows, DOS, Mac, Amiga... If your favorite system isn't
84listed here, it may still be supported, if there's a C compiler for
85it. Ask around on comp.lang.python -- or just try compiling Python
86yourself.
87"""
88
89CLASSIFIERS = """
90Development Status :: 6 - Mature
91License :: OSI Approved :: Python Software Foundation License
92Natural Language :: English
93Programming Language :: C
94Programming Language :: Python
95Topic :: Software Development
96"""
97
98
Victor Stinner6b982c22020-04-01 01:10:07 +020099def run_command(cmd):
100 status = os.system(cmd)
Victor Stinner65a796e2020-04-01 18:49:29 +0200101 return os.waitstatus_to_exitcode(status)
Victor Stinner6b982c22020-04-01 01:10:07 +0200102
103
Victor Stinnerc991f242019-03-01 17:19:04 +0100104# Set common compiler and linker flags derived from the Makefile,
105# reserved for building the interpreter and the stdlib modules.
106# See bpo-21121 and bpo-35257
107def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
108 flags = sysconfig.get_config_var(compiler_flags)
109 py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
110 sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
111
112
Michael W. Hudson39230b32002-01-16 15:26:48 +0000113def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000114 """Add the directory 'dir' to the list 'dirlist' (after any relative
115 directories) if:
116
Michael W. Hudson39230b32002-01-16 15:26:48 +0000117 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000118 2) 'dir' actually exists, and is a directory.
119 """
120 if dir is None or not os.path.isdir(dir) or dir in dirlist:
121 return
122 for i, path in enumerate(dirlist):
123 if not os.path.isabs(path):
124 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +0000125 return
126 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +0000127
Victor Stinnerc991f242019-03-01 17:19:04 +0100128
xdegaye77f51392017-11-25 17:25:30 +0100129def sysroot_paths(make_vars, subdirs):
130 """Get the paths of sysroot sub-directories.
131
132 * make_vars: a sequence of names of variables of the Makefile where
133 sysroot may be set.
134 * subdirs: a sequence of names of subdirectories used as the location for
135 headers or libraries.
136 """
137
138 dirs = []
139 for var_name in make_vars:
140 var = sysconfig.get_config_var(var_name)
141 if var is not None:
142 m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
143 if m is not None:
144 sysroot = m.group(1).strip('"')
145 for subdir in subdirs:
146 if os.path.isabs(subdir):
147 subdir = subdir[1:]
148 path = os.path.join(sysroot, subdir)
149 if os.path.isdir(path):
150 dirs.append(path)
151 break
152 return dirs
153
Ned Deily1731d6d2020-05-18 04:32:38 -0400154
Ned Deily0288dd62019-06-03 06:34:48 -0400155MACOS_SDK_ROOT = None
Ned Deily1731d6d2020-05-18 04:32:38 -0400156MACOS_SDK_SPECIFIED = None
Victor Stinnerc991f242019-03-01 17:19:04 +0100157
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000158def macosx_sdk_root():
Ned Deily0288dd62019-06-03 06:34:48 -0400159 """Return the directory of the current macOS SDK.
160
161 If no SDK was explicitly configured, call the compiler to find which
162 include files paths are being searched by default. Use '/' if the
163 compiler is searching /usr/include (meaning system header files are
164 installed) or use the root of an SDK if that is being searched.
165 (The SDK may be supplied via Xcode or via the Command Line Tools).
166 The SDK paths used by Apple-supplied tool chains depend on the
167 setting of various variables; see the xcrun man page for more info.
Ned Deily1731d6d2020-05-18 04:32:38 -0400168 Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified().
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000169 """
Ned Deily1731d6d2020-05-18 04:32:38 -0400170 global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED
Ned Deily0288dd62019-06-03 06:34:48 -0400171
172 # If already called, return cached result.
173 if MACOS_SDK_ROOT:
174 return MACOS_SDK_ROOT
175
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000176 cflags = sysconfig.get_config_var('CFLAGS')
Joshua Rootb3107002020-04-22 17:44:10 +1000177 m = re.search(r'-isysroot\s*(\S+)', cflags)
Ned Deily0288dd62019-06-03 06:34:48 -0400178 if m is not None:
179 MACOS_SDK_ROOT = m.group(1)
Ned Deily29afab62020-12-04 23:02:09 -0500180 MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000181 else:
Ronald Oussoren404a7192020-11-22 06:14:25 +0100182 MACOS_SDK_ROOT = _osx_support._default_sysroot(
183 sysconfig.get_config_var('CC'))
Ned Deily29afab62020-12-04 23:02:09 -0500184 MACOS_SDK_SPECIFIED = False
Ned Deily0288dd62019-06-03 06:34:48 -0400185
186 return MACOS_SDK_ROOT
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000187
Victor Stinnerc991f242019-03-01 17:19:04 +0100188
Ned Deily1731d6d2020-05-18 04:32:38 -0400189def macosx_sdk_specified():
190 """Returns true if an SDK was explicitly configured.
191
192 True if an SDK was selected at configure time, either by specifying
193 --enable-universalsdk=(something other than no or /) or by adding a
194 -isysroot option to CFLAGS. In some cases, like when making
195 decisions about macOS Tk framework paths, we need to be able to
196 know whether the user explicitly asked to build with an SDK versus
197 the implicit use of an SDK when header files are no longer
198 installed on a running system by the Command Line Tools.
199 """
200 global MACOS_SDK_SPECIFIED
201
202 # If already called, return cached result.
203 if MACOS_SDK_SPECIFIED:
204 return MACOS_SDK_SPECIFIED
205
206 # Find the sdk root and set MACOS_SDK_SPECIFIED
207 macosx_sdk_root()
208 return MACOS_SDK_SPECIFIED
209
210
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000211def is_macosx_sdk_path(path):
212 """
213 Returns True if 'path' can be located in an OSX SDK
214 """
Ned Deily2910a7b2012-07-30 02:35:58 -0700215 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
216 or path.startswith('/System/')
217 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000218
Victor Stinnerc991f242019-03-01 17:19:04 +0100219
Ronald Oussoren41761932020-11-08 10:05:27 +0100220def grep_headers_for(function, headers):
221 for header in headers:
Ronald Oussoren7a27c7e2020-11-14 16:07:47 +0100222 with open(header, 'r', errors='surrogateescape') as f:
Ronald Oussoren41761932020-11-08 10:05:27 +0100223 if function in f.read():
224 return True
225 return False
226
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000227def find_file(filename, std_dirs, paths):
228 """Searches for the directory where a given file is located,
229 and returns a possibly-empty list of additional directories, or None
230 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +0000231
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000232 'filename' is the name of a file, such as readline.h or libcrypto.a.
233 'std_dirs' is the list of standard system directories; if the
234 file is found in one of them, no additional directives are needed.
235 'paths' is a list of additional locations to check; if the file is
236 found in one of them, the resulting list will contain the directory.
237 """
Victor Stinner4cbea512019-02-28 17:48:38 +0100238 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000239 # Honor the MacOSX SDK setting when one was specified.
240 # An SDK is a directory with the same structure as a real
241 # system, but with only header files and libraries.
242 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000243
244 # Check the standard locations
245 for dir in std_dirs:
246 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000247
Victor Stinner4cbea512019-02-28 17:48:38 +0100248 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000249 f = os.path.join(sysroot, dir[1:], filename)
250
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000251 if os.path.exists(f): return []
252
253 # Check the additional directories
254 for dir in paths:
255 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000256
Victor Stinner4cbea512019-02-28 17:48:38 +0100257 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000258 f = os.path.join(sysroot, dir[1:], filename)
259
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000260 if os.path.exists(f):
261 return [dir]
262
263 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000264 return None
265
Victor Stinnerc991f242019-03-01 17:19:04 +0100266
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000267def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000268 result = compiler.find_library_file(std_dirs + paths, libname)
269 if result is None:
270 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000271
Victor Stinner4cbea512019-02-28 17:48:38 +0100272 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000273 sysroot = macosx_sdk_root()
274
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000275 # Check whether the found file is in one of the standard directories
276 dirname = os.path.dirname(result)
277 for p in std_dirs:
278 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000279 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000280
Victor Stinner4cbea512019-02-28 17:48:38 +0100281 if MACOS and is_macosx_sdk_path(p):
Ned Deily020250f2016-02-25 00:56:38 +1100282 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
283 # libraries with .tbd extensions rather than the normal .dylib
284 # shared libraries installed in /. The Apple compiler tool
285 # chain handles this transparently but it can cause problems
286 # for programs that are being built with an SDK and searching
287 # for specific libraries. Distutils find_library_file() now
288 # knows to also search for and return .tbd files. But callers
289 # of find_library_file need to keep in mind that the base filename
290 # of the returned SDK library file might have a different extension
291 # from that of the library file installed on the running system,
292 # for example:
293 # /Applications/Xcode.app/Contents/Developer/Platforms/
294 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
295 # usr/lib/libedit.tbd
296 # vs
297 # /usr/lib/libedit.dylib
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000298 if os.path.join(sysroot, p[1:]) == dirname:
299 return [ ]
300
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000301 if p == dirname:
302 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000303
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000304 # Otherwise, it must have been in one of the additional directories,
305 # so we have to figure out which one.
306 for p in paths:
307 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000308 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000309
Victor Stinner4cbea512019-02-28 17:48:38 +0100310 if MACOS and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000311 if os.path.join(sysroot, p[1:]) == dirname:
312 return [ p ]
313
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000314 if p == dirname:
315 return [p]
316 else:
317 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000318
Paul Ganssle62972d92020-05-16 04:20:06 -0400319def validate_tzpath():
320 base_tzpath = sysconfig.get_config_var('TZPATH')
321 if not base_tzpath:
322 return
323
324 tzpaths = base_tzpath.split(os.pathsep)
325 bad_paths = [tzpath for tzpath in tzpaths if not os.path.isabs(tzpath)]
326 if bad_paths:
327 raise ValueError('TZPATH must contain only absolute paths, '
328 + f'found:\n{tzpaths!r}\nwith invalid paths:\n'
329 + f'{bad_paths!r}')
Victor Stinnerc991f242019-03-01 17:19:04 +0100330
Jack Jansen144ebcc2001-08-05 22:31:19 +0000331def find_module_file(module, dirlist):
332 """Find a module in a set of possible folders. If it is not found
333 return the unadorned filename"""
334 list = find_file(module, [], dirlist)
335 if not list:
336 return module
337 if len(list) > 1:
Vinay Sajipdd917f82016-08-31 08:22:29 +0100338 log.info("WARNING: multiple copies of %s found", module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000339 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000340
Victor Stinnerc991f242019-03-01 17:19:04 +0100341
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000342class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000343
Guido van Rossumd8faa362007-04-27 19:54:29 +0000344 def __init__(self, dist):
345 build_ext.__init__(self, dist)
Victor Stinner625dbf22019-03-01 15:59:39 +0100346 self.srcdir = None
347 self.lib_dirs = None
348 self.inc_dirs = None
Victor Stinner5ec33a12019-03-01 16:43:28 +0100349 self.config_h_vars = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000350 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400351 self.failed_on_import = []
Victor Stinner8058bda2019-03-01 15:31:45 +0100352 self.missing = []
Christian Heimes9b60e552020-05-15 23:54:53 +0200353 self.disabled_configure = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200354 if '-j' in os.environ.get('MAKEFLAGS', ''):
355 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000356
Victor Stinner8058bda2019-03-01 15:31:45 +0100357 def add(self, ext):
358 self.extensions.append(ext)
359
Victor Stinner00c77ae2020-03-04 18:44:49 +0100360 def set_srcdir(self):
Victor Stinner625dbf22019-03-01 15:59:39 +0100361 self.srcdir = sysconfig.get_config_var('srcdir')
362 if not self.srcdir:
363 # Maybe running on Windows but not using CYGWIN?
364 raise ValueError("No source directory; cannot proceed.")
365 self.srcdir = os.path.abspath(self.srcdir)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000366
Victor Stinner00c77ae2020-03-04 18:44:49 +0100367 def remove_disabled(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000368 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000369 extensions = [ext for ext in self.extensions
Victor Stinner4cbea512019-02-28 17:48:38 +0100370 if ext.name not in DISABLED_MODULE_LIST]
Christian Heimes679db4a2008-01-18 09:56:22 +0000371 # move ctypes to the end, it depends on other modules
372 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
373 if "_ctypes" in ext_map:
374 ctypes = extensions.pop(ext_map["_ctypes"])
375 extensions.append(ctypes)
376 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000377
Victor Stinner00c77ae2020-03-04 18:44:49 +0100378 def update_sources_depends(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000379 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000380 # with Modules/.
Victor Stinner625dbf22019-03-01 15:59:39 +0100381 moddirlist = [os.path.join(self.srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000382
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000383 # Fix up the paths for scripts, too
Victor Stinner625dbf22019-03-01 15:59:39 +0100384 self.distribution.scripts = [os.path.join(self.srcdir, filename)
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000385 for filename in self.distribution.scripts]
386
Christian Heimesaf98da12008-01-27 15:18:18 +0000387 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000388 headers = [sysconfig.get_config_h_filename()]
Serhiy Storchaka93558682020-06-20 11:10:31 +0300389 headers += glob(os.path.join(escape(sysconfig.get_path('include')), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000390
Xavier de Gaye84968b72016-10-29 16:57:20 +0200391 for ext in self.extensions:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000392 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000393 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000394 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000395 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000396 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000397 else:
398 ext.depends = []
399 # re-compile extensions if a header file has been changed
400 ext.depends.extend(headers)
401
Victor Stinner00c77ae2020-03-04 18:44:49 +0100402 def remove_configured_extensions(self):
403 # The sysconfig variables built by makesetup that list the already
404 # built modules and the disabled modules as configured by the Setup
405 # files.
406 sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
407 sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
408
409 mods_built = []
410 mods_disabled = []
411 for ext in self.extensions:
xdegayec0364fc2017-05-27 18:25:03 +0200412 # If a module has already been built or has been disabled in the
413 # Setup files, don't build it here.
414 if ext.name in sysconf_built:
415 mods_built.append(ext)
416 if ext.name in sysconf_dis:
417 mods_disabled.append(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000418
xdegayec0364fc2017-05-27 18:25:03 +0200419 mods_configured = mods_built + mods_disabled
420 if mods_configured:
Xavier de Gaye84968b72016-10-29 16:57:20 +0200421 self.extensions = [x for x in self.extensions if x not in
xdegayec0364fc2017-05-27 18:25:03 +0200422 mods_configured]
423 # Remove the shared libraries built by a previous build.
424 for ext in mods_configured:
425 fullpath = self.get_ext_fullpath(ext.name)
426 if os.path.exists(fullpath):
427 os.unlink(fullpath)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000428
Victor Stinner00c77ae2020-03-04 18:44:49 +0100429 return (mods_built, mods_disabled)
430
431 def set_compiler_executables(self):
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000432 # When you run "make CC=altcc" or something similar, you really want
433 # those environment variables passed into the setup.py phase. Here's
434 # a small set of useful ones.
435 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000436 args = {}
437 # unfortunately, distutils doesn't let us provide separate C and C++
438 # compilers
439 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000440 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
441 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000442 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000443
Victor Stinner00c77ae2020-03-04 18:44:49 +0100444 def build_extensions(self):
445 self.set_srcdir()
446
447 # Detect which modules should be compiled
448 self.detect_modules()
449
450 self.remove_disabled()
451
452 self.update_sources_depends()
453 mods_built, mods_disabled = self.remove_configured_extensions()
454 self.set_compiler_executables()
455
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000456 build_ext.build_extensions(self)
457
Victor Stinner1ec63b62020-03-04 14:50:19 +0100458 if SUBPROCESS_BOOTSTRAP:
459 # Drop our custom subprocess module:
460 # use the newly built subprocess module
461 del sys.modules['subprocess']
462
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200463 for ext in self.extensions:
464 self.check_extension_import(ext)
465
Victor Stinner00c77ae2020-03-04 18:44:49 +0100466 self.summary(mods_built, mods_disabled)
467
468 def summary(self, mods_built, mods_disabled):
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300469 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400470 if self.failed or self.failed_on_import:
471 all_failed = self.failed + self.failed_on_import
472 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000473
474 def print_three_column(lst):
475 lst.sort(key=str.lower)
476 # guarantee zip() doesn't drop anything
477 while len(lst) % 3:
478 lst.append("")
479 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
480 print("%-*s %-*s %-*s" % (longest, e, longest, f,
481 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000482
Victor Stinner8058bda2019-03-01 15:31:45 +0100483 if self.missing:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400485 print("Python build finished successfully!")
486 print("The necessary bits to build these optional modules were not "
487 "found:")
Victor Stinner8058bda2019-03-01 15:31:45 +0100488 print_three_column(self.missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000489 print("To find the necessary bits, look in setup.py in"
490 " detect_modules() for the module's name.")
491 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000492
xdegayec0364fc2017-05-27 18:25:03 +0200493 if mods_built:
494 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200495 print("The following modules found by detect_modules() in"
496 " setup.py, have been")
497 print("built by the Makefile instead, as configured by the"
498 " Setup files:")
xdegayec0364fc2017-05-27 18:25:03 +0200499 print_three_column([ext.name for ext in mods_built])
500 print()
501
502 if mods_disabled:
503 print()
504 print("The following modules found by detect_modules() in"
505 " setup.py have not")
506 print("been built, they are *disabled* in the Setup files:")
507 print_three_column([ext.name for ext in mods_disabled])
508 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200509
Christian Heimes9b60e552020-05-15 23:54:53 +0200510 if self.disabled_configure:
511 print()
512 print("The following modules found by detect_modules() in"
513 " setup.py have not")
514 print("been built, they are *disabled* by configure:")
515 print_three_column(self.disabled_configure)
516 print()
517
Guido van Rossumd8faa362007-04-27 19:54:29 +0000518 if self.failed:
519 failed = self.failed[:]
520 print()
521 print("Failed to build these modules:")
522 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000523 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000524
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400525 if self.failed_on_import:
526 failed = self.failed_on_import[:]
527 print()
528 print("Following modules built successfully"
529 " but were removed because they could not be imported:")
530 print_three_column(failed)
531 print()
532
Christian Heimes61d478c2018-01-27 15:51:38 +0100533 if any('_ssl' in l
Victor Stinner8058bda2019-03-01 15:31:45 +0100534 for l in (self.missing, self.failed, self.failed_on_import)):
Christian Heimes61d478c2018-01-27 15:51:38 +0100535 print()
536 print("Could not build the ssl module!")
537 print("Python requires an OpenSSL 1.0.2 or 1.1 compatible "
538 "libssl with X509_VERIFY_PARAM_set1_host().")
539 print("LibreSSL 2.6.4 and earlier do not provide the necessary "
540 "APIs, https://github.com/libressl-portable/portable/issues/381")
541 print()
542
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000543 def build_extension(self, ext):
544
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000545 if ext.name == '_ctypes':
546 if not self.configure_ctypes(ext):
Zachary Waref40d4dd2016-09-17 01:25:24 -0500547 self.failed.append(ext.name)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000548 return
549
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000550 try:
551 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000552 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000553 self.announce('WARNING: building of extension "%s" failed: %s' %
Victor Stinner625dbf22019-03-01 15:59:39 +0100554 (ext.name, why))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000555 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000556 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200557
558 def check_extension_import(self, ext):
559 # Don't try to import an extension that has failed to compile
560 if ext.name in self.failed:
561 self.announce(
562 'WARNING: skipping import check for failed build "%s"' %
563 ext.name, level=1)
564 return
565
Jack Jansenf49c6f92001-11-01 14:44:15 +0000566 # Workaround for Mac OS X: The Carbon-based modules cannot be
567 # reliably imported into a command-line Python
568 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000569 self.announce(
570 'WARNING: skipping import check for Carbon-based "%s"' %
571 ext.name)
572 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000573
Victor Stinner4cbea512019-02-28 17:48:38 +0100574 if MACOS and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000575 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000576 # Don't bother doing an import check when an extension was
577 # build with an explicit '-arch' flag on OSX. That's currently
578 # only used to build 32-bit only extensions in a 4-way
579 # universal build and loading 32-bit code into a 64-bit
580 # process will fail.
581 self.announce(
582 'WARNING: skipping import check for "%s"' %
583 ext.name)
584 return
585
Jason Tishler24cf7762002-05-22 16:46:15 +0000586 # Workaround for Cygwin: Cygwin currently has fork issues when many
587 # modules have been imported
Victor Stinner4cbea512019-02-28 17:48:38 +0100588 if CYGWIN:
Jason Tishler24cf7762002-05-22 16:46:15 +0000589 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
590 % ext.name)
591 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000592 ext_filename = os.path.join(
593 self.build_lib,
594 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000595
596 # If the build directory didn't exist when setup.py was
597 # started, sys.path_importer_cache has a negative result
598 # cached. Clear that cache before trying to import.
599 sys.path_importer_cache.clear()
600
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200601 # Don't try to load extensions for cross builds
Victor Stinner4cbea512019-02-28 17:48:38 +0100602 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200603 return
604
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400605 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700606 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
607 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000608 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400609 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000610 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400611 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000612 self.announce('*** WARNING: renaming "%s" since importing it'
613 ' failed: %s' % (ext.name, why), level=3)
614 assert not self.inplace
615 basename, tail = os.path.splitext(ext_filename)
616 newname = basename + "_failed" + tail
617 if os.path.exists(newname):
618 os.remove(newname)
619 os.rename(ext_filename, newname)
620
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000621 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000622 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000623 self.announce('*** WARNING: importing extension "%s" '
624 'failed with %s: %s' % (ext.name, exc_type, why),
625 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000626 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000627
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400628 def add_multiarch_paths(self):
629 # Debian/Ubuntu multiarch support.
630 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200631 cc = sysconfig.get_config_var('CC')
632 tmpfile = os.path.join(self.build_temp, 'multiarch')
633 if not os.path.exists(self.build_temp):
634 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200635 ret = run_command(
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200636 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
637 multiarch_path_component = ''
638 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200639 if ret == 0:
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200640 with open(tmpfile) as fp:
641 multiarch_path_component = fp.readline().strip()
642 finally:
643 os.unlink(tmpfile)
644
645 if multiarch_path_component != '':
646 add_dir_to_list(self.compiler.library_dirs,
647 '/usr/lib/' + multiarch_path_component)
648 add_dir_to_list(self.compiler.include_dirs,
649 '/usr/include/' + multiarch_path_component)
650 return
651
Barry Warsaw88e19452011-04-07 10:40:36 -0400652 if not find_executable('dpkg-architecture'):
653 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200654 opt = ''
Victor Stinner4cbea512019-02-28 17:48:38 +0100655 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200656 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400657 tmpfile = os.path.join(self.build_temp, 'multiarch')
658 if not os.path.exists(self.build_temp):
659 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200660 ret = run_command(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200661 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
662 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400663 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200664 if ret == 0:
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400665 with open(tmpfile) as fp:
666 multiarch_path_component = fp.readline().strip()
667 add_dir_to_list(self.compiler.library_dirs,
668 '/usr/lib/' + multiarch_path_component)
669 add_dir_to_list(self.compiler.include_dirs,
670 '/usr/include/' + multiarch_path_component)
671 finally:
672 os.unlink(tmpfile)
673
pxinwr32f5fdd2019-02-27 19:09:28 +0800674 def add_cross_compiling_paths(self):
675 cc = sysconfig.get_config_var('CC')
676 tmpfile = os.path.join(self.build_temp, 'ccpaths')
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200677 if not os.path.exists(self.build_temp):
678 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200679 ret = run_command('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200680 is_gcc = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800681 is_clang = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200682 in_incdirs = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200683 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200684 if ret == 0:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200685 with open(tmpfile) as fp:
686 for line in fp.readlines():
687 if line.startswith("gcc version"):
688 is_gcc = True
pxinwr32f5fdd2019-02-27 19:09:28 +0800689 elif line.startswith("clang version"):
690 is_clang = True
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200691 elif line.startswith("#include <...>"):
692 in_incdirs = True
693 elif line.startswith("End of search list"):
694 in_incdirs = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800695 elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200696 for d in line.strip().split("=")[1].split(":"):
697 d = os.path.normpath(d)
698 if '/gcc/' not in d:
699 add_dir_to_list(self.compiler.library_dirs,
700 d)
pxinwr32f5fdd2019-02-27 19:09:28 +0800701 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 +0200702 add_dir_to_list(self.compiler.include_dirs,
703 line.strip())
704 finally:
705 os.unlink(tmpfile)
706
Victor Stinnercfe172d2019-03-01 18:21:49 +0100707 def add_ldflags_cppflags(self):
Brett Cannon516592f2004-12-07 00:42:59 +0000708 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000709 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000710 # We must get the values from the Makefile and not the environment
711 # directly since an inconsistently reproducible issue comes up where
712 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000713 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000714 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000715 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
716 ('LDFLAGS', '-L', self.compiler.library_dirs),
717 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000718 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000719 if env_val:
Chih-Hsuan Yen09b2bec2018-07-11 16:48:43 +0800720 parser = argparse.ArgumentParser()
721 parser.add_argument(arg_name, dest="dirs", action="append")
722 options, _ = parser.parse_known_args(env_val.split())
Brett Cannon44837712005-01-02 21:54:07 +0000723 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000724 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000725 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000726
Victor Stinnercfe172d2019-03-01 18:21:49 +0100727 def configure_compiler(self):
728 # Ensure that /usr/local is always used, but the local build
729 # directories (i.e. '.' and 'Include') must be first. See issue
730 # 10520.
731 if not CROSS_COMPILING:
732 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
733 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
734 # only change this for cross builds for 3.3, issues on Mageia
735 if CROSS_COMPILING:
736 self.add_cross_compiling_paths()
737 self.add_multiarch_paths()
738 self.add_ldflags_cppflags()
739
Victor Stinner5ec33a12019-03-01 16:43:28 +0100740 def init_inc_lib_dirs(self):
Victor Stinner4cbea512019-02-28 17:48:38 +0100741 if (not CROSS_COMPILING and
Xavier de Gaye1351c312016-12-14 11:14:33 +0100742 os.path.normpath(sys.base_prefix) != '/usr' and
743 not sysconfig.get_config_var('PYTHONFRAMEWORK')):
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000744 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
745 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
746 # building a framework with different architectures than
747 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000748 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000749 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000750 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000751 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000752
xdegaye77f51392017-11-25 17:25:30 +0100753 system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
754 system_include_dirs = ['/usr/include']
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000755 # lib_dirs and inc_dirs are used to search for files;
756 # if a file is found in one of those directories, it can
757 # be assumed that no additional -I,-L directives are needed.
Victor Stinner4cbea512019-02-28 17:48:38 +0100758 if not CROSS_COMPILING:
Victor Stinner625dbf22019-03-01 15:59:39 +0100759 self.lib_dirs = self.compiler.library_dirs + system_lib_dirs
760 self.inc_dirs = self.compiler.include_dirs + system_include_dirs
Christian Heimesf19529c2012-12-12 12:41:00 +0100761 else:
xdegaye77f51392017-11-25 17:25:30 +0100762 # Add the sysroot paths. 'sysroot' is a compiler option used to
763 # set the logical path of the standard system headers and
764 # libraries.
Victor Stinner625dbf22019-03-01 15:59:39 +0100765 self.lib_dirs = (self.compiler.library_dirs +
766 sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs))
767 self.inc_dirs = (self.compiler.include_dirs +
768 sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'),
769 system_include_dirs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000770
Brett Cannon4454a1f2005-04-15 20:32:39 +0000771 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000772 with open(config_h) as file:
Victor Stinner5ec33a12019-03-01 16:43:28 +0100773 self.config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000774
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000775 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
Victor Stinner4cbea512019-02-28 17:48:38 +0100776 if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']:
Victor Stinner625dbf22019-03-01 15:59:39 +0100777 self.lib_dirs += ['/usr/ccs/lib']
Skip Montanaro22e00c42003-05-06 20:43:34 +0000778
Charles-François Natali5739e102012-04-12 19:07:25 +0200779 # HP-UX11iv3 keeps files in lib/hpux folders.
Victor Stinner4cbea512019-02-28 17:48:38 +0100780 if HOST_PLATFORM == 'hp-ux11':
Victor Stinner625dbf22019-03-01 15:59:39 +0100781 self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
Charles-François Natali5739e102012-04-12 19:07:25 +0200782
Victor Stinner4cbea512019-02-28 17:48:38 +0100783 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000784 # This should work on any unixy platform ;-)
785 # If the user has bothered specifying additional -I and -L flags
786 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000787 #
788 # NOTE: using shlex.split would technically be more correct, but
789 # also gives a bootstrap problem. Let's hope nobody uses
790 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000791 cflags, ldflags = sysconfig.get_config_vars(
792 'CFLAGS', 'LDFLAGS')
793 for item in cflags.split():
794 if item.startswith('-I'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100795 self.inc_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000796
797 for item in ldflags.split():
798 if item.startswith('-L'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100799 self.lib_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000800
Victor Stinner5ec33a12019-03-01 16:43:28 +0100801 def detect_simple_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000802 #
803 # The following modules are all pretty straightforward, and compile
804 # on pretty much any POSIXish platform.
805 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000806
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000807 # array objects
Victor Stinner8058bda2019-03-01 15:31:45 +0100808 self.add(Extension('array', ['arraymodule.c']))
Martin Panterc9deece2016-02-03 05:19:44 +0000809
Yury Selivanovf23746a2018-01-22 19:11:18 -0500810 # Context Variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100811 self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
Yury Selivanovf23746a2018-01-22 19:11:18 -0500812
Martin Panterc9deece2016-02-03 05:19:44 +0000813 shared_math = 'Modules/_math.o'
Victor Stinnercfe172d2019-03-01 18:21:49 +0100814
815 # math library functions, e.g. sin()
816 self.add(Extension('math', ['mathmodule.c'],
Victor Stinnere9e7d282020-02-12 22:54:42 +0100817 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100818 extra_objects=[shared_math],
819 depends=['_math.h', shared_math],
820 libraries=['m']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100821
822 # complex math library functions
823 self.add(Extension('cmath', ['cmathmodule.c'],
Victor Stinnere9e7d282020-02-12 22:54:42 +0100824 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100825 extra_objects=[shared_math],
826 depends=['_math.h', shared_math],
827 libraries=['m']))
Victor Stinnere0be4232011-10-25 13:06:09 +0200828
829 # time libraries: librt may be needed for clock_gettime()
830 time_libs = []
831 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
832 if lib:
833 time_libs.append(lib)
834
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000835 # time operations and variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100836 self.add(Extension('time', ['timemodule.c'],
837 libraries=time_libs))
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800838 # libm is needed by delta_new() that uses round() and by accum() that
839 # uses modf().
Victor Stinner8058bda2019-03-01 15:31:45 +0100840 self.add(Extension('_datetime', ['_datetimemodule.c'],
Victor Stinner04fc4f22020-06-16 01:28:07 +0200841 libraries=['m'],
842 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Paul Ganssle62972d92020-05-16 04:20:06 -0400843 # zoneinfo module
Victor Stinner37834132020-10-27 17:12:53 +0100844 self.add(Extension('_zoneinfo', ['_zoneinfo.c'],
845 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000846 # random number generator implemented in C
Victor Stinner9f5fe792020-04-17 19:05:35 +0200847 self.add(Extension("_random", ["_randommodule.c"],
848 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Raymond Hettinger0c410272004-01-05 10:13:35 +0000849 # bisect
Victor Stinner8058bda2019-03-01 15:31:45 +0100850 self.add(Extension("_bisect", ["_bisectmodule.c"]))
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000851 # heapq
Victor Stinnerc45dbe932020-06-22 17:39:32 +0200852 self.add(Extension("_heapq", ["_heapqmodule.c"],
853 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000854 # C-optimized pickle replacement
Victor Stinner5c75f372019-04-17 23:02:26 +0200855 self.add(Extension("_pickle", ["_pickle.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200856 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Collin Winter670e6922007-03-21 02:57:17 +0000857 # atexit
Victor Stinner8058bda2019-03-01 15:31:45 +0100858 self.add(Extension("atexit", ["atexitmodule.c"]))
Christian Heimes90540002008-05-08 14:29:10 +0000859 # _json speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100860 self.add(Extension("_json", ["_json.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200861 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100862
Fred Drake0e474a82007-10-11 18:01:43 +0000863 # profiler (_lsprof is for cProfile.py)
Victor Stinner8058bda2019-03-01 15:31:45 +0100864 self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000865 # static Unicode character database
Victor Stinner8058bda2019-03-01 15:31:45 +0100866 self.add(Extension('unicodedata', ['unicodedata.c'],
Victor Stinner47e1afd2020-10-26 16:43:47 +0100867 depends=['unicodedata_db.h', 'unicodename_db.h'],
868 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Larry Hastings3a907972013-11-23 14:49:22 -0800869 # _opcode module
Victor Stinner8058bda2019-03-01 15:31:45 +0100870 self.add(Extension('_opcode', ['_opcode.c']))
INADA Naoki9f2ce252016-10-15 15:39:19 +0900871 # asyncio speedups
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700872 self.add(Extension("_asyncio", ["_asynciomodule.c"],
873 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Ivan Levkivskyi03e3c342018-02-18 12:41:58 +0000874 # _abc speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100875 self.add(Extension("_abc", ["_abc.c"]))
Antoine Pitrou94e16962018-01-16 00:27:16 +0100876 # _queue module
Victor Stinner8058bda2019-03-01 15:31:45 +0100877 self.add(Extension("_queue", ["_queuemodule.c"]))
Dong-hee Na0a18ee42019-08-24 07:20:30 +0900878 # _statistics module
879 self.add(Extension("_statistics", ["_statisticsmodule.c"]))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000880
881 # Modules with some UNIX dependencies -- on by default:
882 # (If you have a really backward UNIX, select and socket may not be
883 # supported...)
884
885 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000886 libs = []
Victor Stinner5ec33a12019-03-01 16:43:28 +0100887 if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
Antoine Pitroua3000072010-09-07 14:52:42 +0000888 # May be necessary on AIX for flock function
889 libs = ['bsd']
Victor Stinner8058bda2019-03-01 15:31:45 +0100890 self.add(Extension('fcntl', ['fcntlmodule.c'],
891 libraries=libs))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000892 # pwd(3)
Victor Stinner8058bda2019-03-01 15:31:45 +0100893 self.add(Extension('pwd', ['pwdmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000894 # grp(3)
pxinwr32f5fdd2019-02-27 19:09:28 +0800895 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100896 self.add(Extension('grp', ['grpmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000897 # spwd, shadow passwords
Victor Stinner5ec33a12019-03-01 16:43:28 +0100898 if (self.config_h_vars.get('HAVE_GETSPNAM', False) or
899 self.config_h_vars.get('HAVE_GETSPENT', False)):
Victor Stinner8058bda2019-03-01 15:31:45 +0100900 self.add(Extension('spwd', ['spwdmodule.c']))
Michael Felt08970cb2019-06-21 15:58:00 +0200901 # AIX has shadow passwords, but access is not via getspent(), etc.
902 # module support is not expected so it not 'missing'
903 elif not AIX:
Victor Stinner8058bda2019-03-01 15:31:45 +0100904 self.missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000905
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000906 # select(2); not on ancient System V
Victor Stinner8058bda2019-03-01 15:31:45 +0100907 self.add(Extension('select', ['selectmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000908
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000909 # Memory-mapped files (also works on Win32).
Victor Stinner8058bda2019-03-01 15:31:45 +0100910 self.add(Extension('mmap', ['mmapmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000911
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000912 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000913 # syslog daemon interface
Victor Stinner8058bda2019-03-01 15:31:45 +0100914 self.add(Extension('syslog', ['syslogmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000915
Eric Snow7f8bfc92018-01-29 18:23:44 -0700916 # Python interface to subinterpreter C-API.
Eric Snowc11183c2019-03-15 16:35:46 -0600917 self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c']))
Eric Snow7f8bfc92018-01-29 18:23:44 -0700918
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000919 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000920 # Here ends the simple stuff. From here on, modules need certain
921 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000922 #
923
924 # Multimedia modules
925 # These don't work for 64-bit platforms!!!
926 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200927 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000928 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000929 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000930 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200931 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800932 # audioop needs libm for floor() in multiple functions.
Victor Stinner8058bda2019-03-01 15:31:45 +0100933 self.add(Extension('audioop', ['audioop.c'],
934 libraries=['m']))
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000935
Victor Stinner5ec33a12019-03-01 16:43:28 +0100936 # CSV files
937 self.add(Extension('_csv', ['_csv.c']))
938
939 # POSIX subprocess module helper.
Kyle Evans79925792020-10-13 15:04:44 -0500940 self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
941 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner5ec33a12019-03-01 16:43:28 +0100942
Victor Stinnercfe172d2019-03-01 18:21:49 +0100943 def detect_test_extensions(self):
944 # Python C API test module
945 self.add(Extension('_testcapi', ['_testcapimodule.c'],
946 depends=['testcapi_long.h']))
947
Victor Stinner23bace22019-04-18 11:37:26 +0200948 # Python Internal C API test module
949 self.add(Extension('_testinternalcapi', ['_testinternalcapi.c'],
Victor Stinner57491342019-04-23 12:26:33 +0200950 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner23bace22019-04-18 11:37:26 +0200951
Victor Stinnercfe172d2019-03-01 18:21:49 +0100952 # Python PEP-3118 (buffer protocol) test module
953 self.add(Extension('_testbuffer', ['_testbuffer.c']))
954
955 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
956 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
957
958 # Test multi-phase extension module init (PEP 489)
959 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
960
961 # Fuzz tests.
962 self.add(Extension('_xxtestfuzz',
963 ['_xxtestfuzz/_xxtestfuzz.c',
964 '_xxtestfuzz/fuzzer.c']))
965
Victor Stinner5ec33a12019-03-01 16:43:28 +0100966 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000967 # readline
Victor Stinner625dbf22019-03-01 15:59:39 +0100968 do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000969 readline_termcap_library = ""
970 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200971 # Cannot use os.popen here in py3k.
972 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
973 if not os.path.exists(self.build_temp):
974 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000975 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200976 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100977 if CROSS_COMPILING:
Victor Stinner6b982c22020-04-01 01:10:07 +0200978 ret = run_command("%s -d %s | grep '(NEEDED)' > %s"
doko@ubuntu.com58844492012-06-30 18:25:32 +0200979 % (sysconfig.get_config_var('READELF'),
980 do_readline, tmpfile))
981 elif find_executable('ldd'):
Victor Stinner6b982c22020-04-01 01:10:07 +0200982 ret = run_command("ldd %s > %s" % (do_readline, tmpfile))
doko@ubuntu.com58844492012-06-30 18:25:32 +0200983 else:
Victor Stinner6b982c22020-04-01 01:10:07 +0200984 ret = 1
985 if ret == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000986 with open(tmpfile) as fp:
987 for ln in fp:
988 if 'curses' in ln:
989 readline_termcap_library = re.sub(
990 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
991 ).rstrip()
992 break
993 # termcap interface split out from ncurses
994 if 'tinfo' in ln:
995 readline_termcap_library = 'tinfo'
996 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200997 if os.path.exists(tmpfile):
998 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000999 # Issue 7384: If readline is already linked against curses,
1000 # use the same library for the readline and curses modules.
1001 if 'curses' in readline_termcap_library:
1002 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +01001003 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +00001004 curses_library = 'ncursesw'
Michael Felt08970cb2019-06-21 15:58:00 +02001005 # Issue 36210: OSS provided ncurses does not link on AIX
1006 # Use IBM supplied 'curses' for successful build of _curses
1007 elif AIX and self.compiler.find_library_file(self.lib_dirs, 'curses'):
1008 curses_library = 'curses'
Victor Stinner625dbf22019-03-01 15:59:39 +01001009 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001010 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +01001011 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001012 curses_library = 'curses'
1013
Victor Stinner4cbea512019-02-28 17:48:38 +01001014 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001015 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +00001016 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -07001017 if (dep_target and
FX Coudert52916392020-12-03 04:20:18 +01001018 (tuple(int(n) for n in str(dep_target).split('.')[0:2])
Ned Deily04cdfa12014-06-25 13:36:14 -07001019 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +00001020 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001021 if os_release < 9:
1022 # MacOSX 10.4 has a broken readline. Don't try to build
1023 # the readline module unless the user has installed a fixed
1024 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +01001025 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001026 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +00001027 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +01001028 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001029 # In every directory on the search path search for a dynamic
1030 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +00001031 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +00001032 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001033 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001034 readline_extra_link_args = ('-Wl,-search_paths_first',)
1035 else:
1036 readline_extra_link_args = ()
1037
Marc-André Lemburg2efc3232001-01-26 18:23:02 +00001038 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +00001039 if readline_termcap_library:
1040 pass # Issue 7384: Already linked against curses or tinfo.
1041 elif curses_library:
1042 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +01001043 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001044 ['/usr/lib/termcap'],
1045 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +00001046 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +01001047 self.add(Extension('readline', ['readline.c'],
1048 library_dirs=['/usr/lib/termcap'],
1049 extra_link_args=readline_extra_link_args,
1050 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001051 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001052 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001053
Victor Stinner5ec33a12019-03-01 16:43:28 +01001054 # Curses support, requiring the System V version of curses, often
1055 # provided by the ncurses library.
1056 curses_defines = []
1057 curses_includes = []
1058 panel_library = 'panel'
1059 if curses_library == 'ncursesw':
1060 curses_defines.append(('HAVE_NCURSESW', '1'))
1061 if not CROSS_COMPILING:
1062 curses_includes.append('/usr/include/ncursesw')
1063 # Bug 1464056: If _curses.so links with ncursesw,
1064 # _curses_panel.so must link with panelw.
1065 panel_library = 'panelw'
1066 if MACOS:
1067 # On OS X, there is no separate /usr/lib/libncursesw nor
1068 # libpanelw. If we are here, we found a locally-supplied
1069 # version of libncursesw. There should also be a
1070 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1071 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1072 # ncurses wide char support
1073 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
1074 elif MACOS and curses_library == 'ncurses':
1075 # Building with the system-suppied combined libncurses/libpanel
1076 curses_defines.append(('HAVE_NCURSESW', '1'))
1077 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +00001078
Victor Stinnercfe172d2019-03-01 18:21:49 +01001079 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +01001080 if curses_library.startswith('ncurses'):
1081 curses_libs = [curses_library]
1082 self.add(Extension('_curses', ['_cursesmodule.c'],
Victor Stinner37834132020-10-27 17:12:53 +01001083 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001084 include_dirs=curses_includes,
1085 define_macros=curses_defines,
1086 libraries=curses_libs))
1087 elif curses_library == 'curses' and not MACOS:
1088 # OSX has an old Berkeley curses, not good enough for
1089 # the _curses module.
1090 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
1091 curses_libs = ['curses', 'terminfo']
1092 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
1093 curses_libs = ['curses', 'termcap']
1094 else:
1095 curses_libs = ['curses']
1096
1097 self.add(Extension('_curses', ['_cursesmodule.c'],
Victor Stinner37834132020-10-27 17:12:53 +01001098 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001099 define_macros=curses_defines,
1100 libraries=curses_libs))
1101 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +01001102 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +01001103 self.missing.append('_curses')
1104
1105 # If the curses module is enabled, check for the panel module
Michael Felt08970cb2019-06-21 15:58:00 +02001106 # _curses_panel needs some form of ncurses
1107 skip_curses_panel = True if AIX else False
1108 if (curses_enabled and not skip_curses_panel and
1109 self.compiler.find_library_file(self.lib_dirs, panel_library)):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001110 self.add(Extension('_curses_panel', ['_curses_panel.c'],
Michael Felt08970cb2019-06-21 15:58:00 +02001111 include_dirs=curses_includes,
1112 define_macros=curses_defines,
1113 libraries=[panel_library, *curses_libs]))
1114 elif not skip_curses_panel:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001115 self.missing.append('_curses_panel')
1116
1117 def detect_crypt(self):
1118 # crypt module.
pxinwr236d0b72019-04-15 17:02:20 +08001119 if VXWORKS:
1120 # bpo-31904: crypt() function is not provided by VxWorks.
1121 # DES_crypt() OpenSSL provides is too weak to implement
1122 # the encryption.
1123 return
1124
Victor Stinner625dbf22019-03-01 15:59:39 +01001125 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +00001126 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +00001127 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +00001128 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +08001129
pxinwr236d0b72019-04-15 17:02:20 +08001130 self.add(Extension('_crypt', ['_cryptmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +01001131 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001132
Victor Stinner5ec33a12019-03-01 16:43:28 +01001133 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001134 # socket(2)
Erlend Egeberg Aaslandccdcb202020-11-18 01:08:58 +01001135 kwargs = {'depends': ['socketmodule.h']}
pxinwr00a65682020-11-29 06:14:16 +08001136 if MACOS:
Erlend Egeberg Aaslandccdcb202020-11-18 01:08:58 +01001137 # Issue #35569: Expose RFC 3542 socket options.
1138 kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542']
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +02001139
Erlend Egeberg Aaslandccdcb202020-11-18 01:08:58 +01001140 self.add(Extension('_socket', ['socketmodule.c'], **kwargs))
pxinwr32f5fdd2019-02-27 19:09:28 +08001141
Victor Stinner5ec33a12019-03-01 16:43:28 +01001142 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001143 # Modules that provide persistent dictionary-like semantics. You will
1144 # probably want to arrange for at least one of them to be available on
1145 # your machine, though none are defined by default because of library
1146 # dependencies. The Python module dbm/__init__.py provides an
1147 # implementation independent wrapper for these; dbm/dumb.py provides
1148 # similar functionality (but slower of course) implemented in Python.
1149
1150 # Sleepycat^WOracle Berkeley DB interface.
1151 # http://www.oracle.com/database/berkeley-db/db/index.html
1152 #
1153 # This requires the Sleepycat^WOracle DB code. The supported versions
1154 # are set below. Visit the URL above to download
1155 # a release. Most open source OSes come with one or more
1156 # versions of BerkeleyDB already installed.
1157
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001158 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001159 min_db_ver = (3, 3)
1160 db_setup_debug = False # verbose debug prints from this script?
1161
1162 def allow_db_ver(db_ver):
1163 """Returns a boolean if the given BerkeleyDB version is acceptable.
1164
1165 Args:
1166 db_ver: A tuple of the version to verify.
1167 """
1168 if not (min_db_ver <= db_ver <= max_db_ver):
1169 return False
1170 return True
1171
1172 def gen_db_minor_ver_nums(major):
1173 if major == 4:
1174 for x in range(max_db_ver[1]+1):
1175 if allow_db_ver((4, x)):
1176 yield x
1177 elif major == 3:
1178 for x in (3,):
1179 if allow_db_ver((3, x)):
1180 yield x
1181 else:
1182 raise ValueError("unknown major BerkeleyDB version", major)
1183
1184 # construct a list of paths to look for the header file in on
1185 # top of the normal inc_dirs.
1186 db_inc_paths = [
1187 '/usr/include/db4',
1188 '/usr/local/include/db4',
1189 '/opt/sfw/include/db4',
1190 '/usr/include/db3',
1191 '/usr/local/include/db3',
1192 '/opt/sfw/include/db3',
1193 # Fink defaults (http://fink.sourceforge.net/)
1194 '/sw/include/db4',
1195 '/sw/include/db3',
1196 ]
1197 # 4.x minor number specific paths
1198 for x in gen_db_minor_ver_nums(4):
1199 db_inc_paths.append('/usr/include/db4%d' % x)
1200 db_inc_paths.append('/usr/include/db4.%d' % x)
1201 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1202 db_inc_paths.append('/usr/local/include/db4%d' % x)
1203 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1204 db_inc_paths.append('/opt/db-4.%d/include' % x)
1205 # MacPorts default (http://www.macports.org/)
1206 db_inc_paths.append('/opt/local/include/db4%d' % x)
1207 # 3.x minor number specific paths
1208 for x in gen_db_minor_ver_nums(3):
1209 db_inc_paths.append('/usr/include/db3%d' % x)
1210 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1211 db_inc_paths.append('/usr/local/include/db3%d' % x)
1212 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1213 db_inc_paths.append('/opt/db-3.%d/include' % x)
1214
Victor Stinner4cbea512019-02-28 17:48:38 +01001215 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001216 db_inc_paths = []
1217
Georg Brandl489cb4f2009-07-11 10:08:49 +00001218 # Add some common subdirectories for Sleepycat DB to the list,
1219 # based on the standard include directories. This way DB3/4 gets
1220 # picked up when it is installed in a non-standard prefix and
1221 # the user has added that prefix into inc_dirs.
1222 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001223 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001224 std_variants.append(os.path.join(dn, 'db3'))
1225 std_variants.append(os.path.join(dn, 'db4'))
1226 for x in gen_db_minor_ver_nums(4):
1227 std_variants.append(os.path.join(dn, "db4%d"%x))
1228 std_variants.append(os.path.join(dn, "db4.%d"%x))
1229 for x in gen_db_minor_ver_nums(3):
1230 std_variants.append(os.path.join(dn, "db3%d"%x))
1231 std_variants.append(os.path.join(dn, "db3.%d"%x))
1232
1233 db_inc_paths = std_variants + db_inc_paths
1234 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1235
1236 db_ver_inc_map = {}
1237
Victor Stinner4cbea512019-02-28 17:48:38 +01001238 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001239 sysroot = macosx_sdk_root()
1240
Georg Brandl489cb4f2009-07-11 10:08:49 +00001241 class db_found(Exception): pass
1242 try:
1243 # See whether there is a Sleepycat header in the standard
1244 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001245 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001246 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001247 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001248 f = os.path.join(sysroot, d[1:], "db.h")
1249
Georg Brandl489cb4f2009-07-11 10:08:49 +00001250 if db_setup_debug: print("db: looking for db.h in", f)
1251 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001252 with open(f, 'rb') as file:
1253 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001254 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001255 if m:
1256 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001257 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001258 db_minor = int(m.group(1))
1259 db_ver = (db_major, db_minor)
1260
1261 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1262 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001263 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001264 db_patch = int(m.group(1))
1265 if db_patch < 21:
1266 print("db.h:", db_ver, "patch", db_patch,
1267 "being ignored (4.6.x must be >= 4.6.21)")
1268 continue
1269
1270 if ( (db_ver not in db_ver_inc_map) and
1271 allow_db_ver(db_ver) ):
1272 # save the include directory with the db.h version
1273 # (first occurrence only)
1274 db_ver_inc_map[db_ver] = d
1275 if db_setup_debug:
1276 print("db.h: found", db_ver, "in", d)
1277 else:
1278 # we already found a header for this library version
1279 if db_setup_debug: print("db.h: ignoring", d)
1280 else:
1281 # ignore this header, it didn't contain a version number
1282 if db_setup_debug:
1283 print("db.h: no version number version in", d)
1284
1285 db_found_vers = list(db_ver_inc_map.keys())
1286 db_found_vers.sort()
1287
1288 while db_found_vers:
1289 db_ver = db_found_vers.pop()
1290 db_incdir = db_ver_inc_map[db_ver]
1291
1292 # check lib directories parallel to the location of the header
1293 db_dirs_to_check = [
1294 db_incdir.replace("include", 'lib64'),
1295 db_incdir.replace("include", 'lib'),
1296 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001297
Victor Stinner4cbea512019-02-28 17:48:38 +01001298 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001299 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1300
1301 else:
1302 # Same as other branch, but takes OSX SDK into account
1303 tmp = []
1304 for dn in db_dirs_to_check:
1305 if is_macosx_sdk_path(dn):
1306 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1307 tmp.append(dn)
1308 else:
1309 if os.path.isdir(dn):
1310 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001311 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001312
1313 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001314
Ezio Melotti42da6632011-03-15 05:18:48 +02001315 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001316 # XXX should we -ever- look for a dbX name? Do any
1317 # systems really not name their library by version and
1318 # symlink to more general names?
1319 for dblib in (('db-%d.%d' % db_ver),
1320 ('db%d%d' % db_ver),
1321 ('db%d' % db_ver[0])):
1322 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001323 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001324 if dblib_file:
1325 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1326 raise db_found
1327 else:
1328 if db_setup_debug: print("db lib: ", dblib, "not found")
1329
1330 except db_found:
1331 if db_setup_debug:
1332 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1333 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001334 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001335 # Only add the found library and include directories if they aren't
1336 # already being searched. This avoids an explicit runtime library
1337 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001338 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001339 db_incs = None
1340 else:
1341 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001342 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001343 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001344 else:
1345 if db_setup_debug: print("db: no appropriate library found")
1346 db_incs = None
1347 dblibs = []
1348 dblib_dir = None
1349
Victor Stinner5ec33a12019-03-01 16:43:28 +01001350 dbm_setup_debug = False # verbose debug prints from this script?
1351 dbm_order = ['gdbm']
1352 # The standard Unix dbm module:
1353 if not CYGWIN:
1354 config_args = [arg.strip("'")
1355 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1356 dbm_args = [arg for arg in config_args
1357 if arg.startswith('--with-dbmliborder=')]
1358 if dbm_args:
1359 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1360 else:
1361 dbm_order = "ndbm:gdbm:bdb".split(":")
1362 dbmext = None
1363 for cand in dbm_order:
1364 if cand == "ndbm":
1365 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1366 # Some systems have -lndbm, others have -lgdbm_compat,
1367 # others don't have either
1368 if self.compiler.find_library_file(self.lib_dirs,
1369 'ndbm'):
1370 ndbm_libs = ['ndbm']
1371 elif self.compiler.find_library_file(self.lib_dirs,
1372 'gdbm_compat'):
1373 ndbm_libs = ['gdbm_compat']
1374 else:
1375 ndbm_libs = []
1376 if dbm_setup_debug: print("building dbm using ndbm")
1377 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1378 define_macros=[
1379 ('HAVE_NDBM_H',None),
1380 ],
1381 libraries=ndbm_libs)
1382 break
1383
1384 elif cand == "gdbm":
1385 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1386 gdbm_libs = ['gdbm']
1387 if self.compiler.find_library_file(self.lib_dirs,
1388 'gdbm_compat'):
1389 gdbm_libs.append('gdbm_compat')
1390 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1391 if dbm_setup_debug: print("building dbm using gdbm")
1392 dbmext = Extension(
1393 '_dbm', ['_dbmmodule.c'],
1394 define_macros=[
1395 ('HAVE_GDBM_NDBM_H', None),
1396 ],
1397 libraries = gdbm_libs)
1398 break
1399 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1400 if dbm_setup_debug: print("building dbm using gdbm")
1401 dbmext = Extension(
1402 '_dbm', ['_dbmmodule.c'],
1403 define_macros=[
1404 ('HAVE_GDBM_DASH_NDBM_H', None),
1405 ],
1406 libraries = gdbm_libs)
1407 break
1408 elif cand == "bdb":
1409 if dblibs:
1410 if dbm_setup_debug: print("building dbm using bdb")
1411 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1412 library_dirs=dblib_dir,
1413 runtime_library_dirs=dblib_dir,
1414 include_dirs=db_incs,
1415 define_macros=[
1416 ('HAVE_BERKDB_H', None),
1417 ('DB_DBM_HSEARCH', None),
1418 ],
1419 libraries=dblibs)
1420 break
1421 if dbmext is not None:
1422 self.add(dbmext)
1423 else:
1424 self.missing.append('_dbm')
1425
1426 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1427 if ('gdbm' in dbm_order and
1428 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1429 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1430 libraries=['gdbm']))
1431 else:
1432 self.missing.append('_gdbm')
1433
1434 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001435 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001436 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001437
1438 # We hunt for #define SQLITE_VERSION "n.n.n"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001439 sqlite_incdir = sqlite_libdir = None
1440 sqlite_inc_paths = [ '/usr/include',
1441 '/usr/include/sqlite',
1442 '/usr/include/sqlite3',
1443 '/usr/local/include',
1444 '/usr/local/include/sqlite',
1445 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001446 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001447 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001448 sqlite_inc_paths = []
Erlend Egeberg Aasland207c3212020-09-07 23:26:54 +02001449 # We need to find >= sqlite version 3.7.3, for sqlite3_create_function_v2()
1450 MIN_SQLITE_VERSION_NUMBER = (3, 7, 3)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001451 MIN_SQLITE_VERSION = ".".join([str(x)
1452 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001453
1454 # Scan the default include directories before the SQLite specific
1455 # ones. This allows one to override the copy of sqlite on OSX,
1456 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001457 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001458 sysroot = macosx_sdk_root()
1459
Victor Stinner625dbf22019-03-01 15:59:39 +01001460 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001461 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001462 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001463 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001464
Ned Deily9b635832012-08-05 15:13:33 -07001465 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001466 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001467 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001468 with open(f) as file:
1469 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001470 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001471 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001472 if m:
1473 sqlite_version = m.group(1)
1474 sqlite_version_tuple = tuple([int(x)
1475 for x in sqlite_version.split(".")])
1476 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1477 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001478 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001479 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001480 sqlite_incdir = d
1481 break
1482 else:
1483 if sqlite_setup_debug:
Charles Pigottad0daf52019-04-26 16:38:12 +01001484 print("%s: version %s is too old, need >= %s"%(d,
Guido van Rossum452bf512007-02-09 05:32:43 +00001485 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001486 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001487 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001488
1489 if sqlite_incdir:
1490 sqlite_dirs_to_check = [
1491 os.path.join(sqlite_incdir, '..', 'lib64'),
1492 os.path.join(sqlite_incdir, '..', 'lib'),
1493 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1494 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1495 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001496 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001497 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001498 if sqlite_libfile:
1499 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001500
1501 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001502 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001504 '_sqlite/cursor.c',
1505 '_sqlite/microprotocols.c',
1506 '_sqlite/module.c',
1507 '_sqlite/prepare_protocol.c',
1508 '_sqlite/row.c',
1509 '_sqlite/statement.c',
1510 '_sqlite/util.c', ]
1511
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001512 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001513 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001514 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1515 else:
1516 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1517
Benjamin Peterson076ed002010-10-31 17:11:02 +00001518 # Enable support for loadable extensions in the sqlite3 module
1519 # if --enable-loadable-sqlite-extensions configure option is used.
1520 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1521 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001522
Victor Stinner4cbea512019-02-28 17:48:38 +01001523 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001524 # In every directory on the search path search for a dynamic
1525 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001526 # for dynamic libraries on the entire path.
1527 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001528 # before the dynamic library in /usr/lib.
1529 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1530 else:
1531 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001532
Brett Cannonc5011fe2011-06-06 20:09:10 -07001533 include_dirs = ["Modules/_sqlite"]
1534 # Only include the directory where sqlite was found if it does
1535 # not already exist in set include directories, otherwise you
1536 # can end up with a bad search path order.
1537 if sqlite_incdir not in self.compiler.include_dirs:
1538 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001539 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001540 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001541 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001542 self.add(Extension('_sqlite3', sqlite_srcs,
1543 define_macros=sqlite_defines,
1544 include_dirs=include_dirs,
1545 library_dirs=sqlite_libdir,
1546 extra_link_args=sqlite_extra_link_args,
1547 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001548 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001549 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001550
Victor Stinner5ec33a12019-03-01 16:43:28 +01001551 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001552 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001553 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001554 if not VXWORKS:
1555 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001556 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001557 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001558 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001559 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001560 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001561
Victor Stinner5ec33a12019-03-01 16:43:28 +01001562 # Platform-specific libraries
1563 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1564 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Michael Felt08970cb2019-06-21 15:58:00 +02001565 elif not AIX:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001566 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001567
Victor Stinner5ec33a12019-03-01 16:43:28 +01001568 if MACOS:
Ned Deily951ab582020-05-18 11:31:21 -04001569 self.add(Extension('_scproxy', ['_scproxy.c'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001570 extra_link_args=[
1571 '-framework', 'SystemConfiguration',
Ned Deily951ab582020-05-18 11:31:21 -04001572 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001573
Victor Stinner5ec33a12019-03-01 16:43:28 +01001574 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001575 # Andrew Kuchling's zlib module. Note that some versions of zlib
1576 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1577 # http://www.cert.org/advisories/CA-2002-07.html
1578 #
1579 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1580 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1581 # now, we still accept 1.1.3, because we think it's difficult to
1582 # exploit this in Python, and we'd rather make it RedHat's problem
1583 # than our problem <wink>.
1584 #
1585 # You can upgrade zlib to version 1.1.4 yourself by going to
1586 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001587 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001588 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001589 if zlib_inc is not None:
1590 zlib_h = zlib_inc[0] + '/zlib.h'
1591 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001592 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001593 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001594 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001595 with open(zlib_h) as fp:
1596 while 1:
1597 line = fp.readline()
1598 if not line:
1599 break
1600 if line.startswith('#define ZLIB_VERSION'):
1601 version = line.split()[2]
1602 break
Guido van Rossume6970912001-04-15 15:16:12 +00001603 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001604 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001605 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001606 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1607 else:
1608 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001609 self.add(Extension('zlib', ['zlibmodule.c'],
1610 libraries=['z'],
1611 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001612 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001613 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001614 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001615 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001616 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001617 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001618 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001619
Christian Heimes1dc54002008-03-24 02:19:29 +00001620 # Helper module for various ascii-encoders. Uses zlib for an optimized
1621 # crc32 if we have it. Otherwise binascii uses its own.
1622 if have_zlib:
1623 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1624 libraries = ['z']
1625 extra_link_args = zlib_extra_link_args
1626 else:
1627 extra_compile_args = []
1628 libraries = []
1629 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001630 self.add(Extension('binascii', ['binascii.c'],
1631 extra_compile_args=extra_compile_args,
1632 libraries=libraries,
1633 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001634
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001635 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001636 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001637 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001638 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1639 else:
1640 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001641 self.add(Extension('_bz2', ['_bz2module.c'],
1642 libraries=['bz2'],
1643 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001644 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001645 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001646
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001647 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001648 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001649 self.add(Extension('_lzma', ['_lzmamodule.c'],
1650 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001651 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001652 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001653
Victor Stinner5ec33a12019-03-01 16:43:28 +01001654 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001655 # Interface to the Expat XML parser
1656 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001657 # Expat was written by James Clark and is now maintained by a group of
1658 # developers on SourceForge; see www.libexpat.org for more information.
1659 # The pyexpat module was written by Paul Prescod after a prototype by
1660 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1661 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001662 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001663 #
1664 # More information on Expat can be found at www.libexpat.org.
1665 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001666 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1667 expat_inc = []
1668 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001669 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001670 expat_lib = ['expat']
1671 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001672 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001673 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001674 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001675 define_macros = [
1676 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001677 # bpo-30947: Python uses best available entropy sources to
1678 # call XML_SetHashSalt(), expat entropy sources are not needed
1679 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001680 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001681 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001682 expat_lib = []
1683 expat_sources = ['expat/xmlparse.c',
1684 'expat/xmlrole.c',
1685 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001686 expat_depends = ['expat/ascii.h',
1687 'expat/asciitab.h',
1688 'expat/expat.h',
1689 'expat/expat_config.h',
1690 'expat/expat_external.h',
1691 'expat/internal.h',
1692 'expat/latin1tab.h',
1693 'expat/utf8tab.h',
1694 'expat/xmlrole.h',
1695 'expat/xmltok.h',
1696 'expat/xmltok_impl.h'
1697 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001698
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001699 cc = sysconfig.get_config_var('CC').split()[0]
Victor Stinner6b982c22020-04-01 01:10:07 +02001700 ret = run_command(
Benjamin Peterson95da3102019-06-29 16:00:22 -07001701 '"%s" -Werror -Wno-unreachable-code -E -xc /dev/null >/dev/null 2>&1' % cc)
Victor Stinner6b982c22020-04-01 01:10:07 +02001702 if ret == 0:
Benjamin Peterson95da3102019-06-29 16:00:22 -07001703 extra_compile_args.append('-Wno-unreachable-code')
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001704
Victor Stinner8058bda2019-03-01 15:31:45 +01001705 self.add(Extension('pyexpat',
1706 define_macros=define_macros,
1707 extra_compile_args=extra_compile_args,
1708 include_dirs=expat_inc,
1709 libraries=expat_lib,
1710 sources=['pyexpat.c'] + expat_sources,
1711 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001712
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001713 # Fredrik Lundh's cElementTree module. Note that this also
1714 # uses expat (via the CAPI hook in pyexpat).
1715
Victor Stinner625dbf22019-03-01 15:59:39 +01001716 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001717 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001718 self.add(Extension('_elementtree',
1719 define_macros=define_macros,
1720 include_dirs=expat_inc,
1721 libraries=expat_lib,
1722 sources=['_elementtree.c'],
1723 depends=['pyexpat.c', *expat_sources,
1724 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001725 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001726 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001727
Victor Stinner5ec33a12019-03-01 16:43:28 +01001728 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001729 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001730 self.add(Extension('_multibytecodec',
1731 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001732 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001733 self.add(Extension('_codecs_%s' % loc,
1734 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001735
Victor Stinner5ec33a12019-03-01 16:43:28 +01001736 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001737 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001738 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001739 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1740 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001741
1742 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001743 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001744 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1745 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001746 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001747 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1748 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001749 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001750 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001751 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1752 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001753 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001754 self.add(Extension('_posixshmem', posixshmem_srcs,
1755 define_macros={},
1756 libraries=libs,
1757 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001758
Victor Stinner8058bda2019-03-01 15:31:45 +01001759 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001760 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001761
Victor Stinner5ec33a12019-03-01 16:43:28 +01001762 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001763 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001764 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001765 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001766 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001767 uuid_libs = ['uuid']
1768 else:
1769 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001770 self.add(Extension('_uuid', ['_uuidmodule.c'],
1771 libraries=uuid_libs,
1772 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001773 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001774 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001775
Victor Stinner5ec33a12019-03-01 16:43:28 +01001776 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001777 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001778 self.init_inc_lib_dirs()
1779
1780 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001781 if TEST_EXTENSIONS:
1782 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001783 self.detect_readline_curses()
1784 self.detect_crypt()
1785 self.detect_socket()
1786 self.detect_openssl_hashlib()
xdegaye2ee077f2019-04-09 17:20:08 +02001787 self.detect_hash_builtins()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001788 self.detect_dbm_gdbm()
1789 self.detect_sqlite()
1790 self.detect_platform_specific_exts()
1791 self.detect_nis()
1792 self.detect_compress_exts()
1793 self.detect_expat_elementtree()
1794 self.detect_multibytecodecs()
1795 self.detect_decimal()
1796 self.detect_ctypes()
1797 self.detect_multiprocessing()
1798 if not self.detect_tkinter():
1799 self.missing.append('_tkinter')
1800 self.detect_uuid()
1801
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001802## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001803## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001804
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001805 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Petr Viktorinc168b502020-12-08 17:36:53 +01001806 # Non-debug mode: Build xxlimited with limited API
Victor Stinnercfe172d2019-03-01 18:21:49 +01001807 self.add(Extension('xxlimited', ['xxlimited.c'],
Petr Viktorinc168b502020-12-08 17:36:53 +01001808 define_macros=[('Py_LIMITED_API', '0x03100000')]))
1809 self.add(Extension('xxlimited_35', ['xxlimited_35.c'],
Victor Stinnercfe172d2019-03-01 18:21:49 +01001810 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Petr Viktorinc168b502020-12-08 17:36:53 +01001811 else:
1812 # Debug mode: Build xxlimited with the full API
1813 # (which is compatible with the limited one)
1814 self.add(Extension('xxlimited', ['xxlimited.c']))
1815 self.add(Extension('xxlimited_35', ['xxlimited_35.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001816
Ned Deilyd819b932013-09-06 01:07:05 -07001817 def detect_tkinter_explicitly(self):
1818 # Build _tkinter using explicit locations for Tcl/Tk.
1819 #
1820 # This is enabled when both arguments are given to ./configure:
1821 #
1822 # --with-tcltk-includes="-I/path/to/tclincludes \
1823 # -I/path/to/tkincludes"
1824 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1825 # -L/path/to/tklibs -ltkm.n"
1826 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001827 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001828 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1829 #
1830 # This can be useful for building and testing tkinter with multiple
1831 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1832 # build of Tcl so you need to specify both arguments and use care when
1833 # overriding.
1834
1835 # The _TCLTK variables are created in the Makefile sharedmods target.
1836 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1837 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1838 if not (tcltk_includes and tcltk_libs):
1839 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001840 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001841
1842 extra_compile_args = tcltk_includes.split()
1843 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001844 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1845 define_macros=[('WITH_APPINIT', 1)],
1846 extra_compile_args = extra_compile_args,
1847 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001848 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001849
Victor Stinner625dbf22019-03-01 15:59:39 +01001850 def detect_tkinter_darwin(self):
Ned Deily1731d6d2020-05-18 04:32:38 -04001851 # Build default _tkinter on macOS using Tcl and Tk frameworks.
1852 #
1853 # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly
1854 # built and installed as macOS framework bundles. However,
1855 # for several reasons, we cannot take full advantage of the
1856 # Apple-supplied compiler chain's -framework options here.
1857 # Instead, we need to find and pass to the compiler the
1858 # absolute paths of the Tcl and Tk headers files we want to use
1859 # and the absolute path to the directory containing the Tcl
1860 # and Tk frameworks for linking.
1861 #
1862 # We want to handle here two common use cases on macOS:
1863 # 1. Build and link with system-wide third-party or user-built
1864 # Tcl and Tk frameworks installed in /Library/Frameworks.
1865 # 2. Build and link using a user-specified macOS SDK so that the
1866 # built Python can be exported to other systems. In this case,
1867 # search only the SDK's /Library/Frameworks (normally empty)
1868 # and /System/Library/Frameworks.
1869 #
1870 # Any other use case should be able to be handled explicitly by
1871 # using the options described above in detect_tkinter_explicitly().
1872 # In particular it would be good to handle here the case where
1873 # you want to build and link with a framework build of Tcl and Tk
1874 # that is not in /Library/Frameworks, say, in your private
1875 # $HOME/Library/Frameworks directory or elsewhere. It turns
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301876 # out to be difficult to make that work automatically here
Ned Deily1731d6d2020-05-18 04:32:38 -04001877 # without bringing into play more tools and magic. That case
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301878 # can be handled using a recipe with the right arguments
Ned Deily1731d6d2020-05-18 04:32:38 -04001879 # to detect_tkinter_explicitly().
1880 #
1881 # Note also that the fallback case here is to try to use the
1882 # Apple-supplied Tcl and Tk frameworks in /System/Library but
1883 # be forewarned that they are deprecated by Apple and typically
1884 # out-of-date and buggy; their use should be avoided if at
1885 # all possible by installing a newer version of Tcl and Tk in
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301886 # /Library/Frameworks before building Python without
Ned Deily1731d6d2020-05-18 04:32:38 -04001887 # an explicit SDK or by configuring build arguments explicitly.
1888
Jack Jansen0b06be72002-06-21 14:48:38 +00001889 from os.path import join, exists
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001890
Ned Deily1731d6d2020-05-18 04:32:38 -04001891 sysroot = macosx_sdk_root() # path to the SDK or '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001892
Ned Deily1731d6d2020-05-18 04:32:38 -04001893 if macosx_sdk_specified():
1894 # Use case #2: an SDK other than '/' was specified.
1895 # Only search there.
1896 framework_dirs = [
1897 join(sysroot, 'Library', 'Frameworks'),
1898 join(sysroot, 'System', 'Library', 'Frameworks'),
1899 ]
1900 else:
1901 # Use case #1: no explicit SDK selected.
1902 # Search the local system-wide /Library/Frameworks,
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301903 # not the one in the default SDK, otherwise fall back to
Ned Deily1731d6d2020-05-18 04:32:38 -04001904 # /System/Library/Frameworks whose header files may be in
1905 # the default SDK or, on older systems, actually installed.
1906 framework_dirs = [
1907 join('/', 'Library', 'Frameworks'),
1908 join(sysroot, 'System', 'Library', 'Frameworks'),
1909 ]
1910
1911 # Find the directory that contains the Tcl.framework and
1912 # Tk.framework bundles.
Jack Jansen0b06be72002-06-21 14:48:38 +00001913 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001914 # both Tcl.framework and Tk.framework should be present
Jack Jansen0b06be72002-06-21 14:48:38 +00001915 for fw in 'Tcl', 'Tk':
Ned Deily1731d6d2020-05-18 04:32:38 -04001916 if not exists(join(F, fw + '.framework')):
1917 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001918 else:
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301919 # ok, F is now directory with both frameworks. Continue
Jack Jansen0b06be72002-06-21 14:48:38 +00001920 # building
1921 break
1922 else:
1923 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1924 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001925 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001926
Jack Jansen0b06be72002-06-21 14:48:38 +00001927 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001928 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001929 for fw in ('Tcl', 'Tk')
Ned Deily1731d6d2020-05-18 04:32:38 -04001930 for H in ('Headers',)
Jack Jansen0b06be72002-06-21 14:48:38 +00001931 ]
1932
Ned Deily1731d6d2020-05-18 04:32:38 -04001933 # Add the base framework directory as well
1934 compile_args = ['-F', F]
Jack Jansen0b06be72002-06-21 14:48:38 +00001935
Ned Deily1731d6d2020-05-18 04:32:38 -04001936 # Do not build tkinter for archs that this Tk was not built with.
Georg Brandlfcaf9102008-07-16 02:17:56 +00001937 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001938 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001939
Ronald Oussorend097efe2009-09-15 19:07:58 +00001940 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1941 if not os.path.exists(self.build_temp):
1942 os.makedirs(self.build_temp)
1943
Ned Deily1731d6d2020-05-18 04:32:38 -04001944 run_command(
1945 "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile)
1946 )
Brett Cannon9f5db072010-10-29 20:19:27 +00001947 with open(tmpfile) as fp:
1948 detected_archs = []
1949 for ln in fp:
1950 a = ln.split()[-1]
1951 if a in archs:
1952 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001953 os.unlink(tmpfile)
1954
Ned Deily1731d6d2020-05-18 04:32:38 -04001955 arch_args = []
Ronald Oussorend097efe2009-09-15 19:07:58 +00001956 for a in detected_archs:
Ned Deily1731d6d2020-05-18 04:32:38 -04001957 arch_args.append('-arch')
1958 arch_args.append(a)
1959
1960 compile_args += arch_args
1961 link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk']), *arch_args]
1962
1963 # The X11/xlib.h file bundled in the Tk sources can cause function
1964 # prototype warnings from the compiler. Since we cannot easily fix
1965 # that, suppress the warnings here instead.
1966 if '-Wstrict-prototypes' in cflags.split():
1967 compile_args.append('-Wno-strict-prototypes')
Georg Brandlfcaf9102008-07-16 02:17:56 +00001968
Victor Stinnercfe172d2019-03-01 18:21:49 +01001969 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1970 define_macros=[('WITH_APPINIT', 1)],
1971 include_dirs=include_dirs,
1972 libraries=[],
Ned Deily1731d6d2020-05-18 04:32:38 -04001973 extra_compile_args=compile_args,
1974 extra_link_args=link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001975 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001976
Victor Stinner625dbf22019-03-01 15:59:39 +01001977 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001978 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001979
Ned Deilyd819b932013-09-06 01:07:05 -07001980 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1981 # configured or passed into the make target. If so, use these values
1982 # to build tkinter and bypass the searches for Tcl and TK in standard
1983 # locations.
1984 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01001985 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001986
Jack Jansen0b06be72002-06-21 14:48:38 +00001987 # Rather than complicate the code below, detecting and building
1988 # AquaTk is a separate method. Only one Tkinter will be built on
1989 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01001990 if (MACOS and self.detect_tkinter_darwin()):
1991 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001992
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001993 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001994 # The versions with dots are used on Unix, and the versions without
1995 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001996 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001997 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1998 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01001999 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002000 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01002001 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002002 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00002003 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002004 # Exit the loop when we've found the Tcl/Tk libraries
2005 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002006
Fredrik Lundhade711a2001-01-24 08:00:28 +00002007 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002008 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002009 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002010 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002011 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01002012 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002013 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
2014 # but the include subdirs are named like .../include/tcl8.3.
2015 dotversion = dotversion[:-1] + '.' + dotversion[-1]
2016 tcl_include_sub = []
2017 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01002018 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002019 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
2020 tk_include_sub += [dir + os.sep + "tk" + dotversion]
2021 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01002022 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
2023 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002024
Martin v. Löwise86a59a2003-05-03 08:45:51 +00002025 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002026 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002027 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01002028 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00002029
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002030 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002031
Victor Stinnercfe172d2019-03-01 18:21:49 +01002032 include_dirs = []
2033 libs = []
2034 defs = []
2035 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002036 for dir in tcl_includes + tk_includes:
2037 if dir not in include_dirs:
2038 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002039
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002040 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01002041 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002042 include_dirs.append('/usr/openwin/include')
2043 added_lib_dirs.append('/usr/openwin/lib')
2044 elif os.path.exists('/usr/X11R6/include'):
2045 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00002046 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002047 added_lib_dirs.append('/usr/X11R6/lib')
2048 elif os.path.exists('/usr/X11R5/include'):
2049 include_dirs.append('/usr/X11R5/include')
2050 added_lib_dirs.append('/usr/X11R5/lib')
2051 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002052 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002053 include_dirs.append('/usr/X11/include')
2054 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002055
Jason Tishler9181c942003-02-05 15:16:17 +00002056 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01002057 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00002058 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
2059 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01002060 return False
Jason Tishler9181c942003-02-05 15:16:17 +00002061
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002062 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01002063 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002064 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002065 defs.append( ('WITH_BLT', 1) )
2066 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01002067 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002068 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00002069 defs.append( ('WITH_BLT', 1) )
2070 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002071
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002072 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00002073 libs.append('tk'+ version)
2074 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002075
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002076 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01002077 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002078 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002079
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002080 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002081 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002082 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002083 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002084 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002085 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002086 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002087
Victor Stinnercfe172d2019-03-01 18:21:49 +01002088 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
2089 define_macros=[('WITH_APPINIT', 1)] + defs,
2090 include_dirs=include_dirs,
2091 libraries=libs,
2092 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002093 return True
2094
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002095 def configure_ctypes(self, ext):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002096 return True
2097
Victor Stinner625dbf22019-03-01 15:59:39 +01002098 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002099 # Thomas Heller's _ctypes module
Ronald Oussoren41761932020-11-08 10:05:27 +01002100
2101 if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS):
2102 self.use_system_libffi = True
2103 else:
2104 self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
2105
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002106 include_dirs = []
Victor Stinner1ae035b2020-04-17 17:47:20 +02002107 extra_compile_args = ['-DPy_BUILD_CORE_MODULE']
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002108 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002109 sources = ['_ctypes/_ctypes.c',
2110 '_ctypes/callbacks.c',
2111 '_ctypes/callproc.c',
2112 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00002113 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002114 depends = ['_ctypes/ctypes.h']
2115
Victor Stinner4cbea512019-02-28 17:48:38 +01002116 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00002117 sources.append('_ctypes/malloc_closure.c')
Ronald Oussoren41761932020-11-08 10:05:27 +01002118 extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1')
Christian Heimes78644762008-03-04 23:39:23 +00002119 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002120 include_dirs.append('_ctypes/darwin')
Thomas Hellercf567c12006-03-08 19:51:58 +00002121
Victor Stinner4cbea512019-02-28 17:48:38 +01002122 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002123 # XXX This shouldn't be necessary; it appears that some
2124 # of the assembler code is non-PIC (i.e. it has relocations
2125 # when it shouldn't. The proper fix would be to rewrite
2126 # the assembler code to be PIC.
2127 # This only works with GCC; the Sun compiler likely refuses
2128 # this option. If you want to compile ctypes with the Sun
2129 # compiler, please research a proper solution, instead of
2130 # finding some -z option for the Sun compiler.
2131 extra_link_args.append('-mimpure-text')
2132
Victor Stinner4cbea512019-02-28 17:48:38 +01002133 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00002134 extra_link_args.append('-fPIC')
2135
Thomas Hellercf567c12006-03-08 19:51:58 +00002136 ext = Extension('_ctypes',
2137 include_dirs=include_dirs,
2138 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002139 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002140 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002141 sources=sources,
2142 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01002143 self.add(ext)
2144 if TEST_EXTENSIONS:
2145 # function my_sqrt() needs libm for sqrt()
2146 self.add(Extension('_ctypes_test',
2147 sources=['_ctypes/_ctypes_test.c'],
2148 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00002149
Ronald Oussoren41761932020-11-08 10:05:27 +01002150 ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
2151 ffi_lib = None
2152
Victor Stinner625dbf22019-03-01 15:59:39 +01002153 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01002154 if MACOS:
Ronald Oussoren41761932020-11-08 10:05:27 +01002155 ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi")
Christian Heimes78644762008-03-04 23:39:23 +00002156
Ronald Oussoren41761932020-11-08 10:05:27 +01002157 if not ffi_inc:
2158 if os.path.exists(ffi_in_sdk):
2159 ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1")
2160 ffi_inc = ffi_in_sdk
2161 ffi_lib = 'ffi'
2162 else:
2163 # OS X 10.5 comes with libffi.dylib; the include files are
2164 # in /usr/include/ffi
2165 ffi_inc_dirs.append('/usr/include/ffi')
2166
2167 if not ffi_inc:
2168 found = find_file('ffi.h', [], ffi_inc_dirs)
2169 if found:
2170 ffi_inc = found[0]
2171 if ffi_inc:
2172 ffi_h = ffi_inc + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002173 if not os.path.exists(ffi_h):
2174 ffi_inc = None
2175 print('Header file {} does not exist'.format(ffi_h))
Ronald Oussoren41761932020-11-08 10:05:27 +01002176 if ffi_lib is None and ffi_inc:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002177 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002178 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002179 ffi_lib = lib_name
2180 break
2181
2182 if ffi_inc and ffi_lib:
Ronald Oussoren41761932020-11-08 10:05:27 +01002183 ffi_headers = glob(os.path.join(ffi_inc, '*.h'))
2184 if grep_headers_for('ffi_prep_cif_var', ffi_headers):
2185 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1")
2186 if grep_headers_for('ffi_prep_closure_loc', ffi_headers):
2187 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1")
2188 if grep_headers_for('ffi_closure_alloc', ffi_headers):
2189 ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1")
2190
2191 ext.include_dirs.append(ffi_inc)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002192 ext.libraries.append(ffi_lib)
2193 self.use_system_libffi = True
2194
Christian Heimes5bb96922018-02-25 10:22:14 +01002195 if sysconfig.get_config_var('HAVE_LIBDL'):
2196 # for dlopen, see bpo-32647
2197 ext.libraries.append('dl')
2198
Victor Stinner5ec33a12019-03-01 16:43:28 +01002199 def detect_decimal(self):
2200 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002201 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002202 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002203 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2204 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002205 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002206 sources = ['_decimal/_decimal.c']
2207 depends = ['_decimal/docstrings.h']
2208 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002209 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002210 'Modules',
2211 '_decimal',
2212 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002213 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002214 sources = [
2215 '_decimal/_decimal.c',
2216 '_decimal/libmpdec/basearith.c',
2217 '_decimal/libmpdec/constants.c',
2218 '_decimal/libmpdec/context.c',
2219 '_decimal/libmpdec/convolute.c',
2220 '_decimal/libmpdec/crt.c',
2221 '_decimal/libmpdec/difradix2.c',
2222 '_decimal/libmpdec/fnt.c',
2223 '_decimal/libmpdec/fourstep.c',
2224 '_decimal/libmpdec/io.c',
Stefan Krahf117d872019-07-10 18:27:38 +02002225 '_decimal/libmpdec/mpalloc.c',
Stefan Krah60187b52012-03-23 19:06:27 +01002226 '_decimal/libmpdec/mpdecimal.c',
2227 '_decimal/libmpdec/numbertheory.c',
2228 '_decimal/libmpdec/sixstep.c',
2229 '_decimal/libmpdec/transpose.c',
2230 ]
2231 depends = [
2232 '_decimal/docstrings.h',
2233 '_decimal/libmpdec/basearith.h',
2234 '_decimal/libmpdec/bits.h',
2235 '_decimal/libmpdec/constants.h',
2236 '_decimal/libmpdec/convolute.h',
2237 '_decimal/libmpdec/crt.h',
2238 '_decimal/libmpdec/difradix2.h',
2239 '_decimal/libmpdec/fnt.h',
2240 '_decimal/libmpdec/fourstep.h',
2241 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002242 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002243 '_decimal/libmpdec/mpdecimal.h',
2244 '_decimal/libmpdec/numbertheory.h',
2245 '_decimal/libmpdec/sixstep.h',
2246 '_decimal/libmpdec/transpose.h',
2247 '_decimal/libmpdec/typearith.h',
2248 '_decimal/libmpdec/umodarith.h',
2249 ]
2250
Stefan Krah1919b7e2012-03-21 18:25:23 +01002251 config = {
2252 'x64': [('CONFIG_64','1'), ('ASM','1')],
2253 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2254 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2255 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2256 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2257 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2258 ('LEGACY_COMPILER','1')],
2259 'universal': [('UNIVERSAL','1')]
2260 }
2261
Stefan Krah1919b7e2012-03-21 18:25:23 +01002262 cc = sysconfig.get_config_var('CC')
2263 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2264 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2265
2266 if machine:
2267 # Override automatic configuration to facilitate testing.
2268 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002269 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002270 # Universal here means: build with the same options Python
2271 # was built with.
2272 define_macros = config['universal']
2273 elif sizeof_size_t == 8:
2274 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2275 define_macros = config['x64']
2276 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2277 define_macros = config['uint128']
2278 else:
2279 define_macros = config['ansi64']
2280 elif sizeof_size_t == 4:
2281 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2282 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002283 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002284 # solaris: problems with register allocation.
2285 # icc >= 11.0 works as well.
2286 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002287 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002288 else:
2289 define_macros = config['ansi32']
2290 else:
2291 raise DistutilsError("_decimal: unsupported architecture")
2292
2293 # Workarounds for toolchain bugs:
2294 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2295 # Some versions of gcc miscompile inline asm:
2296 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2297 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2298 extra_compile_args.append('-fno-ipa-pure-const')
2299 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2300 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2301 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2302 undef_macros.append('_FORTIFY_SOURCE')
2303
Stefan Krah1919b7e2012-03-21 18:25:23 +01002304 # Uncomment for extra functionality:
2305 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002306 self.add(Extension('_decimal',
2307 include_dirs=include_dirs,
2308 libraries=libraries,
2309 define_macros=define_macros,
2310 undef_macros=undef_macros,
2311 extra_compile_args=extra_compile_args,
2312 sources=sources,
2313 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002314
Victor Stinner5ec33a12019-03-01 16:43:28 +01002315 def detect_openssl_hashlib(self):
2316 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002317 config_vars = sysconfig.get_config_vars()
2318
2319 def split_var(name, sep):
2320 # poor man's shlex, the re module is not available yet.
2321 value = config_vars.get(name)
2322 if not value:
2323 return ()
2324 # This trick works because ax_check_openssl uses --libs-only-L,
2325 # --libs-only-l, and --cflags-only-I.
2326 value = ' ' + value
2327 sep = ' ' + sep
2328 return [v.strip() for v in value.split(sep) if v.strip()]
2329
2330 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2331 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2332 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2333 if not openssl_libs:
2334 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002335 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002336 return None, None
2337
2338 # Find OpenSSL includes
2339 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002340 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002341 )
2342 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002343 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002344 return None, None
2345
2346 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2347 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002348 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002349 ['/usr/kerberos/include']
2350 )
2351 if krb5_h:
2352 ssl_incs.extend(krb5_h)
2353
Christian Heimes61d478c2018-01-27 15:51:38 +01002354 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Christian Heimesc7f70692019-05-31 11:44:05 +02002355 self.add(Extension(
2356 '_ssl', ['_ssl.c'],
2357 include_dirs=openssl_includes,
2358 library_dirs=openssl_libdirs,
2359 libraries=openssl_libs,
2360 depends=['socketmodule.h', '_ssl/debughelpers.c'])
2361 )
Christian Heimes61d478c2018-01-27 15:51:38 +01002362 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002363 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002364
Victor Stinner8058bda2019-03-01 15:31:45 +01002365 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2366 depends=['hashlib.h'],
2367 include_dirs=openssl_includes,
2368 library_dirs=openssl_libdirs,
2369 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002370
xdegaye2ee077f2019-04-09 17:20:08 +02002371 def detect_hash_builtins(self):
Christian Heimes9b60e552020-05-15 23:54:53 +02002372 # By default we always compile these even when OpenSSL is available
2373 # (issue #14693). It's harmless and the object code is tiny
2374 # (40-50 KiB per module, only loaded when actually used). Modules can
2375 # be disabled via the --with-builtin-hashlib-hashes configure flag.
2376 supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"}
Victor Stinner5ec33a12019-03-01 16:43:28 +01002377
Christian Heimes9b60e552020-05-15 23:54:53 +02002378 configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES")
2379 configured = configured.strip('"').lower()
2380 configured = {
2381 m.strip() for m in configured.split(",")
2382 }
Victor Stinner5ec33a12019-03-01 16:43:28 +01002383
Christian Heimes9b60e552020-05-15 23:54:53 +02002384 self.disabled_configure.extend(
2385 sorted(supported.difference(configured))
2386 )
Victor Stinner5ec33a12019-03-01 16:43:28 +01002387
Christian Heimes9b60e552020-05-15 23:54:53 +02002388 if "sha256" in configured:
2389 self.add(Extension(
2390 '_sha256', ['sha256module.c'],
2391 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2392 depends=['hashlib.h']
2393 ))
2394
2395 if "sha512" in configured:
2396 self.add(Extension(
2397 '_sha512', ['sha512module.c'],
2398 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2399 depends=['hashlib.h']
2400 ))
2401
2402 if "md5" in configured:
2403 self.add(Extension(
2404 '_md5', ['md5module.c'],
2405 depends=['hashlib.h']
2406 ))
2407
2408 if "sha1" in configured:
2409 self.add(Extension(
2410 '_sha1', ['sha1module.c'],
2411 depends=['hashlib.h']
2412 ))
2413
2414 if "blake2" in configured:
2415 blake2_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002416 os.path.join(escape(self.srcdir), 'Modules/_blake2/impl/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002417 )
2418 blake2_deps.append('hashlib.h')
2419 self.add(Extension(
2420 '_blake2',
2421 [
2422 '_blake2/blake2module.c',
2423 '_blake2/blake2b_impl.c',
2424 '_blake2/blake2s_impl.c'
2425 ],
2426 depends=blake2_deps
2427 ))
2428
2429 if "sha3" in configured:
2430 sha3_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002431 os.path.join(escape(self.srcdir), 'Modules/_sha3/kcp/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002432 )
2433 sha3_deps.append('hashlib.h')
2434 self.add(Extension(
2435 '_sha3',
2436 ['_sha3/sha3module.c'],
2437 depends=sha3_deps
2438 ))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002439
2440 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002441 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002442 self.missing.append('nis')
2443 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002444
2445 libs = []
2446 library_dirs = []
2447 includes_dirs = []
2448
2449 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2450 # moved headers and libraries to libtirpc and libnsl. The headers
2451 # are in tircp and nsl sub directories.
2452 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002453 'rpcsvc/yp_prot.h', self.inc_dirs,
2454 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002455 )
2456 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002457 'rpc/rpc.h', self.inc_dirs,
2458 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002459 )
2460 if rpcsvc_inc is None or rpc_inc is None:
2461 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002462 self.missing.append('nis')
2463 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002464 includes_dirs.extend(rpcsvc_inc)
2465 includes_dirs.extend(rpc_inc)
2466
Victor Stinner625dbf22019-03-01 15:59:39 +01002467 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002468 libs.append('nsl')
2469 else:
2470 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002471 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002472 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2473 if libnsl is not None:
2474 library_dirs.append(os.path.dirname(libnsl))
2475 libs.append('nsl')
2476
Victor Stinner625dbf22019-03-01 15:59:39 +01002477 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002478 libs.append('tirpc')
2479
Victor Stinner8058bda2019-03-01 15:31:45 +01002480 self.add(Extension('nis', ['nismodule.c'],
2481 libraries=libs,
2482 library_dirs=library_dirs,
2483 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002484
Christian Heimesff5be6e2018-01-20 13:19:21 +01002485
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002486class PyBuildInstall(install):
2487 # Suppress the warning about installation into the lib_dynload
2488 # directory, which is not in sys.path when running Python during
2489 # installation:
2490 def initialize_options (self):
2491 install.initialize_options(self)
2492 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002493
Éric Araujoe6792c12011-06-09 14:07:02 +02002494 # Customize subcommands to not install an egg-info file for Python
2495 sub_commands = [('install_lib', install.has_lib),
2496 ('install_headers', install.has_headers),
2497 ('install_scripts', install.has_scripts),
2498 ('install_data', install.has_data)]
2499
2500
Michael W. Hudson529a5052002-12-17 16:47:17 +00002501class PyBuildInstallLib(install_lib):
2502 # Do exactly what install_lib does but make sure correct access modes get
2503 # set on installed directories and files. All installed files with get
2504 # mode 644 unless they are a shared library in which case they will get
2505 # mode 755. All installed directories will get mode 755.
2506
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002507 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2508 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002509
2510 def install(self):
2511 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002512 self.set_file_modes(outfiles, 0o644, 0o755)
2513 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002514 return outfiles
2515
2516 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002517 if not files: return
2518
2519 for filename in files:
2520 if os.path.islink(filename): continue
2521 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002522 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002523 log.info("changing mode of %s to %o", filename, mode)
2524 if not self.dry_run: os.chmod(filename, mode)
2525
2526 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002527 for dirpath, dirnames, fnames in os.walk(dirname):
2528 if os.path.islink(dirpath):
2529 continue
2530 log.info("changing mode of %s to %o", dirpath, mode)
2531 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002532
Victor Stinnerc991f242019-03-01 17:19:04 +01002533
Georg Brandlff52f762010-12-28 09:51:43 +00002534class PyBuildScripts(build_scripts):
2535 def copy_scripts(self):
2536 outfiles, updated_files = build_scripts.copy_scripts(self)
2537 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2538 minoronly = '.{0[1]}'.format(sys.version_info)
2539 newoutfiles = []
2540 newupdated_files = []
2541 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002542 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002543 newfilename = filename + fullversion
2544 else:
2545 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002546 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002547 os.rename(filename, newfilename)
2548 newoutfiles.append(newfilename)
2549 if filename in updated_files:
2550 newupdated_files.append(newfilename)
2551 return newoutfiles, newupdated_files
2552
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002553
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002554def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002555 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2556 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2557
2558 class DummyProcess:
2559 """Hack for parallel build"""
2560 ProcessPoolExecutor = None
2561
2562 sys.modules['concurrent.futures.process'] = DummyProcess
Paul Ganssle62972d92020-05-16 04:20:06 -04002563 validate_tzpath()
Victor Stinnerc991f242019-03-01 17:19:04 +01002564
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002565 # turn off warnings when deprecated modules are imported
2566 import warnings
2567 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002568 setup(# PyPI Metadata (PEP 301)
2569 name = "Python",
2570 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002571 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002572 maintainer = "Guido van Rossum and the Python community",
2573 maintainer_email = "python-dev@python.org",
2574 description = "A high-level object-oriented programming language",
2575 long_description = SUMMARY.strip(),
2576 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002577 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002578 platforms = ["Many"],
2579
2580 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002581 cmdclass = {'build_ext': PyBuildExt,
2582 'build_scripts': PyBuildScripts,
2583 'install': PyBuildInstall,
2584 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002585 # The struct module is defined here, because build_ext won't be
2586 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002587 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002588
Georg Brandlff52f762010-12-28 09:51:43 +00002589 # If you change the scripts installed here, you also need to
2590 # check the PyBuildScripts command above, and change the links
2591 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002592 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002593 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002594 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002595
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002596# --install-platlib
2597if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002598 main()