blob: c12b5f5042551a708ee47e261c330dc1bd54c5ad [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
Michael W. Hudson529a5052002-12-17 16:47:17 +000012
Victor Stinner1ec63b62020-03-04 14:50:19 +010013
14try:
15 import subprocess
16 del subprocess
17 SUBPROCESS_BOOTSTRAP = False
18except ImportError:
Victor Stinner1ec63b62020-03-04 14:50:19 +010019 # Bootstrap Python: distutils.spawn uses subprocess to build C extensions,
20 # subprocess requires C extensions built by setup.py like _posixsubprocess.
21 #
Victor Stinneraddaaaa2020-03-09 23:45:59 +010022 # Use _bootsubprocess which only uses the os module.
Victor Stinner1ec63b62020-03-04 14:50:19 +010023 #
24 # It is dropped from sys.modules as soon as all C extension modules
25 # are built.
Victor Stinneraddaaaa2020-03-09 23:45:59 +010026 import _bootsubprocess
27 sys.modules['subprocess'] = _bootsubprocess
28 del _bootsubprocess
29 SUBPROCESS_BOOTSTRAP = True
Victor Stinner1ec63b62020-03-04 14:50:19 +010030
31
Michael W. Hudson529a5052002-12-17 16:47:17 +000032from distutils import log
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000033from distutils.command.build_ext import build_ext
Victor Stinner625dbf22019-03-01 15:59:39 +010034from distutils.command.build_scripts import build_scripts
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000035from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000036from distutils.command.install_lib import install_lib
Victor Stinner625dbf22019-03-01 15:59:39 +010037from distutils.core import Extension, setup
38from distutils.errors import CCompilerError, DistutilsError
Stefan Krah095b2732010-06-08 13:41:44 +000039from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000040
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020041
Victor Stinnercfe172d2019-03-01 18:21:49 +010042# Compile extensions used to test Python?
43TEST_EXTENSIONS = True
44
45# This global variable is used to hold the list of modules to be disabled.
46DISABLED_MODULE_LIST = []
47
48
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020049def get_platform():
Victor Stinnerc991f242019-03-01 17:19:04 +010050 # Cross compiling
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020051 if "_PYTHON_HOST_PLATFORM" in os.environ:
52 return os.environ["_PYTHON_HOST_PLATFORM"]
Victor Stinnerc991f242019-03-01 17:19:04 +010053
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020054 # Get value of sys.platform
55 if sys.platform.startswith('osf1'):
56 return 'osf1'
57 return sys.platform
Victor Stinnerc991f242019-03-01 17:19:04 +010058
59
60CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ)
Victor Stinner4cbea512019-02-28 17:48:38 +010061HOST_PLATFORM = get_platform()
62MS_WINDOWS = (HOST_PLATFORM == 'win32')
63CYGWIN = (HOST_PLATFORM == 'cygwin')
64MACOS = (HOST_PLATFORM == 'darwin')
Michael Felt08970cb2019-06-21 15:58:00 +020065AIX = (HOST_PLATFORM.startswith('aix'))
Victor Stinner4cbea512019-02-28 17:48:38 +010066VXWORKS = ('vxworks' in HOST_PLATFORM)
pxinwr32f5fdd2019-02-27 19:09:28 +080067
Victor Stinnerc991f242019-03-01 17:19:04 +010068
69SUMMARY = """
70Python is an interpreted, interactive, object-oriented programming
71language. It is often compared to Tcl, Perl, Scheme or Java.
72
73Python combines remarkable power with very clear syntax. It has
74modules, classes, exceptions, very high level dynamic data types, and
75dynamic typing. There are interfaces to many system calls and
76libraries, as well as to various windowing systems (X11, Motif, Tk,
77Mac, MFC). New built-in modules are easily written in C or C++. Python
78is also usable as an extension language for applications that need a
79programmable interface.
80
81The Python implementation is portable: it runs on many brands of UNIX,
82on Windows, DOS, Mac, Amiga... If your favorite system isn't
83listed here, it may still be supported, if there's a C compiler for
84it. Ask around on comp.lang.python -- or just try compiling Python
85yourself.
86"""
87
88CLASSIFIERS = """
89Development Status :: 6 - Mature
90License :: OSI Approved :: Python Software Foundation License
91Natural Language :: English
92Programming Language :: C
93Programming Language :: Python
94Topic :: Software Development
95"""
96
97
Victor Stinner6b982c22020-04-01 01:10:07 +020098def run_command(cmd):
99 status = os.system(cmd)
Victor Stinner65a796e2020-04-01 18:49:29 +0200100 return os.waitstatus_to_exitcode(status)
Victor Stinner6b982c22020-04-01 01:10:07 +0200101
102
Victor Stinnerc991f242019-03-01 17:19:04 +0100103# Set common compiler and linker flags derived from the Makefile,
104# reserved for building the interpreter and the stdlib modules.
105# See bpo-21121 and bpo-35257
106def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
107 flags = sysconfig.get_config_var(compiler_flags)
108 py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
109 sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
110
111
Michael W. Hudson39230b32002-01-16 15:26:48 +0000112def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000113 """Add the directory 'dir' to the list 'dirlist' (after any relative
114 directories) if:
115
Michael W. Hudson39230b32002-01-16 15:26:48 +0000116 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000117 2) 'dir' actually exists, and is a directory.
118 """
119 if dir is None or not os.path.isdir(dir) or dir in dirlist:
120 return
121 for i, path in enumerate(dirlist):
122 if not os.path.isabs(path):
123 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +0000124 return
125 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +0000126
Victor Stinnerc991f242019-03-01 17:19:04 +0100127
xdegaye77f51392017-11-25 17:25:30 +0100128def sysroot_paths(make_vars, subdirs):
129 """Get the paths of sysroot sub-directories.
130
131 * make_vars: a sequence of names of variables of the Makefile where
132 sysroot may be set.
133 * subdirs: a sequence of names of subdirectories used as the location for
134 headers or libraries.
135 """
136
137 dirs = []
138 for var_name in make_vars:
139 var = sysconfig.get_config_var(var_name)
140 if var is not None:
141 m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
142 if m is not None:
143 sysroot = m.group(1).strip('"')
144 for subdir in subdirs:
145 if os.path.isabs(subdir):
146 subdir = subdir[1:]
147 path = os.path.join(sysroot, subdir)
148 if os.path.isdir(path):
149 dirs.append(path)
150 break
151 return dirs
152
Ned Deily1731d6d2020-05-18 04:32:38 -0400153
Ned Deily0288dd62019-06-03 06:34:48 -0400154MACOS_SDK_ROOT = None
Ned Deily1731d6d2020-05-18 04:32:38 -0400155MACOS_SDK_SPECIFIED = None
Victor Stinnerc991f242019-03-01 17:19:04 +0100156
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000157def macosx_sdk_root():
Ned Deily0288dd62019-06-03 06:34:48 -0400158 """Return the directory of the current macOS SDK.
159
160 If no SDK was explicitly configured, call the compiler to find which
161 include files paths are being searched by default. Use '/' if the
162 compiler is searching /usr/include (meaning system header files are
163 installed) or use the root of an SDK if that is being searched.
164 (The SDK may be supplied via Xcode or via the Command Line Tools).
165 The SDK paths used by Apple-supplied tool chains depend on the
166 setting of various variables; see the xcrun man page for more info.
Ned Deily1731d6d2020-05-18 04:32:38 -0400167 Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified().
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000168 """
Ned Deily1731d6d2020-05-18 04:32:38 -0400169 global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED
Ned Deily0288dd62019-06-03 06:34:48 -0400170
171 # If already called, return cached result.
172 if MACOS_SDK_ROOT:
173 return MACOS_SDK_ROOT
174
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000175 cflags = sysconfig.get_config_var('CFLAGS')
Joshua Rootb3107002020-04-22 17:44:10 +1000176 m = re.search(r'-isysroot\s*(\S+)', cflags)
Ned Deily0288dd62019-06-03 06:34:48 -0400177 if m is not None:
178 MACOS_SDK_ROOT = m.group(1)
Ned Deily1731d6d2020-05-18 04:32:38 -0400179 MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000180 else:
Ned Deily0288dd62019-06-03 06:34:48 -0400181 MACOS_SDK_ROOT = '/'
Ned Deily1731d6d2020-05-18 04:32:38 -0400182 MACOS_SDK_SPECIFIED = False
Ned Deily0288dd62019-06-03 06:34:48 -0400183 cc = sysconfig.get_config_var('CC')
184 tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid()
185 try:
186 os.unlink(tmpfile)
187 except:
188 pass
Victor Stinner6b982c22020-04-01 01:10:07 +0200189 ret = run_command('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
Ned Deily0288dd62019-06-03 06:34:48 -0400190 in_incdirs = False
191 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200192 if ret == 0:
Ned Deily0288dd62019-06-03 06:34:48 -0400193 with open(tmpfile) as fp:
194 for line in fp.readlines():
195 if line.startswith("#include <...>"):
196 in_incdirs = True
197 elif line.startswith("End of search list"):
198 in_incdirs = False
199 elif in_incdirs:
200 line = line.strip()
201 if line == '/usr/include':
202 MACOS_SDK_ROOT = '/'
203 elif line.endswith(".sdk/usr/include"):
204 MACOS_SDK_ROOT = line[:-12]
205 finally:
206 os.unlink(tmpfile)
207
208 return MACOS_SDK_ROOT
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000209
Victor Stinnerc991f242019-03-01 17:19:04 +0100210
Ned Deily1731d6d2020-05-18 04:32:38 -0400211def macosx_sdk_specified():
212 """Returns true if an SDK was explicitly configured.
213
214 True if an SDK was selected at configure time, either by specifying
215 --enable-universalsdk=(something other than no or /) or by adding a
216 -isysroot option to CFLAGS. In some cases, like when making
217 decisions about macOS Tk framework paths, we need to be able to
218 know whether the user explicitly asked to build with an SDK versus
219 the implicit use of an SDK when header files are no longer
220 installed on a running system by the Command Line Tools.
221 """
222 global MACOS_SDK_SPECIFIED
223
224 # If already called, return cached result.
225 if MACOS_SDK_SPECIFIED:
226 return MACOS_SDK_SPECIFIED
227
228 # Find the sdk root and set MACOS_SDK_SPECIFIED
229 macosx_sdk_root()
230 return MACOS_SDK_SPECIFIED
231
232
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000233def is_macosx_sdk_path(path):
234 """
235 Returns True if 'path' can be located in an OSX SDK
236 """
Ned Deily2910a7b2012-07-30 02:35:58 -0700237 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
238 or path.startswith('/System/')
239 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000240
Victor Stinnerc991f242019-03-01 17:19:04 +0100241
Ronald Oussoren41761932020-11-08 10:05:27 +0100242def grep_headers_for(function, headers):
243 for header in headers:
244 with open(header, 'r') as f:
245 if function in f.read():
246 return True
247 return False
248
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000249def find_file(filename, std_dirs, paths):
250 """Searches for the directory where a given file is located,
251 and returns a possibly-empty list of additional directories, or None
252 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +0000253
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000254 'filename' is the name of a file, such as readline.h or libcrypto.a.
255 'std_dirs' is the list of standard system directories; if the
256 file is found in one of them, no additional directives are needed.
257 'paths' is a list of additional locations to check; if the file is
258 found in one of them, the resulting list will contain the directory.
259 """
Victor Stinner4cbea512019-02-28 17:48:38 +0100260 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000261 # Honor the MacOSX SDK setting when one was specified.
262 # An SDK is a directory with the same structure as a real
263 # system, but with only header files and libraries.
264 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000265
266 # Check the standard locations
267 for dir in std_dirs:
268 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000269
Victor Stinner4cbea512019-02-28 17:48:38 +0100270 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000271 f = os.path.join(sysroot, dir[1:], filename)
272
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000273 if os.path.exists(f): return []
274
275 # Check the additional directories
276 for dir in paths:
277 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000278
Victor Stinner4cbea512019-02-28 17:48:38 +0100279 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000280 f = os.path.join(sysroot, dir[1:], filename)
281
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000282 if os.path.exists(f):
283 return [dir]
284
285 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000286 return None
287
Victor Stinnerc991f242019-03-01 17:19:04 +0100288
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000289def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000290 result = compiler.find_library_file(std_dirs + paths, libname)
291 if result is None:
292 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000293
Victor Stinner4cbea512019-02-28 17:48:38 +0100294 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000295 sysroot = macosx_sdk_root()
296
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000297 # Check whether the found file is in one of the standard directories
298 dirname = os.path.dirname(result)
299 for p in std_dirs:
300 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000301 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000302
Victor Stinner4cbea512019-02-28 17:48:38 +0100303 if MACOS and is_macosx_sdk_path(p):
Ned Deily020250f2016-02-25 00:56:38 +1100304 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
305 # libraries with .tbd extensions rather than the normal .dylib
306 # shared libraries installed in /. The Apple compiler tool
307 # chain handles this transparently but it can cause problems
308 # for programs that are being built with an SDK and searching
309 # for specific libraries. Distutils find_library_file() now
310 # knows to also search for and return .tbd files. But callers
311 # of find_library_file need to keep in mind that the base filename
312 # of the returned SDK library file might have a different extension
313 # from that of the library file installed on the running system,
314 # for example:
315 # /Applications/Xcode.app/Contents/Developer/Platforms/
316 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
317 # usr/lib/libedit.tbd
318 # vs
319 # /usr/lib/libedit.dylib
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000320 if os.path.join(sysroot, p[1:]) == dirname:
321 return [ ]
322
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000323 if p == dirname:
324 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000325
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000326 # Otherwise, it must have been in one of the additional directories,
327 # so we have to figure out which one.
328 for p in paths:
329 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000330 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000331
Victor Stinner4cbea512019-02-28 17:48:38 +0100332 if MACOS and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000333 if os.path.join(sysroot, p[1:]) == dirname:
334 return [ p ]
335
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000336 if p == dirname:
337 return [p]
338 else:
339 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000340
Paul Ganssle62972d92020-05-16 04:20:06 -0400341def validate_tzpath():
342 base_tzpath = sysconfig.get_config_var('TZPATH')
343 if not base_tzpath:
344 return
345
346 tzpaths = base_tzpath.split(os.pathsep)
347 bad_paths = [tzpath for tzpath in tzpaths if not os.path.isabs(tzpath)]
348 if bad_paths:
349 raise ValueError('TZPATH must contain only absolute paths, '
350 + f'found:\n{tzpaths!r}\nwith invalid paths:\n'
351 + f'{bad_paths!r}')
Victor Stinnerc991f242019-03-01 17:19:04 +0100352
Jack Jansen144ebcc2001-08-05 22:31:19 +0000353def find_module_file(module, dirlist):
354 """Find a module in a set of possible folders. If it is not found
355 return the unadorned filename"""
356 list = find_file(module, [], dirlist)
357 if not list:
358 return module
359 if len(list) > 1:
Vinay Sajipdd917f82016-08-31 08:22:29 +0100360 log.info("WARNING: multiple copies of %s found", module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000361 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000362
Victor Stinnerc991f242019-03-01 17:19:04 +0100363
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000364class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000365
Guido van Rossumd8faa362007-04-27 19:54:29 +0000366 def __init__(self, dist):
367 build_ext.__init__(self, dist)
Victor Stinner625dbf22019-03-01 15:59:39 +0100368 self.srcdir = None
369 self.lib_dirs = None
370 self.inc_dirs = None
Victor Stinner5ec33a12019-03-01 16:43:28 +0100371 self.config_h_vars = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000372 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400373 self.failed_on_import = []
Victor Stinner8058bda2019-03-01 15:31:45 +0100374 self.missing = []
Christian Heimes9b60e552020-05-15 23:54:53 +0200375 self.disabled_configure = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200376 if '-j' in os.environ.get('MAKEFLAGS', ''):
377 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000378
Victor Stinner8058bda2019-03-01 15:31:45 +0100379 def add(self, ext):
380 self.extensions.append(ext)
381
Victor Stinner00c77ae2020-03-04 18:44:49 +0100382 def set_srcdir(self):
Victor Stinner625dbf22019-03-01 15:59:39 +0100383 self.srcdir = sysconfig.get_config_var('srcdir')
384 if not self.srcdir:
385 # Maybe running on Windows but not using CYGWIN?
386 raise ValueError("No source directory; cannot proceed.")
387 self.srcdir = os.path.abspath(self.srcdir)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000388
Victor Stinner00c77ae2020-03-04 18:44:49 +0100389 def remove_disabled(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000390 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000391 extensions = [ext for ext in self.extensions
Victor Stinner4cbea512019-02-28 17:48:38 +0100392 if ext.name not in DISABLED_MODULE_LIST]
Christian Heimes679db4a2008-01-18 09:56:22 +0000393 # move ctypes to the end, it depends on other modules
394 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
395 if "_ctypes" in ext_map:
396 ctypes = extensions.pop(ext_map["_ctypes"])
397 extensions.append(ctypes)
398 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000399
Victor Stinner00c77ae2020-03-04 18:44:49 +0100400 def update_sources_depends(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000401 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000402 # with Modules/.
Victor Stinner625dbf22019-03-01 15:59:39 +0100403 moddirlist = [os.path.join(self.srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000404
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000405 # Fix up the paths for scripts, too
Victor Stinner625dbf22019-03-01 15:59:39 +0100406 self.distribution.scripts = [os.path.join(self.srcdir, filename)
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000407 for filename in self.distribution.scripts]
408
Christian Heimesaf98da12008-01-27 15:18:18 +0000409 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000410 headers = [sysconfig.get_config_h_filename()]
Serhiy Storchaka93558682020-06-20 11:10:31 +0300411 headers += glob(os.path.join(escape(sysconfig.get_path('include')), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000412
Xavier de Gaye84968b72016-10-29 16:57:20 +0200413 for ext in self.extensions:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000414 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000415 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000416 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000417 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000418 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000419 else:
420 ext.depends = []
421 # re-compile extensions if a header file has been changed
422 ext.depends.extend(headers)
423
Victor Stinner00c77ae2020-03-04 18:44:49 +0100424 def remove_configured_extensions(self):
425 # The sysconfig variables built by makesetup that list the already
426 # built modules and the disabled modules as configured by the Setup
427 # files.
428 sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
429 sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
430
431 mods_built = []
432 mods_disabled = []
433 for ext in self.extensions:
xdegayec0364fc2017-05-27 18:25:03 +0200434 # If a module has already been built or has been disabled in the
435 # Setup files, don't build it here.
436 if ext.name in sysconf_built:
437 mods_built.append(ext)
438 if ext.name in sysconf_dis:
439 mods_disabled.append(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000440
xdegayec0364fc2017-05-27 18:25:03 +0200441 mods_configured = mods_built + mods_disabled
442 if mods_configured:
Xavier de Gaye84968b72016-10-29 16:57:20 +0200443 self.extensions = [x for x in self.extensions if x not in
xdegayec0364fc2017-05-27 18:25:03 +0200444 mods_configured]
445 # Remove the shared libraries built by a previous build.
446 for ext in mods_configured:
447 fullpath = self.get_ext_fullpath(ext.name)
448 if os.path.exists(fullpath):
449 os.unlink(fullpath)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000450
Victor Stinner00c77ae2020-03-04 18:44:49 +0100451 return (mods_built, mods_disabled)
452
453 def set_compiler_executables(self):
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000454 # When you run "make CC=altcc" or something similar, you really want
455 # those environment variables passed into the setup.py phase. Here's
456 # a small set of useful ones.
457 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000458 args = {}
459 # unfortunately, distutils doesn't let us provide separate C and C++
460 # compilers
461 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000462 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
463 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000464 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000465
Victor Stinner00c77ae2020-03-04 18:44:49 +0100466 def build_extensions(self):
467 self.set_srcdir()
468
469 # Detect which modules should be compiled
470 self.detect_modules()
471
472 self.remove_disabled()
473
474 self.update_sources_depends()
475 mods_built, mods_disabled = self.remove_configured_extensions()
476 self.set_compiler_executables()
477
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000478 build_ext.build_extensions(self)
479
Victor Stinner1ec63b62020-03-04 14:50:19 +0100480 if SUBPROCESS_BOOTSTRAP:
481 # Drop our custom subprocess module:
482 # use the newly built subprocess module
483 del sys.modules['subprocess']
484
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200485 for ext in self.extensions:
486 self.check_extension_import(ext)
487
Victor Stinner00c77ae2020-03-04 18:44:49 +0100488 self.summary(mods_built, mods_disabled)
489
490 def summary(self, mods_built, mods_disabled):
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300491 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400492 if self.failed or self.failed_on_import:
493 all_failed = self.failed + self.failed_on_import
494 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495
496 def print_three_column(lst):
497 lst.sort(key=str.lower)
498 # guarantee zip() doesn't drop anything
499 while len(lst) % 3:
500 lst.append("")
501 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
502 print("%-*s %-*s %-*s" % (longest, e, longest, f,
503 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000504
Victor Stinner8058bda2019-03-01 15:31:45 +0100505 if self.missing:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000506 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400507 print("Python build finished successfully!")
508 print("The necessary bits to build these optional modules were not "
509 "found:")
Victor Stinner8058bda2019-03-01 15:31:45 +0100510 print_three_column(self.missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000511 print("To find the necessary bits, look in setup.py in"
512 " detect_modules() for the module's name.")
513 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000514
xdegayec0364fc2017-05-27 18:25:03 +0200515 if mods_built:
516 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200517 print("The following modules found by detect_modules() in"
518 " setup.py, have been")
519 print("built by the Makefile instead, as configured by the"
520 " Setup files:")
xdegayec0364fc2017-05-27 18:25:03 +0200521 print_three_column([ext.name for ext in mods_built])
522 print()
523
524 if mods_disabled:
525 print()
526 print("The following modules found by detect_modules() in"
527 " setup.py have not")
528 print("been built, they are *disabled* in the Setup files:")
529 print_three_column([ext.name for ext in mods_disabled])
530 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200531
Christian Heimes9b60e552020-05-15 23:54:53 +0200532 if self.disabled_configure:
533 print()
534 print("The following modules found by detect_modules() in"
535 " setup.py have not")
536 print("been built, they are *disabled* by configure:")
537 print_three_column(self.disabled_configure)
538 print()
539
Guido van Rossumd8faa362007-04-27 19:54:29 +0000540 if self.failed:
541 failed = self.failed[:]
542 print()
543 print("Failed to build these modules:")
544 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000545 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000546
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400547 if self.failed_on_import:
548 failed = self.failed_on_import[:]
549 print()
550 print("Following modules built successfully"
551 " but were removed because they could not be imported:")
552 print_three_column(failed)
553 print()
554
Christian Heimes61d478c2018-01-27 15:51:38 +0100555 if any('_ssl' in l
Victor Stinner8058bda2019-03-01 15:31:45 +0100556 for l in (self.missing, self.failed, self.failed_on_import)):
Christian Heimes61d478c2018-01-27 15:51:38 +0100557 print()
558 print("Could not build the ssl module!")
559 print("Python requires an OpenSSL 1.0.2 or 1.1 compatible "
560 "libssl with X509_VERIFY_PARAM_set1_host().")
561 print("LibreSSL 2.6.4 and earlier do not provide the necessary "
562 "APIs, https://github.com/libressl-portable/portable/issues/381")
563 print()
564
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000565 def build_extension(self, ext):
566
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000567 if ext.name == '_ctypes':
568 if not self.configure_ctypes(ext):
Zachary Waref40d4dd2016-09-17 01:25:24 -0500569 self.failed.append(ext.name)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000570 return
571
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000572 try:
573 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000574 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000575 self.announce('WARNING: building of extension "%s" failed: %s' %
Victor Stinner625dbf22019-03-01 15:59:39 +0100576 (ext.name, why))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000577 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000578 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200579
580 def check_extension_import(self, ext):
581 # Don't try to import an extension that has failed to compile
582 if ext.name in self.failed:
583 self.announce(
584 'WARNING: skipping import check for failed build "%s"' %
585 ext.name, level=1)
586 return
587
Jack Jansenf49c6f92001-11-01 14:44:15 +0000588 # Workaround for Mac OS X: The Carbon-based modules cannot be
589 # reliably imported into a command-line Python
590 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000591 self.announce(
592 'WARNING: skipping import check for Carbon-based "%s"' %
593 ext.name)
594 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000595
Victor Stinner4cbea512019-02-28 17:48:38 +0100596 if MACOS and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000597 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000598 # Don't bother doing an import check when an extension was
599 # build with an explicit '-arch' flag on OSX. That's currently
600 # only used to build 32-bit only extensions in a 4-way
601 # universal build and loading 32-bit code into a 64-bit
602 # process will fail.
603 self.announce(
604 'WARNING: skipping import check for "%s"' %
605 ext.name)
606 return
607
Jason Tishler24cf7762002-05-22 16:46:15 +0000608 # Workaround for Cygwin: Cygwin currently has fork issues when many
609 # modules have been imported
Victor Stinner4cbea512019-02-28 17:48:38 +0100610 if CYGWIN:
Jason Tishler24cf7762002-05-22 16:46:15 +0000611 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
612 % ext.name)
613 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000614 ext_filename = os.path.join(
615 self.build_lib,
616 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000617
618 # If the build directory didn't exist when setup.py was
619 # started, sys.path_importer_cache has a negative result
620 # cached. Clear that cache before trying to import.
621 sys.path_importer_cache.clear()
622
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200623 # Don't try to load extensions for cross builds
Victor Stinner4cbea512019-02-28 17:48:38 +0100624 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200625 return
626
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400627 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700628 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
629 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000630 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400631 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000632 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400633 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000634 self.announce('*** WARNING: renaming "%s" since importing it'
635 ' failed: %s' % (ext.name, why), level=3)
636 assert not self.inplace
637 basename, tail = os.path.splitext(ext_filename)
638 newname = basename + "_failed" + tail
639 if os.path.exists(newname):
640 os.remove(newname)
641 os.rename(ext_filename, newname)
642
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000643 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000644 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000645 self.announce('*** WARNING: importing extension "%s" '
646 'failed with %s: %s' % (ext.name, exc_type, why),
647 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000648 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000649
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400650 def add_multiarch_paths(self):
651 # Debian/Ubuntu multiarch support.
652 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200653 cc = sysconfig.get_config_var('CC')
654 tmpfile = os.path.join(self.build_temp, 'multiarch')
655 if not os.path.exists(self.build_temp):
656 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200657 ret = run_command(
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200658 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
659 multiarch_path_component = ''
660 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200661 if ret == 0:
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200662 with open(tmpfile) as fp:
663 multiarch_path_component = fp.readline().strip()
664 finally:
665 os.unlink(tmpfile)
666
667 if multiarch_path_component != '':
668 add_dir_to_list(self.compiler.library_dirs,
669 '/usr/lib/' + multiarch_path_component)
670 add_dir_to_list(self.compiler.include_dirs,
671 '/usr/include/' + multiarch_path_component)
672 return
673
Barry Warsaw88e19452011-04-07 10:40:36 -0400674 if not find_executable('dpkg-architecture'):
675 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200676 opt = ''
Victor Stinner4cbea512019-02-28 17:48:38 +0100677 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200678 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400679 tmpfile = os.path.join(self.build_temp, 'multiarch')
680 if not os.path.exists(self.build_temp):
681 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200682 ret = run_command(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200683 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
684 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400685 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200686 if ret == 0:
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400687 with open(tmpfile) as fp:
688 multiarch_path_component = fp.readline().strip()
689 add_dir_to_list(self.compiler.library_dirs,
690 '/usr/lib/' + multiarch_path_component)
691 add_dir_to_list(self.compiler.include_dirs,
692 '/usr/include/' + multiarch_path_component)
693 finally:
694 os.unlink(tmpfile)
695
pxinwr32f5fdd2019-02-27 19:09:28 +0800696 def add_cross_compiling_paths(self):
697 cc = sysconfig.get_config_var('CC')
698 tmpfile = os.path.join(self.build_temp, 'ccpaths')
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200699 if not os.path.exists(self.build_temp):
700 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200701 ret = run_command('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200702 is_gcc = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800703 is_clang = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200704 in_incdirs = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200705 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200706 if ret == 0:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200707 with open(tmpfile) as fp:
708 for line in fp.readlines():
709 if line.startswith("gcc version"):
710 is_gcc = True
pxinwr32f5fdd2019-02-27 19:09:28 +0800711 elif line.startswith("clang version"):
712 is_clang = True
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200713 elif line.startswith("#include <...>"):
714 in_incdirs = True
715 elif line.startswith("End of search list"):
716 in_incdirs = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800717 elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200718 for d in line.strip().split("=")[1].split(":"):
719 d = os.path.normpath(d)
720 if '/gcc/' not in d:
721 add_dir_to_list(self.compiler.library_dirs,
722 d)
pxinwr32f5fdd2019-02-27 19:09:28 +0800723 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 +0200724 add_dir_to_list(self.compiler.include_dirs,
725 line.strip())
726 finally:
727 os.unlink(tmpfile)
728
Victor Stinnercfe172d2019-03-01 18:21:49 +0100729 def add_ldflags_cppflags(self):
Brett Cannon516592f2004-12-07 00:42:59 +0000730 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000731 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000732 # We must get the values from the Makefile and not the environment
733 # directly since an inconsistently reproducible issue comes up where
734 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000735 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000736 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000737 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
738 ('LDFLAGS', '-L', self.compiler.library_dirs),
739 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000740 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000741 if env_val:
Chih-Hsuan Yen09b2bec2018-07-11 16:48:43 +0800742 parser = argparse.ArgumentParser()
743 parser.add_argument(arg_name, dest="dirs", action="append")
744 options, _ = parser.parse_known_args(env_val.split())
Brett Cannon44837712005-01-02 21:54:07 +0000745 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000746 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000747 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000748
Victor Stinnercfe172d2019-03-01 18:21:49 +0100749 def configure_compiler(self):
750 # Ensure that /usr/local is always used, but the local build
751 # directories (i.e. '.' and 'Include') must be first. See issue
752 # 10520.
753 if not CROSS_COMPILING:
754 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
755 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
756 # only change this for cross builds for 3.3, issues on Mageia
757 if CROSS_COMPILING:
758 self.add_cross_compiling_paths()
759 self.add_multiarch_paths()
760 self.add_ldflags_cppflags()
761
Victor Stinner5ec33a12019-03-01 16:43:28 +0100762 def init_inc_lib_dirs(self):
Victor Stinner4cbea512019-02-28 17:48:38 +0100763 if (not CROSS_COMPILING and
Xavier de Gaye1351c312016-12-14 11:14:33 +0100764 os.path.normpath(sys.base_prefix) != '/usr' and
765 not sysconfig.get_config_var('PYTHONFRAMEWORK')):
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000766 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
767 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
768 # building a framework with different architectures than
769 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000770 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000771 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000772 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000773 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000774
xdegaye77f51392017-11-25 17:25:30 +0100775 system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
776 system_include_dirs = ['/usr/include']
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000777 # lib_dirs and inc_dirs are used to search for files;
778 # if a file is found in one of those directories, it can
779 # be assumed that no additional -I,-L directives are needed.
Victor Stinner4cbea512019-02-28 17:48:38 +0100780 if not CROSS_COMPILING:
Victor Stinner625dbf22019-03-01 15:59:39 +0100781 self.lib_dirs = self.compiler.library_dirs + system_lib_dirs
782 self.inc_dirs = self.compiler.include_dirs + system_include_dirs
Christian Heimesf19529c2012-12-12 12:41:00 +0100783 else:
xdegaye77f51392017-11-25 17:25:30 +0100784 # Add the sysroot paths. 'sysroot' is a compiler option used to
785 # set the logical path of the standard system headers and
786 # libraries.
Victor Stinner625dbf22019-03-01 15:59:39 +0100787 self.lib_dirs = (self.compiler.library_dirs +
788 sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs))
789 self.inc_dirs = (self.compiler.include_dirs +
790 sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'),
791 system_include_dirs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000792
Brett Cannon4454a1f2005-04-15 20:32:39 +0000793 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000794 with open(config_h) as file:
Victor Stinner5ec33a12019-03-01 16:43:28 +0100795 self.config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000796
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000797 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
Victor Stinner4cbea512019-02-28 17:48:38 +0100798 if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']:
Victor Stinner625dbf22019-03-01 15:59:39 +0100799 self.lib_dirs += ['/usr/ccs/lib']
Skip Montanaro22e00c42003-05-06 20:43:34 +0000800
Charles-François Natali5739e102012-04-12 19:07:25 +0200801 # HP-UX11iv3 keeps files in lib/hpux folders.
Victor Stinner4cbea512019-02-28 17:48:38 +0100802 if HOST_PLATFORM == 'hp-ux11':
Victor Stinner625dbf22019-03-01 15:59:39 +0100803 self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
Charles-François Natali5739e102012-04-12 19:07:25 +0200804
Victor Stinner4cbea512019-02-28 17:48:38 +0100805 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000806 # This should work on any unixy platform ;-)
807 # If the user has bothered specifying additional -I and -L flags
808 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000809 #
810 # NOTE: using shlex.split would technically be more correct, but
811 # also gives a bootstrap problem. Let's hope nobody uses
812 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000813 cflags, ldflags = sysconfig.get_config_vars(
814 'CFLAGS', 'LDFLAGS')
815 for item in cflags.split():
816 if item.startswith('-I'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100817 self.inc_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000818
819 for item in ldflags.split():
820 if item.startswith('-L'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100821 self.lib_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000822
Victor Stinner5ec33a12019-03-01 16:43:28 +0100823 def detect_simple_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000824 #
825 # The following modules are all pretty straightforward, and compile
826 # on pretty much any POSIXish platform.
827 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000828
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000829 # array objects
Victor Stinner8058bda2019-03-01 15:31:45 +0100830 self.add(Extension('array', ['arraymodule.c']))
Martin Panterc9deece2016-02-03 05:19:44 +0000831
Yury Selivanovf23746a2018-01-22 19:11:18 -0500832 # Context Variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100833 self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
Yury Selivanovf23746a2018-01-22 19:11:18 -0500834
Martin Panterc9deece2016-02-03 05:19:44 +0000835 shared_math = 'Modules/_math.o'
Victor Stinnercfe172d2019-03-01 18:21:49 +0100836
837 # math library functions, e.g. sin()
838 self.add(Extension('math', ['mathmodule.c'],
Victor Stinnere9e7d282020-02-12 22:54:42 +0100839 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100840 extra_objects=[shared_math],
841 depends=['_math.h', shared_math],
842 libraries=['m']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100843
844 # complex math library functions
845 self.add(Extension('cmath', ['cmathmodule.c'],
Victor Stinnere9e7d282020-02-12 22:54:42 +0100846 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100847 extra_objects=[shared_math],
848 depends=['_math.h', shared_math],
849 libraries=['m']))
Victor Stinnere0be4232011-10-25 13:06:09 +0200850
851 # time libraries: librt may be needed for clock_gettime()
852 time_libs = []
853 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
854 if lib:
855 time_libs.append(lib)
856
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000857 # time operations and variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100858 self.add(Extension('time', ['timemodule.c'],
859 libraries=time_libs))
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800860 # libm is needed by delta_new() that uses round() and by accum() that
861 # uses modf().
Victor Stinner8058bda2019-03-01 15:31:45 +0100862 self.add(Extension('_datetime', ['_datetimemodule.c'],
Victor Stinner04fc4f22020-06-16 01:28:07 +0200863 libraries=['m'],
864 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Paul Ganssle62972d92020-05-16 04:20:06 -0400865 # zoneinfo module
Victor Stinner37834132020-10-27 17:12:53 +0100866 self.add(Extension('_zoneinfo', ['_zoneinfo.c'],
867 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000868 # random number generator implemented in C
Victor Stinner9f5fe792020-04-17 19:05:35 +0200869 self.add(Extension("_random", ["_randommodule.c"],
870 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Raymond Hettinger0c410272004-01-05 10:13:35 +0000871 # bisect
Victor Stinner8058bda2019-03-01 15:31:45 +0100872 self.add(Extension("_bisect", ["_bisectmodule.c"]))
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000873 # heapq
Victor Stinnerc45dbe932020-06-22 17:39:32 +0200874 self.add(Extension("_heapq", ["_heapqmodule.c"],
875 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000876 # C-optimized pickle replacement
Victor Stinner5c75f372019-04-17 23:02:26 +0200877 self.add(Extension("_pickle", ["_pickle.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200878 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Collin Winter670e6922007-03-21 02:57:17 +0000879 # atexit
Victor Stinner8058bda2019-03-01 15:31:45 +0100880 self.add(Extension("atexit", ["atexitmodule.c"]))
Christian Heimes90540002008-05-08 14:29:10 +0000881 # _json speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100882 self.add(Extension("_json", ["_json.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200883 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100884
Fred Drake0e474a82007-10-11 18:01:43 +0000885 # profiler (_lsprof is for cProfile.py)
Victor Stinner8058bda2019-03-01 15:31:45 +0100886 self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000887 # static Unicode character database
Victor Stinner8058bda2019-03-01 15:31:45 +0100888 self.add(Extension('unicodedata', ['unicodedata.c'],
Victor Stinner47e1afd2020-10-26 16:43:47 +0100889 depends=['unicodedata_db.h', 'unicodename_db.h'],
890 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Larry Hastings3a907972013-11-23 14:49:22 -0800891 # _opcode module
Victor Stinner8058bda2019-03-01 15:31:45 +0100892 self.add(Extension('_opcode', ['_opcode.c']))
INADA Naoki9f2ce252016-10-15 15:39:19 +0900893 # asyncio speedups
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700894 self.add(Extension("_asyncio", ["_asynciomodule.c"],
895 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Ivan Levkivskyi03e3c342018-02-18 12:41:58 +0000896 # _abc speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100897 self.add(Extension("_abc", ["_abc.c"]))
Antoine Pitrou94e16962018-01-16 00:27:16 +0100898 # _queue module
Victor Stinner8058bda2019-03-01 15:31:45 +0100899 self.add(Extension("_queue", ["_queuemodule.c"]))
Dong-hee Na0a18ee42019-08-24 07:20:30 +0900900 # _statistics module
901 self.add(Extension("_statistics", ["_statisticsmodule.c"]))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000902
903 # Modules with some UNIX dependencies -- on by default:
904 # (If you have a really backward UNIX, select and socket may not be
905 # supported...)
906
907 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000908 libs = []
Victor Stinner5ec33a12019-03-01 16:43:28 +0100909 if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
Antoine Pitroua3000072010-09-07 14:52:42 +0000910 # May be necessary on AIX for flock function
911 libs = ['bsd']
Victor Stinner8058bda2019-03-01 15:31:45 +0100912 self.add(Extension('fcntl', ['fcntlmodule.c'],
913 libraries=libs))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000914 # pwd(3)
Victor Stinner8058bda2019-03-01 15:31:45 +0100915 self.add(Extension('pwd', ['pwdmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000916 # grp(3)
pxinwr32f5fdd2019-02-27 19:09:28 +0800917 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100918 self.add(Extension('grp', ['grpmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000919 # spwd, shadow passwords
Victor Stinner5ec33a12019-03-01 16:43:28 +0100920 if (self.config_h_vars.get('HAVE_GETSPNAM', False) or
921 self.config_h_vars.get('HAVE_GETSPENT', False)):
Victor Stinner8058bda2019-03-01 15:31:45 +0100922 self.add(Extension('spwd', ['spwdmodule.c']))
Michael Felt08970cb2019-06-21 15:58:00 +0200923 # AIX has shadow passwords, but access is not via getspent(), etc.
924 # module support is not expected so it not 'missing'
925 elif not AIX:
Victor Stinner8058bda2019-03-01 15:31:45 +0100926 self.missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000927
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000928 # select(2); not on ancient System V
Victor Stinner8058bda2019-03-01 15:31:45 +0100929 self.add(Extension('select', ['selectmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000930
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000931 # Memory-mapped files (also works on Win32).
Victor Stinner8058bda2019-03-01 15:31:45 +0100932 self.add(Extension('mmap', ['mmapmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000933
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000934 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000935 # syslog daemon interface
Victor Stinner8058bda2019-03-01 15:31:45 +0100936 self.add(Extension('syslog', ['syslogmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000937
Eric Snow7f8bfc92018-01-29 18:23:44 -0700938 # Python interface to subinterpreter C-API.
Eric Snowc11183c2019-03-15 16:35:46 -0600939 self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c']))
Eric Snow7f8bfc92018-01-29 18:23:44 -0700940
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000941 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000942 # Here ends the simple stuff. From here on, modules need certain
943 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000944 #
945
946 # Multimedia modules
947 # These don't work for 64-bit platforms!!!
948 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200949 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000950 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000951 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000952 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200953 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800954 # audioop needs libm for floor() in multiple functions.
Victor Stinner8058bda2019-03-01 15:31:45 +0100955 self.add(Extension('audioop', ['audioop.c'],
956 libraries=['m']))
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000957
Victor Stinner5ec33a12019-03-01 16:43:28 +0100958 # CSV files
959 self.add(Extension('_csv', ['_csv.c']))
960
961 # POSIX subprocess module helper.
Kyle Evans79925792020-10-13 15:04:44 -0500962 self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
963 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner5ec33a12019-03-01 16:43:28 +0100964
Victor Stinnercfe172d2019-03-01 18:21:49 +0100965 def detect_test_extensions(self):
966 # Python C API test module
967 self.add(Extension('_testcapi', ['_testcapimodule.c'],
968 depends=['testcapi_long.h']))
969
Victor Stinner23bace22019-04-18 11:37:26 +0200970 # Python Internal C API test module
971 self.add(Extension('_testinternalcapi', ['_testinternalcapi.c'],
Victor Stinner57491342019-04-23 12:26:33 +0200972 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner23bace22019-04-18 11:37:26 +0200973
Victor Stinnercfe172d2019-03-01 18:21:49 +0100974 # Python PEP-3118 (buffer protocol) test module
975 self.add(Extension('_testbuffer', ['_testbuffer.c']))
976
977 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
978 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
979
980 # Test multi-phase extension module init (PEP 489)
981 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
982
983 # Fuzz tests.
984 self.add(Extension('_xxtestfuzz',
985 ['_xxtestfuzz/_xxtestfuzz.c',
986 '_xxtestfuzz/fuzzer.c']))
987
Victor Stinner5ec33a12019-03-01 16:43:28 +0100988 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000989 # readline
Victor Stinner625dbf22019-03-01 15:59:39 +0100990 do_readline = self.compiler.find_library_file(self.lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000991 readline_termcap_library = ""
992 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200993 # Cannot use os.popen here in py3k.
994 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
995 if not os.path.exists(self.build_temp):
996 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000997 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200998 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +0100999 if CROSS_COMPILING:
Victor Stinner6b982c22020-04-01 01:10:07 +02001000 ret = run_command("%s -d %s | grep '(NEEDED)' > %s"
doko@ubuntu.com58844492012-06-30 18:25:32 +02001001 % (sysconfig.get_config_var('READELF'),
1002 do_readline, tmpfile))
1003 elif find_executable('ldd'):
Victor Stinner6b982c22020-04-01 01:10:07 +02001004 ret = run_command("ldd %s > %s" % (do_readline, tmpfile))
doko@ubuntu.com58844492012-06-30 18:25:32 +02001005 else:
Victor Stinner6b982c22020-04-01 01:10:07 +02001006 ret = 1
1007 if ret == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +00001008 with open(tmpfile) as fp:
1009 for ln in fp:
1010 if 'curses' in ln:
1011 readline_termcap_library = re.sub(
1012 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
1013 ).rstrip()
1014 break
1015 # termcap interface split out from ncurses
1016 if 'tinfo' in ln:
1017 readline_termcap_library = 'tinfo'
1018 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +02001019 if os.path.exists(tmpfile):
1020 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +00001021 # Issue 7384: If readline is already linked against curses,
1022 # use the same library for the readline and curses modules.
1023 if 'curses' in readline_termcap_library:
1024 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +01001025 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +00001026 curses_library = 'ncursesw'
Michael Felt08970cb2019-06-21 15:58:00 +02001027 # Issue 36210: OSS provided ncurses does not link on AIX
1028 # Use IBM supplied 'curses' for successful build of _curses
1029 elif AIX and self.compiler.find_library_file(self.lib_dirs, 'curses'):
1030 curses_library = 'curses'
Victor Stinner625dbf22019-03-01 15:59:39 +01001031 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001032 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +01001033 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001034 curses_library = 'curses'
1035
Victor Stinner4cbea512019-02-28 17:48:38 +01001036 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001037 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +00001038 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -07001039 if (dep_target and
1040 (tuple(int(n) for n in dep_target.split('.')[0:2])
1041 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +00001042 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001043 if os_release < 9:
1044 # MacOSX 10.4 has a broken readline. Don't try to build
1045 # the readline module unless the user has installed a fixed
1046 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +01001047 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001048 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +00001049 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +01001050 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051 # In every directory on the search path search for a dynamic
1052 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +00001053 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +00001054 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001055 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001056 readline_extra_link_args = ('-Wl,-search_paths_first',)
1057 else:
1058 readline_extra_link_args = ()
1059
Marc-André Lemburg2efc3232001-01-26 18:23:02 +00001060 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +00001061 if readline_termcap_library:
1062 pass # Issue 7384: Already linked against curses or tinfo.
1063 elif curses_library:
1064 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +01001065 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001066 ['/usr/lib/termcap'],
1067 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +00001068 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +01001069 self.add(Extension('readline', ['readline.c'],
1070 library_dirs=['/usr/lib/termcap'],
1071 extra_link_args=readline_extra_link_args,
1072 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001073 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001074 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001075
Victor Stinner5ec33a12019-03-01 16:43:28 +01001076 # Curses support, requiring the System V version of curses, often
1077 # provided by the ncurses library.
1078 curses_defines = []
1079 curses_includes = []
1080 panel_library = 'panel'
1081 if curses_library == 'ncursesw':
1082 curses_defines.append(('HAVE_NCURSESW', '1'))
1083 if not CROSS_COMPILING:
1084 curses_includes.append('/usr/include/ncursesw')
1085 # Bug 1464056: If _curses.so links with ncursesw,
1086 # _curses_panel.so must link with panelw.
1087 panel_library = 'panelw'
1088 if MACOS:
1089 # On OS X, there is no separate /usr/lib/libncursesw nor
1090 # libpanelw. If we are here, we found a locally-supplied
1091 # version of libncursesw. There should also be a
1092 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1093 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1094 # ncurses wide char support
1095 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
1096 elif MACOS and curses_library == 'ncurses':
1097 # Building with the system-suppied combined libncurses/libpanel
1098 curses_defines.append(('HAVE_NCURSESW', '1'))
1099 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +00001100
Victor Stinnercfe172d2019-03-01 18:21:49 +01001101 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +01001102 if curses_library.startswith('ncurses'):
1103 curses_libs = [curses_library]
1104 self.add(Extension('_curses', ['_cursesmodule.c'],
Victor Stinner37834132020-10-27 17:12:53 +01001105 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001106 include_dirs=curses_includes,
1107 define_macros=curses_defines,
1108 libraries=curses_libs))
1109 elif curses_library == 'curses' and not MACOS:
1110 # OSX has an old Berkeley curses, not good enough for
1111 # the _curses module.
1112 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
1113 curses_libs = ['curses', 'terminfo']
1114 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
1115 curses_libs = ['curses', 'termcap']
1116 else:
1117 curses_libs = ['curses']
1118
1119 self.add(Extension('_curses', ['_cursesmodule.c'],
Victor Stinner37834132020-10-27 17:12:53 +01001120 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001121 define_macros=curses_defines,
1122 libraries=curses_libs))
1123 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +01001124 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +01001125 self.missing.append('_curses')
1126
1127 # If the curses module is enabled, check for the panel module
Michael Felt08970cb2019-06-21 15:58:00 +02001128 # _curses_panel needs some form of ncurses
1129 skip_curses_panel = True if AIX else False
1130 if (curses_enabled and not skip_curses_panel and
1131 self.compiler.find_library_file(self.lib_dirs, panel_library)):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001132 self.add(Extension('_curses_panel', ['_curses_panel.c'],
Michael Felt08970cb2019-06-21 15:58:00 +02001133 include_dirs=curses_includes,
1134 define_macros=curses_defines,
1135 libraries=[panel_library, *curses_libs]))
1136 elif not skip_curses_panel:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001137 self.missing.append('_curses_panel')
1138
1139 def detect_crypt(self):
1140 # crypt module.
pxinwr236d0b72019-04-15 17:02:20 +08001141 if VXWORKS:
1142 # bpo-31904: crypt() function is not provided by VxWorks.
1143 # DES_crypt() OpenSSL provides is too weak to implement
1144 # the encryption.
1145 return
1146
Victor Stinner625dbf22019-03-01 15:59:39 +01001147 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +00001148 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +00001149 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +00001150 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +08001151
pxinwr236d0b72019-04-15 17:02:20 +08001152 self.add(Extension('_crypt', ['_cryptmodule.c'],
Victor Stinner8058bda2019-03-01 15:31:45 +01001153 libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001154
Victor Stinner5ec33a12019-03-01 16:43:28 +01001155 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001156 # socket(2)
pxinwr32f5fdd2019-02-27 19:09:28 +08001157 if not VXWORKS:
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +02001158 kwargs = {'depends': ['socketmodule.h']}
1159 if MACOS:
1160 # Issue #35569: Expose RFC 3542 socket options.
1161 kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542']
1162
1163 self.add(Extension('_socket', ['socketmodule.c'], **kwargs))
Victor Stinner625dbf22019-03-01 15:59:39 +01001164 elif self.compiler.find_library_file(self.lib_dirs, 'net'):
pxinwr32f5fdd2019-02-27 19:09:28 +08001165 libs = ['net']
Victor Stinner8058bda2019-03-01 15:31:45 +01001166 self.add(Extension('_socket', ['socketmodule.c'],
1167 depends=['socketmodule.h'],
1168 libraries=libs))
pxinwr32f5fdd2019-02-27 19:09:28 +08001169
Victor Stinner5ec33a12019-03-01 16:43:28 +01001170 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001171 # Modules that provide persistent dictionary-like semantics. You will
1172 # probably want to arrange for at least one of them to be available on
1173 # your machine, though none are defined by default because of library
1174 # dependencies. The Python module dbm/__init__.py provides an
1175 # implementation independent wrapper for these; dbm/dumb.py provides
1176 # similar functionality (but slower of course) implemented in Python.
1177
1178 # Sleepycat^WOracle Berkeley DB interface.
1179 # http://www.oracle.com/database/berkeley-db/db/index.html
1180 #
1181 # This requires the Sleepycat^WOracle DB code. The supported versions
1182 # are set below. Visit the URL above to download
1183 # a release. Most open source OSes come with one or more
1184 # versions of BerkeleyDB already installed.
1185
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001186 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001187 min_db_ver = (3, 3)
1188 db_setup_debug = False # verbose debug prints from this script?
1189
1190 def allow_db_ver(db_ver):
1191 """Returns a boolean if the given BerkeleyDB version is acceptable.
1192
1193 Args:
1194 db_ver: A tuple of the version to verify.
1195 """
1196 if not (min_db_ver <= db_ver <= max_db_ver):
1197 return False
1198 return True
1199
1200 def gen_db_minor_ver_nums(major):
1201 if major == 4:
1202 for x in range(max_db_ver[1]+1):
1203 if allow_db_ver((4, x)):
1204 yield x
1205 elif major == 3:
1206 for x in (3,):
1207 if allow_db_ver((3, x)):
1208 yield x
1209 else:
1210 raise ValueError("unknown major BerkeleyDB version", major)
1211
1212 # construct a list of paths to look for the header file in on
1213 # top of the normal inc_dirs.
1214 db_inc_paths = [
1215 '/usr/include/db4',
1216 '/usr/local/include/db4',
1217 '/opt/sfw/include/db4',
1218 '/usr/include/db3',
1219 '/usr/local/include/db3',
1220 '/opt/sfw/include/db3',
1221 # Fink defaults (http://fink.sourceforge.net/)
1222 '/sw/include/db4',
1223 '/sw/include/db3',
1224 ]
1225 # 4.x minor number specific paths
1226 for x in gen_db_minor_ver_nums(4):
1227 db_inc_paths.append('/usr/include/db4%d' % x)
1228 db_inc_paths.append('/usr/include/db4.%d' % x)
1229 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1230 db_inc_paths.append('/usr/local/include/db4%d' % x)
1231 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1232 db_inc_paths.append('/opt/db-4.%d/include' % x)
1233 # MacPorts default (http://www.macports.org/)
1234 db_inc_paths.append('/opt/local/include/db4%d' % x)
1235 # 3.x minor number specific paths
1236 for x in gen_db_minor_ver_nums(3):
1237 db_inc_paths.append('/usr/include/db3%d' % x)
1238 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1239 db_inc_paths.append('/usr/local/include/db3%d' % x)
1240 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1241 db_inc_paths.append('/opt/db-3.%d/include' % x)
1242
Victor Stinner4cbea512019-02-28 17:48:38 +01001243 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001244 db_inc_paths = []
1245
Georg Brandl489cb4f2009-07-11 10:08:49 +00001246 # Add some common subdirectories for Sleepycat DB to the list,
1247 # based on the standard include directories. This way DB3/4 gets
1248 # picked up when it is installed in a non-standard prefix and
1249 # the user has added that prefix into inc_dirs.
1250 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001251 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001252 std_variants.append(os.path.join(dn, 'db3'))
1253 std_variants.append(os.path.join(dn, 'db4'))
1254 for x in gen_db_minor_ver_nums(4):
1255 std_variants.append(os.path.join(dn, "db4%d"%x))
1256 std_variants.append(os.path.join(dn, "db4.%d"%x))
1257 for x in gen_db_minor_ver_nums(3):
1258 std_variants.append(os.path.join(dn, "db3%d"%x))
1259 std_variants.append(os.path.join(dn, "db3.%d"%x))
1260
1261 db_inc_paths = std_variants + db_inc_paths
1262 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1263
1264 db_ver_inc_map = {}
1265
Victor Stinner4cbea512019-02-28 17:48:38 +01001266 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001267 sysroot = macosx_sdk_root()
1268
Georg Brandl489cb4f2009-07-11 10:08:49 +00001269 class db_found(Exception): pass
1270 try:
1271 # See whether there is a Sleepycat header in the standard
1272 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001273 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001274 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001275 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001276 f = os.path.join(sysroot, d[1:], "db.h")
1277
Georg Brandl489cb4f2009-07-11 10:08:49 +00001278 if db_setup_debug: print("db: looking for db.h in", f)
1279 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001280 with open(f, 'rb') as file:
1281 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001282 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001283 if m:
1284 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001285 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001286 db_minor = int(m.group(1))
1287 db_ver = (db_major, db_minor)
1288
1289 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1290 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001291 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001292 db_patch = int(m.group(1))
1293 if db_patch < 21:
1294 print("db.h:", db_ver, "patch", db_patch,
1295 "being ignored (4.6.x must be >= 4.6.21)")
1296 continue
1297
1298 if ( (db_ver not in db_ver_inc_map) and
1299 allow_db_ver(db_ver) ):
1300 # save the include directory with the db.h version
1301 # (first occurrence only)
1302 db_ver_inc_map[db_ver] = d
1303 if db_setup_debug:
1304 print("db.h: found", db_ver, "in", d)
1305 else:
1306 # we already found a header for this library version
1307 if db_setup_debug: print("db.h: ignoring", d)
1308 else:
1309 # ignore this header, it didn't contain a version number
1310 if db_setup_debug:
1311 print("db.h: no version number version in", d)
1312
1313 db_found_vers = list(db_ver_inc_map.keys())
1314 db_found_vers.sort()
1315
1316 while db_found_vers:
1317 db_ver = db_found_vers.pop()
1318 db_incdir = db_ver_inc_map[db_ver]
1319
1320 # check lib directories parallel to the location of the header
1321 db_dirs_to_check = [
1322 db_incdir.replace("include", 'lib64'),
1323 db_incdir.replace("include", 'lib'),
1324 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001325
Victor Stinner4cbea512019-02-28 17:48:38 +01001326 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001327 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1328
1329 else:
1330 # Same as other branch, but takes OSX SDK into account
1331 tmp = []
1332 for dn in db_dirs_to_check:
1333 if is_macosx_sdk_path(dn):
1334 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1335 tmp.append(dn)
1336 else:
1337 if os.path.isdir(dn):
1338 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001339 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001340
1341 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001342
Ezio Melotti42da6632011-03-15 05:18:48 +02001343 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001344 # XXX should we -ever- look for a dbX name? Do any
1345 # systems really not name their library by version and
1346 # symlink to more general names?
1347 for dblib in (('db-%d.%d' % db_ver),
1348 ('db%d%d' % db_ver),
1349 ('db%d' % db_ver[0])):
1350 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001351 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001352 if dblib_file:
1353 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1354 raise db_found
1355 else:
1356 if db_setup_debug: print("db lib: ", dblib, "not found")
1357
1358 except db_found:
1359 if db_setup_debug:
1360 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1361 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001362 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001363 # Only add the found library and include directories if they aren't
1364 # already being searched. This avoids an explicit runtime library
1365 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001366 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001367 db_incs = None
1368 else:
1369 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001370 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001371 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001372 else:
1373 if db_setup_debug: print("db: no appropriate library found")
1374 db_incs = None
1375 dblibs = []
1376 dblib_dir = None
1377
Victor Stinner5ec33a12019-03-01 16:43:28 +01001378 dbm_setup_debug = False # verbose debug prints from this script?
1379 dbm_order = ['gdbm']
1380 # The standard Unix dbm module:
1381 if not CYGWIN:
1382 config_args = [arg.strip("'")
1383 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1384 dbm_args = [arg for arg in config_args
1385 if arg.startswith('--with-dbmliborder=')]
1386 if dbm_args:
1387 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1388 else:
1389 dbm_order = "ndbm:gdbm:bdb".split(":")
1390 dbmext = None
1391 for cand in dbm_order:
1392 if cand == "ndbm":
1393 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1394 # Some systems have -lndbm, others have -lgdbm_compat,
1395 # others don't have either
1396 if self.compiler.find_library_file(self.lib_dirs,
1397 'ndbm'):
1398 ndbm_libs = ['ndbm']
1399 elif self.compiler.find_library_file(self.lib_dirs,
1400 'gdbm_compat'):
1401 ndbm_libs = ['gdbm_compat']
1402 else:
1403 ndbm_libs = []
1404 if dbm_setup_debug: print("building dbm using ndbm")
1405 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1406 define_macros=[
1407 ('HAVE_NDBM_H',None),
1408 ],
1409 libraries=ndbm_libs)
1410 break
1411
1412 elif cand == "gdbm":
1413 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1414 gdbm_libs = ['gdbm']
1415 if self.compiler.find_library_file(self.lib_dirs,
1416 'gdbm_compat'):
1417 gdbm_libs.append('gdbm_compat')
1418 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1419 if dbm_setup_debug: print("building dbm using gdbm")
1420 dbmext = Extension(
1421 '_dbm', ['_dbmmodule.c'],
1422 define_macros=[
1423 ('HAVE_GDBM_NDBM_H', None),
1424 ],
1425 libraries = gdbm_libs)
1426 break
1427 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1428 if dbm_setup_debug: print("building dbm using gdbm")
1429 dbmext = Extension(
1430 '_dbm', ['_dbmmodule.c'],
1431 define_macros=[
1432 ('HAVE_GDBM_DASH_NDBM_H', None),
1433 ],
1434 libraries = gdbm_libs)
1435 break
1436 elif cand == "bdb":
1437 if dblibs:
1438 if dbm_setup_debug: print("building dbm using bdb")
1439 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1440 library_dirs=dblib_dir,
1441 runtime_library_dirs=dblib_dir,
1442 include_dirs=db_incs,
1443 define_macros=[
1444 ('HAVE_BERKDB_H', None),
1445 ('DB_DBM_HSEARCH', None),
1446 ],
1447 libraries=dblibs)
1448 break
1449 if dbmext is not None:
1450 self.add(dbmext)
1451 else:
1452 self.missing.append('_dbm')
1453
1454 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1455 if ('gdbm' in dbm_order and
1456 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1457 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1458 libraries=['gdbm']))
1459 else:
1460 self.missing.append('_gdbm')
1461
1462 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001463 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001464 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001465
1466 # We hunt for #define SQLITE_VERSION "n.n.n"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001467 sqlite_incdir = sqlite_libdir = None
1468 sqlite_inc_paths = [ '/usr/include',
1469 '/usr/include/sqlite',
1470 '/usr/include/sqlite3',
1471 '/usr/local/include',
1472 '/usr/local/include/sqlite',
1473 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001474 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001475 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001476 sqlite_inc_paths = []
Erlend Egeberg Aasland207c3212020-09-07 23:26:54 +02001477 # We need to find >= sqlite version 3.7.3, for sqlite3_create_function_v2()
1478 MIN_SQLITE_VERSION_NUMBER = (3, 7, 3)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001479 MIN_SQLITE_VERSION = ".".join([str(x)
1480 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001481
1482 # Scan the default include directories before the SQLite specific
1483 # ones. This allows one to override the copy of sqlite on OSX,
1484 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001485 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001486 sysroot = macosx_sdk_root()
1487
Victor Stinner625dbf22019-03-01 15:59:39 +01001488 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001489 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001490 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001491 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001492
Ned Deily9b635832012-08-05 15:13:33 -07001493 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001494 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001495 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001496 with open(f) as file:
1497 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001498 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001499 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001500 if m:
1501 sqlite_version = m.group(1)
1502 sqlite_version_tuple = tuple([int(x)
1503 for x in sqlite_version.split(".")])
1504 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1505 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001506 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001507 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001508 sqlite_incdir = d
1509 break
1510 else:
1511 if sqlite_setup_debug:
Charles Pigottad0daf52019-04-26 16:38:12 +01001512 print("%s: version %s is too old, need >= %s"%(d,
Guido van Rossum452bf512007-02-09 05:32:43 +00001513 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001514 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001515 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001516
1517 if sqlite_incdir:
1518 sqlite_dirs_to_check = [
1519 os.path.join(sqlite_incdir, '..', 'lib64'),
1520 os.path.join(sqlite_incdir, '..', 'lib'),
1521 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1522 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1523 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001524 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001525 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001526 if sqlite_libfile:
1527 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001528
1529 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001530 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001531 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001532 '_sqlite/cursor.c',
1533 '_sqlite/microprotocols.c',
1534 '_sqlite/module.c',
1535 '_sqlite/prepare_protocol.c',
1536 '_sqlite/row.c',
1537 '_sqlite/statement.c',
1538 '_sqlite/util.c', ]
1539
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001540 sqlite_defines = []
Victor Stinner4cbea512019-02-28 17:48:38 +01001541 if not MS_WINDOWS:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001542 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1543 else:
1544 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1545
Benjamin Peterson076ed002010-10-31 17:11:02 +00001546 # Enable support for loadable extensions in the sqlite3 module
1547 # if --enable-loadable-sqlite-extensions configure option is used.
1548 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1549 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001550
Victor Stinner4cbea512019-02-28 17:48:38 +01001551 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001552 # In every directory on the search path search for a dynamic
1553 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001554 # for dynamic libraries on the entire path.
1555 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001556 # before the dynamic library in /usr/lib.
1557 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1558 else:
1559 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001560
Brett Cannonc5011fe2011-06-06 20:09:10 -07001561 include_dirs = ["Modules/_sqlite"]
1562 # Only include the directory where sqlite was found if it does
1563 # not already exist in set include directories, otherwise you
1564 # can end up with a bad search path order.
1565 if sqlite_incdir not in self.compiler.include_dirs:
1566 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001567 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001568 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001569 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001570 self.add(Extension('_sqlite3', sqlite_srcs,
1571 define_macros=sqlite_defines,
1572 include_dirs=include_dirs,
1573 library_dirs=sqlite_libdir,
1574 extra_link_args=sqlite_extra_link_args,
1575 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001576 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001577 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001578
Victor Stinner5ec33a12019-03-01 16:43:28 +01001579 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001580 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001581 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001582 if not VXWORKS:
1583 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001584 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001585 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001586 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001587 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001588 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001589
Victor Stinner5ec33a12019-03-01 16:43:28 +01001590 # Platform-specific libraries
1591 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1592 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Michael Felt08970cb2019-06-21 15:58:00 +02001593 elif not AIX:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001594 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001595
Victor Stinner5ec33a12019-03-01 16:43:28 +01001596 if MACOS:
Ned Deily951ab582020-05-18 11:31:21 -04001597 self.add(Extension('_scproxy', ['_scproxy.c'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001598 extra_link_args=[
1599 '-framework', 'SystemConfiguration',
Ned Deily951ab582020-05-18 11:31:21 -04001600 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001601
Victor Stinner5ec33a12019-03-01 16:43:28 +01001602 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001603 # Andrew Kuchling's zlib module. Note that some versions of zlib
1604 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1605 # http://www.cert.org/advisories/CA-2002-07.html
1606 #
1607 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1608 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1609 # now, we still accept 1.1.3, because we think it's difficult to
1610 # exploit this in Python, and we'd rather make it RedHat's problem
1611 # than our problem <wink>.
1612 #
1613 # You can upgrade zlib to version 1.1.4 yourself by going to
1614 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001615 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001616 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001617 if zlib_inc is not None:
1618 zlib_h = zlib_inc[0] + '/zlib.h'
1619 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001620 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001621 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001622 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001623 with open(zlib_h) as fp:
1624 while 1:
1625 line = fp.readline()
1626 if not line:
1627 break
1628 if line.startswith('#define ZLIB_VERSION'):
1629 version = line.split()[2]
1630 break
Guido van Rossume6970912001-04-15 15:16:12 +00001631 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001632 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001633 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001634 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1635 else:
1636 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001637 self.add(Extension('zlib', ['zlibmodule.c'],
1638 libraries=['z'],
1639 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001640 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001641 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001642 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001643 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001644 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001645 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001646 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001647
Christian Heimes1dc54002008-03-24 02:19:29 +00001648 # Helper module for various ascii-encoders. Uses zlib for an optimized
1649 # crc32 if we have it. Otherwise binascii uses its own.
1650 if have_zlib:
1651 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1652 libraries = ['z']
1653 extra_link_args = zlib_extra_link_args
1654 else:
1655 extra_compile_args = []
1656 libraries = []
1657 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001658 self.add(Extension('binascii', ['binascii.c'],
1659 extra_compile_args=extra_compile_args,
1660 libraries=libraries,
1661 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001662
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001663 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001664 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001665 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001666 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1667 else:
1668 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001669 self.add(Extension('_bz2', ['_bz2module.c'],
1670 libraries=['bz2'],
1671 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001672 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001673 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001674
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001675 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001676 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001677 self.add(Extension('_lzma', ['_lzmamodule.c'],
1678 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001679 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001680 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001681
Victor Stinner5ec33a12019-03-01 16:43:28 +01001682 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001683 # Interface to the Expat XML parser
1684 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001685 # Expat was written by James Clark and is now maintained by a group of
1686 # developers on SourceForge; see www.libexpat.org for more information.
1687 # The pyexpat module was written by Paul Prescod after a prototype by
1688 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1689 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001690 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001691 #
1692 # More information on Expat can be found at www.libexpat.org.
1693 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001694 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1695 expat_inc = []
1696 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001697 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001698 expat_lib = ['expat']
1699 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001700 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001701 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001702 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001703 define_macros = [
1704 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001705 # bpo-30947: Python uses best available entropy sources to
1706 # call XML_SetHashSalt(), expat entropy sources are not needed
1707 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001708 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001709 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001710 expat_lib = []
1711 expat_sources = ['expat/xmlparse.c',
1712 'expat/xmlrole.c',
1713 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001714 expat_depends = ['expat/ascii.h',
1715 'expat/asciitab.h',
1716 'expat/expat.h',
1717 'expat/expat_config.h',
1718 'expat/expat_external.h',
1719 'expat/internal.h',
1720 'expat/latin1tab.h',
1721 'expat/utf8tab.h',
1722 'expat/xmlrole.h',
1723 'expat/xmltok.h',
1724 'expat/xmltok_impl.h'
1725 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001726
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001727 cc = sysconfig.get_config_var('CC').split()[0]
Victor Stinner6b982c22020-04-01 01:10:07 +02001728 ret = run_command(
Benjamin Peterson95da3102019-06-29 16:00:22 -07001729 '"%s" -Werror -Wno-unreachable-code -E -xc /dev/null >/dev/null 2>&1' % cc)
Victor Stinner6b982c22020-04-01 01:10:07 +02001730 if ret == 0:
Benjamin Peterson95da3102019-06-29 16:00:22 -07001731 extra_compile_args.append('-Wno-unreachable-code')
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001732
Victor Stinner8058bda2019-03-01 15:31:45 +01001733 self.add(Extension('pyexpat',
1734 define_macros=define_macros,
1735 extra_compile_args=extra_compile_args,
1736 include_dirs=expat_inc,
1737 libraries=expat_lib,
1738 sources=['pyexpat.c'] + expat_sources,
1739 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001740
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001741 # Fredrik Lundh's cElementTree module. Note that this also
1742 # uses expat (via the CAPI hook in pyexpat).
1743
Victor Stinner625dbf22019-03-01 15:59:39 +01001744 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001745 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001746 self.add(Extension('_elementtree',
1747 define_macros=define_macros,
1748 include_dirs=expat_inc,
1749 libraries=expat_lib,
1750 sources=['_elementtree.c'],
1751 depends=['pyexpat.c', *expat_sources,
1752 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001753 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001754 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001755
Victor Stinner5ec33a12019-03-01 16:43:28 +01001756 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001757 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001758 self.add(Extension('_multibytecodec',
1759 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001760 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001761 self.add(Extension('_codecs_%s' % loc,
1762 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001763
Victor Stinner5ec33a12019-03-01 16:43:28 +01001764 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001765 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001766 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001767 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1768 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001769
1770 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001771 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001772 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1773 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001774 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Neil Schemenauer5741c452019-02-08 10:48:46 -08001775 if (sysconfig.get_config_var('HAVE_SHM_OPEN') and
1776 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
Victor Stinnerc991f242019-03-01 17:19:04 +01001777 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
Davin Pottse5ef45b2019-02-01 22:52:23 -06001778 libs = []
Neil Schemenauer5741c452019-02-08 10:48:46 -08001779 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1780 # need to link with librt to get shm_open()
Davin Pottse5ef45b2019-02-01 22:52:23 -06001781 libs.append('rt')
Victor Stinner8058bda2019-03-01 15:31:45 +01001782 self.add(Extension('_posixshmem', posixshmem_srcs,
1783 define_macros={},
1784 libraries=libs,
1785 include_dirs=["Modules/_multiprocessing"]))
Benjamin Petersone711caf2008-06-11 16:44:04 +00001786
Victor Stinner8058bda2019-03-01 15:31:45 +01001787 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001788 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001789
Victor Stinner5ec33a12019-03-01 16:43:28 +01001790 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001791 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001792 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001793 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001794 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001795 uuid_libs = ['uuid']
1796 else:
1797 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001798 self.add(Extension('_uuid', ['_uuidmodule.c'],
1799 libraries=uuid_libs,
1800 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001801 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001802 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001803
Victor Stinner5ec33a12019-03-01 16:43:28 +01001804 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001805 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001806 self.init_inc_lib_dirs()
1807
1808 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001809 if TEST_EXTENSIONS:
1810 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001811 self.detect_readline_curses()
1812 self.detect_crypt()
1813 self.detect_socket()
1814 self.detect_openssl_hashlib()
xdegaye2ee077f2019-04-09 17:20:08 +02001815 self.detect_hash_builtins()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001816 self.detect_dbm_gdbm()
1817 self.detect_sqlite()
1818 self.detect_platform_specific_exts()
1819 self.detect_nis()
1820 self.detect_compress_exts()
1821 self.detect_expat_elementtree()
1822 self.detect_multibytecodecs()
1823 self.detect_decimal()
1824 self.detect_ctypes()
1825 self.detect_multiprocessing()
1826 if not self.detect_tkinter():
1827 self.missing.append('_tkinter')
1828 self.detect_uuid()
1829
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001830## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001831## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001832
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001833 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001834 self.add(Extension('xxlimited', ['xxlimited.c'],
1835 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001836
Ned Deilyd819b932013-09-06 01:07:05 -07001837 def detect_tkinter_explicitly(self):
1838 # Build _tkinter using explicit locations for Tcl/Tk.
1839 #
1840 # This is enabled when both arguments are given to ./configure:
1841 #
1842 # --with-tcltk-includes="-I/path/to/tclincludes \
1843 # -I/path/to/tkincludes"
1844 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1845 # -L/path/to/tklibs -ltkm.n"
1846 #
Martin Pantere26da7c2016-06-02 10:07:09 +00001847 # These values can also be specified or overridden via make:
Ned Deilyd819b932013-09-06 01:07:05 -07001848 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1849 #
1850 # This can be useful for building and testing tkinter with multiple
1851 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1852 # build of Tcl so you need to specify both arguments and use care when
1853 # overriding.
1854
1855 # The _TCLTK variables are created in the Makefile sharedmods target.
1856 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1857 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1858 if not (tcltk_includes and tcltk_libs):
1859 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001860 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001861
1862 extra_compile_args = tcltk_includes.split()
1863 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001864 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1865 define_macros=[('WITH_APPINIT', 1)],
1866 extra_compile_args = extra_compile_args,
1867 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001868 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001869
Victor Stinner625dbf22019-03-01 15:59:39 +01001870 def detect_tkinter_darwin(self):
Ned Deily1731d6d2020-05-18 04:32:38 -04001871 # Build default _tkinter on macOS using Tcl and Tk frameworks.
1872 #
1873 # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly
1874 # built and installed as macOS framework bundles. However,
1875 # for several reasons, we cannot take full advantage of the
1876 # Apple-supplied compiler chain's -framework options here.
1877 # Instead, we need to find and pass to the compiler the
1878 # absolute paths of the Tcl and Tk headers files we want to use
1879 # and the absolute path to the directory containing the Tcl
1880 # and Tk frameworks for linking.
1881 #
1882 # We want to handle here two common use cases on macOS:
1883 # 1. Build and link with system-wide third-party or user-built
1884 # Tcl and Tk frameworks installed in /Library/Frameworks.
1885 # 2. Build and link using a user-specified macOS SDK so that the
1886 # built Python can be exported to other systems. In this case,
1887 # search only the SDK's /Library/Frameworks (normally empty)
1888 # and /System/Library/Frameworks.
1889 #
1890 # Any other use case should be able to be handled explicitly by
1891 # using the options described above in detect_tkinter_explicitly().
1892 # In particular it would be good to handle here the case where
1893 # you want to build and link with a framework build of Tcl and Tk
1894 # that is not in /Library/Frameworks, say, in your private
1895 # $HOME/Library/Frameworks directory or elsewhere. It turns
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301896 # out to be difficult to make that work automatically here
Ned Deily1731d6d2020-05-18 04:32:38 -04001897 # without bringing into play more tools and magic. That case
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301898 # can be handled using a recipe with the right arguments
Ned Deily1731d6d2020-05-18 04:32:38 -04001899 # to detect_tkinter_explicitly().
1900 #
1901 # Note also that the fallback case here is to try to use the
1902 # Apple-supplied Tcl and Tk frameworks in /System/Library but
1903 # be forewarned that they are deprecated by Apple and typically
1904 # out-of-date and buggy; their use should be avoided if at
1905 # all possible by installing a newer version of Tcl and Tk in
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301906 # /Library/Frameworks before building Python without
Ned Deily1731d6d2020-05-18 04:32:38 -04001907 # an explicit SDK or by configuring build arguments explicitly.
1908
Jack Jansen0b06be72002-06-21 14:48:38 +00001909 from os.path import join, exists
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001910
Ned Deily1731d6d2020-05-18 04:32:38 -04001911 sysroot = macosx_sdk_root() # path to the SDK or '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001912
Ned Deily1731d6d2020-05-18 04:32:38 -04001913 if macosx_sdk_specified():
1914 # Use case #2: an SDK other than '/' was specified.
1915 # Only search there.
1916 framework_dirs = [
1917 join(sysroot, 'Library', 'Frameworks'),
1918 join(sysroot, 'System', 'Library', 'Frameworks'),
1919 ]
1920 else:
1921 # Use case #1: no explicit SDK selected.
1922 # Search the local system-wide /Library/Frameworks,
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301923 # not the one in the default SDK, otherwise fall back to
Ned Deily1731d6d2020-05-18 04:32:38 -04001924 # /System/Library/Frameworks whose header files may be in
1925 # the default SDK or, on older systems, actually installed.
1926 framework_dirs = [
1927 join('/', 'Library', 'Frameworks'),
1928 join(sysroot, 'System', 'Library', 'Frameworks'),
1929 ]
1930
1931 # Find the directory that contains the Tcl.framework and
1932 # Tk.framework bundles.
Jack Jansen0b06be72002-06-21 14:48:38 +00001933 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001934 # both Tcl.framework and Tk.framework should be present
Jack Jansen0b06be72002-06-21 14:48:38 +00001935 for fw in 'Tcl', 'Tk':
Ned Deily1731d6d2020-05-18 04:32:38 -04001936 if not exists(join(F, fw + '.framework')):
1937 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001938 else:
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301939 # ok, F is now directory with both frameworks. Continue
Jack Jansen0b06be72002-06-21 14:48:38 +00001940 # building
1941 break
1942 else:
1943 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1944 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01001945 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00001946
Jack Jansen0b06be72002-06-21 14:48:38 +00001947 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001948 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001949 for fw in ('Tcl', 'Tk')
Ned Deily1731d6d2020-05-18 04:32:38 -04001950 for H in ('Headers',)
Jack Jansen0b06be72002-06-21 14:48:38 +00001951 ]
1952
Ned Deily1731d6d2020-05-18 04:32:38 -04001953 # Add the base framework directory as well
1954 compile_args = ['-F', F]
Jack Jansen0b06be72002-06-21 14:48:38 +00001955
Ned Deily1731d6d2020-05-18 04:32:38 -04001956 # Do not build tkinter for archs that this Tk was not built with.
Georg Brandlfcaf9102008-07-16 02:17:56 +00001957 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04001958 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001959
Ronald Oussorend097efe2009-09-15 19:07:58 +00001960 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1961 if not os.path.exists(self.build_temp):
1962 os.makedirs(self.build_temp)
1963
Ned Deily1731d6d2020-05-18 04:32:38 -04001964 run_command(
1965 "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile)
1966 )
Brett Cannon9f5db072010-10-29 20:19:27 +00001967 with open(tmpfile) as fp:
1968 detected_archs = []
1969 for ln in fp:
1970 a = ln.split()[-1]
1971 if a in archs:
1972 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001973 os.unlink(tmpfile)
1974
Ned Deily1731d6d2020-05-18 04:32:38 -04001975 arch_args = []
Ronald Oussorend097efe2009-09-15 19:07:58 +00001976 for a in detected_archs:
Ned Deily1731d6d2020-05-18 04:32:38 -04001977 arch_args.append('-arch')
1978 arch_args.append(a)
1979
1980 compile_args += arch_args
1981 link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk']), *arch_args]
1982
1983 # The X11/xlib.h file bundled in the Tk sources can cause function
1984 # prototype warnings from the compiler. Since we cannot easily fix
1985 # that, suppress the warnings here instead.
1986 if '-Wstrict-prototypes' in cflags.split():
1987 compile_args.append('-Wno-strict-prototypes')
Georg Brandlfcaf9102008-07-16 02:17:56 +00001988
Victor Stinnercfe172d2019-03-01 18:21:49 +01001989 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1990 define_macros=[('WITH_APPINIT', 1)],
1991 include_dirs=include_dirs,
1992 libraries=[],
Ned Deily1731d6d2020-05-18 04:32:38 -04001993 extra_compile_args=compile_args,
1994 extra_link_args=link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001995 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00001996
Victor Stinner625dbf22019-03-01 15:59:39 +01001997 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001998 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001999
Ned Deilyd819b932013-09-06 01:07:05 -07002000 # Check whether --with-tcltk-includes and --with-tcltk-libs were
2001 # configured or passed into the make target. If so, use these values
2002 # to build tkinter and bypass the searches for Tcl and TK in standard
2003 # locations.
2004 if self.detect_tkinter_explicitly():
Victor Stinner5ec33a12019-03-01 16:43:28 +01002005 return True
Ned Deilyd819b932013-09-06 01:07:05 -07002006
Jack Jansen0b06be72002-06-21 14:48:38 +00002007 # Rather than complicate the code below, detecting and building
2008 # AquaTk is a separate method. Only one Tkinter will be built on
2009 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01002010 if (MACOS and self.detect_tkinter_darwin()):
2011 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00002012
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002013 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002014 # The versions with dots are used on Unix, and the versions without
2015 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002016 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00002017 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
2018 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01002019 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002020 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01002021 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002022 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00002023 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002024 # Exit the loop when we've found the Tcl/Tk libraries
2025 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002026
Fredrik Lundhade711a2001-01-24 08:00:28 +00002027 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002028 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002029 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002030 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002031 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01002032 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002033 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
2034 # but the include subdirs are named like .../include/tcl8.3.
2035 dotversion = dotversion[:-1] + '.' + dotversion[-1]
2036 tcl_include_sub = []
2037 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01002038 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002039 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
2040 tk_include_sub += [dir + os.sep + "tk" + dotversion]
2041 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01002042 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
2043 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002044
Martin v. Löwise86a59a2003-05-03 08:45:51 +00002045 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002046 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002047 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01002048 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00002049
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002050 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002051
Victor Stinnercfe172d2019-03-01 18:21:49 +01002052 include_dirs = []
2053 libs = []
2054 defs = []
2055 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002056 for dir in tcl_includes + tk_includes:
2057 if dir not in include_dirs:
2058 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002059
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002060 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01002061 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002062 include_dirs.append('/usr/openwin/include')
2063 added_lib_dirs.append('/usr/openwin/lib')
2064 elif os.path.exists('/usr/X11R6/include'):
2065 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00002066 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002067 added_lib_dirs.append('/usr/X11R6/lib')
2068 elif os.path.exists('/usr/X11R5/include'):
2069 include_dirs.append('/usr/X11R5/include')
2070 added_lib_dirs.append('/usr/X11R5/lib')
2071 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002072 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002073 include_dirs.append('/usr/X11/include')
2074 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002075
Jason Tishler9181c942003-02-05 15:16:17 +00002076 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01002077 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00002078 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
2079 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01002080 return False
Jason Tishler9181c942003-02-05 15:16:17 +00002081
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002082 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01002083 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002084 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002085 defs.append( ('WITH_BLT', 1) )
2086 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01002087 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002088 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00002089 defs.append( ('WITH_BLT', 1) )
2090 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002091
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002092 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00002093 libs.append('tk'+ version)
2094 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002095
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002096 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01002097 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002098 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002099
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002100 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002101 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002102 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002103 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002104 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002105 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002106 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002107
Victor Stinnercfe172d2019-03-01 18:21:49 +01002108 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
2109 define_macros=[('WITH_APPINIT', 1)] + defs,
2110 include_dirs=include_dirs,
2111 libraries=libs,
2112 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002113 return True
2114
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002115 def configure_ctypes(self, ext):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002116 return True
2117
Victor Stinner625dbf22019-03-01 15:59:39 +01002118 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002119 # Thomas Heller's _ctypes module
Ronald Oussoren41761932020-11-08 10:05:27 +01002120
2121 if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS):
2122 self.use_system_libffi = True
2123 else:
2124 self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
2125
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002126 include_dirs = []
Victor Stinner1ae035b2020-04-17 17:47:20 +02002127 extra_compile_args = ['-DPy_BUILD_CORE_MODULE']
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002128 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002129 sources = ['_ctypes/_ctypes.c',
2130 '_ctypes/callbacks.c',
2131 '_ctypes/callproc.c',
2132 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00002133 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002134 depends = ['_ctypes/ctypes.h']
2135
Victor Stinner4cbea512019-02-28 17:48:38 +01002136 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00002137 sources.append('_ctypes/malloc_closure.c')
Ronald Oussoren41761932020-11-08 10:05:27 +01002138 extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1')
Christian Heimes78644762008-03-04 23:39:23 +00002139 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002140 include_dirs.append('_ctypes/darwin')
Thomas Hellercf567c12006-03-08 19:51:58 +00002141
Victor Stinner4cbea512019-02-28 17:48:38 +01002142 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002143 # XXX This shouldn't be necessary; it appears that some
2144 # of the assembler code is non-PIC (i.e. it has relocations
2145 # when it shouldn't. The proper fix would be to rewrite
2146 # the assembler code to be PIC.
2147 # This only works with GCC; the Sun compiler likely refuses
2148 # this option. If you want to compile ctypes with the Sun
2149 # compiler, please research a proper solution, instead of
2150 # finding some -z option for the Sun compiler.
2151 extra_link_args.append('-mimpure-text')
2152
Victor Stinner4cbea512019-02-28 17:48:38 +01002153 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00002154 extra_link_args.append('-fPIC')
2155
Thomas Hellercf567c12006-03-08 19:51:58 +00002156 ext = Extension('_ctypes',
2157 include_dirs=include_dirs,
2158 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002159 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002160 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002161 sources=sources,
2162 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01002163 self.add(ext)
2164 if TEST_EXTENSIONS:
2165 # function my_sqrt() needs libm for sqrt()
2166 self.add(Extension('_ctypes_test',
2167 sources=['_ctypes/_ctypes_test.c'],
2168 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00002169
Ronald Oussoren41761932020-11-08 10:05:27 +01002170 ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
2171 ffi_lib = None
2172
Victor Stinner625dbf22019-03-01 15:59:39 +01002173 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01002174 if MACOS:
Ronald Oussoren41761932020-11-08 10:05:27 +01002175 ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi")
Christian Heimes78644762008-03-04 23:39:23 +00002176
Ronald Oussoren41761932020-11-08 10:05:27 +01002177 if not ffi_inc:
2178 if os.path.exists(ffi_in_sdk):
2179 ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1")
2180 ffi_inc = ffi_in_sdk
2181 ffi_lib = 'ffi'
2182 else:
2183 # OS X 10.5 comes with libffi.dylib; the include files are
2184 # in /usr/include/ffi
2185 ffi_inc_dirs.append('/usr/include/ffi')
2186
2187 if not ffi_inc:
2188 found = find_file('ffi.h', [], ffi_inc_dirs)
2189 if found:
2190 ffi_inc = found[0]
2191 if ffi_inc:
2192 ffi_h = ffi_inc + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002193 if not os.path.exists(ffi_h):
2194 ffi_inc = None
2195 print('Header file {} does not exist'.format(ffi_h))
Ronald Oussoren41761932020-11-08 10:05:27 +01002196 if ffi_lib is None and ffi_inc:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002197 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002198 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002199 ffi_lib = lib_name
2200 break
2201
2202 if ffi_inc and ffi_lib:
Ronald Oussoren41761932020-11-08 10:05:27 +01002203 ffi_headers = glob(os.path.join(ffi_inc, '*.h'))
2204 if grep_headers_for('ffi_prep_cif_var', ffi_headers):
2205 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1")
2206 if grep_headers_for('ffi_prep_closure_loc', ffi_headers):
2207 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1")
2208 if grep_headers_for('ffi_closure_alloc', ffi_headers):
2209 ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1")
2210
2211 ext.include_dirs.append(ffi_inc)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002212 ext.libraries.append(ffi_lib)
2213 self.use_system_libffi = True
2214
Christian Heimes5bb96922018-02-25 10:22:14 +01002215 if sysconfig.get_config_var('HAVE_LIBDL'):
2216 # for dlopen, see bpo-32647
2217 ext.libraries.append('dl')
2218
Victor Stinner5ec33a12019-03-01 16:43:28 +01002219 def detect_decimal(self):
2220 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002221 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002222 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002223 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2224 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002225 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002226 sources = ['_decimal/_decimal.c']
2227 depends = ['_decimal/docstrings.h']
2228 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002229 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002230 'Modules',
2231 '_decimal',
2232 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002233 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002234 sources = [
2235 '_decimal/_decimal.c',
2236 '_decimal/libmpdec/basearith.c',
2237 '_decimal/libmpdec/constants.c',
2238 '_decimal/libmpdec/context.c',
2239 '_decimal/libmpdec/convolute.c',
2240 '_decimal/libmpdec/crt.c',
2241 '_decimal/libmpdec/difradix2.c',
2242 '_decimal/libmpdec/fnt.c',
2243 '_decimal/libmpdec/fourstep.c',
2244 '_decimal/libmpdec/io.c',
Stefan Krahf117d872019-07-10 18:27:38 +02002245 '_decimal/libmpdec/mpalloc.c',
Stefan Krah60187b52012-03-23 19:06:27 +01002246 '_decimal/libmpdec/mpdecimal.c',
2247 '_decimal/libmpdec/numbertheory.c',
2248 '_decimal/libmpdec/sixstep.c',
2249 '_decimal/libmpdec/transpose.c',
2250 ]
2251 depends = [
2252 '_decimal/docstrings.h',
2253 '_decimal/libmpdec/basearith.h',
2254 '_decimal/libmpdec/bits.h',
2255 '_decimal/libmpdec/constants.h',
2256 '_decimal/libmpdec/convolute.h',
2257 '_decimal/libmpdec/crt.h',
2258 '_decimal/libmpdec/difradix2.h',
2259 '_decimal/libmpdec/fnt.h',
2260 '_decimal/libmpdec/fourstep.h',
2261 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002262 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002263 '_decimal/libmpdec/mpdecimal.h',
2264 '_decimal/libmpdec/numbertheory.h',
2265 '_decimal/libmpdec/sixstep.h',
2266 '_decimal/libmpdec/transpose.h',
2267 '_decimal/libmpdec/typearith.h',
2268 '_decimal/libmpdec/umodarith.h',
2269 ]
2270
Stefan Krah1919b7e2012-03-21 18:25:23 +01002271 config = {
2272 'x64': [('CONFIG_64','1'), ('ASM','1')],
2273 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2274 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2275 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2276 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2277 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2278 ('LEGACY_COMPILER','1')],
2279 'universal': [('UNIVERSAL','1')]
2280 }
2281
Stefan Krah1919b7e2012-03-21 18:25:23 +01002282 cc = sysconfig.get_config_var('CC')
2283 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2284 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2285
2286 if machine:
2287 # Override automatic configuration to facilitate testing.
2288 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002289 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002290 # Universal here means: build with the same options Python
2291 # was built with.
2292 define_macros = config['universal']
2293 elif sizeof_size_t == 8:
2294 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2295 define_macros = config['x64']
2296 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2297 define_macros = config['uint128']
2298 else:
2299 define_macros = config['ansi64']
2300 elif sizeof_size_t == 4:
2301 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2302 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002303 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002304 # solaris: problems with register allocation.
2305 # icc >= 11.0 works as well.
2306 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002307 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002308 else:
2309 define_macros = config['ansi32']
2310 else:
2311 raise DistutilsError("_decimal: unsupported architecture")
2312
2313 # Workarounds for toolchain bugs:
2314 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2315 # Some versions of gcc miscompile inline asm:
2316 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2317 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2318 extra_compile_args.append('-fno-ipa-pure-const')
2319 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2320 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2321 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2322 undef_macros.append('_FORTIFY_SOURCE')
2323
Stefan Krah1919b7e2012-03-21 18:25:23 +01002324 # Uncomment for extra functionality:
2325 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002326 self.add(Extension('_decimal',
2327 include_dirs=include_dirs,
2328 libraries=libraries,
2329 define_macros=define_macros,
2330 undef_macros=undef_macros,
2331 extra_compile_args=extra_compile_args,
2332 sources=sources,
2333 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002334
Victor Stinner5ec33a12019-03-01 16:43:28 +01002335 def detect_openssl_hashlib(self):
2336 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002337 config_vars = sysconfig.get_config_vars()
2338
2339 def split_var(name, sep):
2340 # poor man's shlex, the re module is not available yet.
2341 value = config_vars.get(name)
2342 if not value:
2343 return ()
2344 # This trick works because ax_check_openssl uses --libs-only-L,
2345 # --libs-only-l, and --cflags-only-I.
2346 value = ' ' + value
2347 sep = ' ' + sep
2348 return [v.strip() for v in value.split(sep) if v.strip()]
2349
2350 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2351 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2352 openssl_libs = split_var('OPENSSL_LIBS', '-l')
2353 if not openssl_libs:
2354 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002355 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002356 return None, None
2357
2358 # Find OpenSSL includes
2359 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002360 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002361 )
2362 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002363 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002364 return None, None
2365
2366 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2367 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002368 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002369 ['/usr/kerberos/include']
2370 )
2371 if krb5_h:
2372 ssl_incs.extend(krb5_h)
2373
Christian Heimes61d478c2018-01-27 15:51:38 +01002374 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Christian Heimesc7f70692019-05-31 11:44:05 +02002375 self.add(Extension(
2376 '_ssl', ['_ssl.c'],
2377 include_dirs=openssl_includes,
2378 library_dirs=openssl_libdirs,
2379 libraries=openssl_libs,
2380 depends=['socketmodule.h', '_ssl/debughelpers.c'])
2381 )
Christian Heimes61d478c2018-01-27 15:51:38 +01002382 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002383 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002384
Victor Stinner8058bda2019-03-01 15:31:45 +01002385 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2386 depends=['hashlib.h'],
2387 include_dirs=openssl_includes,
2388 library_dirs=openssl_libdirs,
2389 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002390
xdegaye2ee077f2019-04-09 17:20:08 +02002391 def detect_hash_builtins(self):
Christian Heimes9b60e552020-05-15 23:54:53 +02002392 # By default we always compile these even when OpenSSL is available
2393 # (issue #14693). It's harmless and the object code is tiny
2394 # (40-50 KiB per module, only loaded when actually used). Modules can
2395 # be disabled via the --with-builtin-hashlib-hashes configure flag.
2396 supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"}
Victor Stinner5ec33a12019-03-01 16:43:28 +01002397
Christian Heimes9b60e552020-05-15 23:54:53 +02002398 configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES")
2399 configured = configured.strip('"').lower()
2400 configured = {
2401 m.strip() for m in configured.split(",")
2402 }
Victor Stinner5ec33a12019-03-01 16:43:28 +01002403
Christian Heimes9b60e552020-05-15 23:54:53 +02002404 self.disabled_configure.extend(
2405 sorted(supported.difference(configured))
2406 )
Victor Stinner5ec33a12019-03-01 16:43:28 +01002407
Christian Heimes9b60e552020-05-15 23:54:53 +02002408 if "sha256" in configured:
2409 self.add(Extension(
2410 '_sha256', ['sha256module.c'],
2411 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2412 depends=['hashlib.h']
2413 ))
2414
2415 if "sha512" in configured:
2416 self.add(Extension(
2417 '_sha512', ['sha512module.c'],
2418 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2419 depends=['hashlib.h']
2420 ))
2421
2422 if "md5" in configured:
2423 self.add(Extension(
2424 '_md5', ['md5module.c'],
2425 depends=['hashlib.h']
2426 ))
2427
2428 if "sha1" in configured:
2429 self.add(Extension(
2430 '_sha1', ['sha1module.c'],
2431 depends=['hashlib.h']
2432 ))
2433
2434 if "blake2" in configured:
2435 blake2_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002436 os.path.join(escape(self.srcdir), 'Modules/_blake2/impl/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002437 )
2438 blake2_deps.append('hashlib.h')
2439 self.add(Extension(
2440 '_blake2',
2441 [
2442 '_blake2/blake2module.c',
2443 '_blake2/blake2b_impl.c',
2444 '_blake2/blake2s_impl.c'
2445 ],
2446 depends=blake2_deps
2447 ))
2448
2449 if "sha3" in configured:
2450 sha3_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002451 os.path.join(escape(self.srcdir), 'Modules/_sha3/kcp/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002452 )
2453 sha3_deps.append('hashlib.h')
2454 self.add(Extension(
2455 '_sha3',
2456 ['_sha3/sha3module.c'],
2457 depends=sha3_deps
2458 ))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002459
2460 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002461 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002462 self.missing.append('nis')
2463 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002464
2465 libs = []
2466 library_dirs = []
2467 includes_dirs = []
2468
2469 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2470 # moved headers and libraries to libtirpc and libnsl. The headers
2471 # are in tircp and nsl sub directories.
2472 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002473 'rpcsvc/yp_prot.h', self.inc_dirs,
2474 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002475 )
2476 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002477 'rpc/rpc.h', self.inc_dirs,
2478 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002479 )
2480 if rpcsvc_inc is None or rpc_inc is None:
2481 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002482 self.missing.append('nis')
2483 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002484 includes_dirs.extend(rpcsvc_inc)
2485 includes_dirs.extend(rpc_inc)
2486
Victor Stinner625dbf22019-03-01 15:59:39 +01002487 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002488 libs.append('nsl')
2489 else:
2490 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002491 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002492 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2493 if libnsl is not None:
2494 library_dirs.append(os.path.dirname(libnsl))
2495 libs.append('nsl')
2496
Victor Stinner625dbf22019-03-01 15:59:39 +01002497 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002498 libs.append('tirpc')
2499
Victor Stinner8058bda2019-03-01 15:31:45 +01002500 self.add(Extension('nis', ['nismodule.c'],
2501 libraries=libs,
2502 library_dirs=library_dirs,
2503 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002504
Christian Heimesff5be6e2018-01-20 13:19:21 +01002505
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002506class PyBuildInstall(install):
2507 # Suppress the warning about installation into the lib_dynload
2508 # directory, which is not in sys.path when running Python during
2509 # installation:
2510 def initialize_options (self):
2511 install.initialize_options(self)
2512 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002513
Éric Araujoe6792c12011-06-09 14:07:02 +02002514 # Customize subcommands to not install an egg-info file for Python
2515 sub_commands = [('install_lib', install.has_lib),
2516 ('install_headers', install.has_headers),
2517 ('install_scripts', install.has_scripts),
2518 ('install_data', install.has_data)]
2519
2520
Michael W. Hudson529a5052002-12-17 16:47:17 +00002521class PyBuildInstallLib(install_lib):
2522 # Do exactly what install_lib does but make sure correct access modes get
2523 # set on installed directories and files. All installed files with get
2524 # mode 644 unless they are a shared library in which case they will get
2525 # mode 755. All installed directories will get mode 755.
2526
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002527 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2528 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002529
2530 def install(self):
2531 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002532 self.set_file_modes(outfiles, 0o644, 0o755)
2533 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002534 return outfiles
2535
2536 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002537 if not files: return
2538
2539 for filename in files:
2540 if os.path.islink(filename): continue
2541 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002542 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002543 log.info("changing mode of %s to %o", filename, mode)
2544 if not self.dry_run: os.chmod(filename, mode)
2545
2546 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002547 for dirpath, dirnames, fnames in os.walk(dirname):
2548 if os.path.islink(dirpath):
2549 continue
2550 log.info("changing mode of %s to %o", dirpath, mode)
2551 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002552
Victor Stinnerc991f242019-03-01 17:19:04 +01002553
Georg Brandlff52f762010-12-28 09:51:43 +00002554class PyBuildScripts(build_scripts):
2555 def copy_scripts(self):
2556 outfiles, updated_files = build_scripts.copy_scripts(self)
2557 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2558 minoronly = '.{0[1]}'.format(sys.version_info)
2559 newoutfiles = []
2560 newupdated_files = []
2561 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002562 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002563 newfilename = filename + fullversion
2564 else:
2565 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002566 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002567 os.rename(filename, newfilename)
2568 newoutfiles.append(newfilename)
2569 if filename in updated_files:
2570 newupdated_files.append(newfilename)
2571 return newoutfiles, newupdated_files
2572
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002573
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002574def main():
Victor Stinnerc991f242019-03-01 17:19:04 +01002575 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2576 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2577
2578 class DummyProcess:
2579 """Hack for parallel build"""
2580 ProcessPoolExecutor = None
2581
2582 sys.modules['concurrent.futures.process'] = DummyProcess
Paul Ganssle62972d92020-05-16 04:20:06 -04002583 validate_tzpath()
Victor Stinnerc991f242019-03-01 17:19:04 +01002584
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002585 # turn off warnings when deprecated modules are imported
2586 import warnings
2587 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002588 setup(# PyPI Metadata (PEP 301)
2589 name = "Python",
2590 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002591 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002592 maintainer = "Guido van Rossum and the Python community",
2593 maintainer_email = "python-dev@python.org",
2594 description = "A high-level object-oriented programming language",
2595 long_description = SUMMARY.strip(),
2596 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002597 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002598 platforms = ["Many"],
2599
2600 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002601 cmdclass = {'build_ext': PyBuildExt,
2602 'build_scripts': PyBuildScripts,
2603 'install': PyBuildInstall,
2604 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002605 # The struct module is defined here, because build_ext won't be
2606 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002607 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002608
Georg Brandlff52f762010-12-28 09:51:43 +00002609 # If you change the scripts installed here, you also need to
2610 # check the PyBuildScripts command above, and change the links
2611 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002612 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002613 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002614 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002615
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002616# --install-platlib
2617if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002618 main()