blob: d011936279490602ce38c52720c17e392a8fdd85 [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +00002
Victor Stinner625dbf22019-03-01 15:59:39 +01003import argparse
Eric Snow335e14d2014-01-04 15:09:28 -07004import importlib._bootstrap
Victor Stinner625dbf22019-03-01 15:59:39 +01005import importlib.machinery
Eric Snow335e14d2014-01-04 15:09:28 -07006import importlib.util
Victor Stinner625dbf22019-03-01 15:59:39 +01007import os
8import re
9import sys
Tarek Ziadéedacea32010-01-29 11:41:03 +000010import sysconfig
Serhiy Storchaka93558682020-06-20 11:10:31 +030011from glob import glob, escape
Ronald Oussoren404a7192020-11-22 06:14:25 +010012import _osx_support
Michael W. Hudson529a5052002-12-17 16:47:17 +000013
Victor Stinner1ec63b62020-03-04 14:50:19 +010014
15try:
16 import subprocess
17 del subprocess
18 SUBPROCESS_BOOTSTRAP = False
19except ImportError:
Victor Stinner1ec63b62020-03-04 14:50:19 +010020 # Bootstrap Python: distutils.spawn uses subprocess to build C extensions,
21 # subprocess requires C extensions built by setup.py like _posixsubprocess.
22 #
Victor Stinneraddaaaa2020-03-09 23:45:59 +010023 # Use _bootsubprocess which only uses the os module.
Victor Stinner1ec63b62020-03-04 14:50:19 +010024 #
25 # It is dropped from sys.modules as soon as all C extension modules
26 # are built.
Victor Stinneraddaaaa2020-03-09 23:45:59 +010027 import _bootsubprocess
28 sys.modules['subprocess'] = _bootsubprocess
29 del _bootsubprocess
30 SUBPROCESS_BOOTSTRAP = True
Victor Stinner1ec63b62020-03-04 14:50:19 +010031
32
Michael W. Hudson529a5052002-12-17 16:47:17 +000033from distutils import log
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000034from distutils.command.build_ext import build_ext
Victor Stinner625dbf22019-03-01 15:59:39 +010035from distutils.command.build_scripts import build_scripts
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000036from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000037from distutils.command.install_lib import install_lib
Victor Stinner625dbf22019-03-01 15:59:39 +010038from distutils.core import Extension, setup
39from distutils.errors import CCompilerError, DistutilsError
Stefan Krah095b2732010-06-08 13:41:44 +000040from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000041
Antoine Pitrou2c0a9162014-09-26 23:31:59 +020042
Victor Stinnercfe172d2019-03-01 18:21:49 +010043# Compile extensions used to test Python?
pxinwr277ce302020-12-30 20:50:39 +080044TEST_EXTENSIONS = (sysconfig.get_config_var('TEST_MODULES') == 'yes')
Victor Stinnercfe172d2019-03-01 18:21:49 +010045
46# This global variable is used to hold the list of modules to be disabled.
47DISABLED_MODULE_LIST = []
48
Victor Stinnercad80202021-01-19 23:04:49 +010049# --list-module-names option used by Tools/scripts/generate_module_names.py
50LIST_MODULE_NAMES = False
51
Victor Stinnercfe172d2019-03-01 18:21:49 +010052
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020053def get_platform():
Victor Stinnerc991f242019-03-01 17:19:04 +010054 # Cross compiling
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020055 if "_PYTHON_HOST_PLATFORM" in os.environ:
56 return os.environ["_PYTHON_HOST_PLATFORM"]
Victor Stinnerc991f242019-03-01 17:19:04 +010057
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020058 # Get value of sys.platform
59 if sys.platform.startswith('osf1'):
60 return 'osf1'
61 return sys.platform
Victor Stinnerc991f242019-03-01 17:19:04 +010062
63
64CROSS_COMPILING = ("_PYTHON_HOST_PLATFORM" in os.environ)
Victor Stinner4cbea512019-02-28 17:48:38 +010065HOST_PLATFORM = get_platform()
66MS_WINDOWS = (HOST_PLATFORM == 'win32')
67CYGWIN = (HOST_PLATFORM == 'cygwin')
68MACOS = (HOST_PLATFORM == 'darwin')
Michael Felt08970cb2019-06-21 15:58:00 +020069AIX = (HOST_PLATFORM.startswith('aix'))
Victor Stinner4cbea512019-02-28 17:48:38 +010070VXWORKS = ('vxworks' in HOST_PLATFORM)
pxinwr32f5fdd2019-02-27 19:09:28 +080071
Victor Stinnerc991f242019-03-01 17:19:04 +010072
73SUMMARY = """
74Python is an interpreted, interactive, object-oriented programming
75language. It is often compared to Tcl, Perl, Scheme or Java.
76
77Python combines remarkable power with very clear syntax. It has
78modules, classes, exceptions, very high level dynamic data types, and
79dynamic typing. There are interfaces to many system calls and
80libraries, as well as to various windowing systems (X11, Motif, Tk,
81Mac, MFC). New built-in modules are easily written in C or C++. Python
82is also usable as an extension language for applications that need a
83programmable interface.
84
85The Python implementation is portable: it runs on many brands of UNIX,
86on Windows, DOS, Mac, Amiga... If your favorite system isn't
87listed here, it may still be supported, if there's a C compiler for
88it. Ask around on comp.lang.python -- or just try compiling Python
89yourself.
90"""
91
92CLASSIFIERS = """
93Development Status :: 6 - Mature
94License :: OSI Approved :: Python Software Foundation License
95Natural Language :: English
96Programming Language :: C
97Programming Language :: Python
98Topic :: Software Development
99"""
100
101
Victor Stinner6b982c22020-04-01 01:10:07 +0200102def run_command(cmd):
103 status = os.system(cmd)
Victor Stinner65a796e2020-04-01 18:49:29 +0200104 return os.waitstatus_to_exitcode(status)
Victor Stinner6b982c22020-04-01 01:10:07 +0200105
106
Victor Stinnerc991f242019-03-01 17:19:04 +0100107# Set common compiler and linker flags derived from the Makefile,
108# reserved for building the interpreter and the stdlib modules.
109# See bpo-21121 and bpo-35257
110def set_compiler_flags(compiler_flags, compiler_py_flags_nodist):
111 flags = sysconfig.get_config_var(compiler_flags)
112 py_flags_nodist = sysconfig.get_config_var(compiler_py_flags_nodist)
113 sysconfig.get_config_vars()[compiler_flags] = flags + ' ' + py_flags_nodist
114
115
Michael W. Hudson39230b32002-01-16 15:26:48 +0000116def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000117 """Add the directory 'dir' to the list 'dirlist' (after any relative
118 directories) if:
119
Michael W. Hudson39230b32002-01-16 15:26:48 +0000120 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000121 2) 'dir' actually exists, and is a directory.
122 """
123 if dir is None or not os.path.isdir(dir) or dir in dirlist:
124 return
125 for i, path in enumerate(dirlist):
126 if not os.path.isabs(path):
127 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +0000128 return
129 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +0000130
Victor Stinnerc991f242019-03-01 17:19:04 +0100131
xdegaye77f51392017-11-25 17:25:30 +0100132def sysroot_paths(make_vars, subdirs):
133 """Get the paths of sysroot sub-directories.
134
135 * make_vars: a sequence of names of variables of the Makefile where
136 sysroot may be set.
137 * subdirs: a sequence of names of subdirectories used as the location for
138 headers or libraries.
139 """
140
141 dirs = []
142 for var_name in make_vars:
143 var = sysconfig.get_config_var(var_name)
144 if var is not None:
145 m = re.search(r'--sysroot=([^"]\S*|"[^"]+")', var)
146 if m is not None:
147 sysroot = m.group(1).strip('"')
148 for subdir in subdirs:
149 if os.path.isabs(subdir):
150 subdir = subdir[1:]
151 path = os.path.join(sysroot, subdir)
152 if os.path.isdir(path):
153 dirs.append(path)
154 break
155 return dirs
156
Ned Deily1731d6d2020-05-18 04:32:38 -0400157
Ned Deily0288dd62019-06-03 06:34:48 -0400158MACOS_SDK_ROOT = None
Ned Deily1731d6d2020-05-18 04:32:38 -0400159MACOS_SDK_SPECIFIED = None
Victor Stinnerc991f242019-03-01 17:19:04 +0100160
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000161def macosx_sdk_root():
Ned Deily0288dd62019-06-03 06:34:48 -0400162 """Return the directory of the current macOS SDK.
163
164 If no SDK was explicitly configured, call the compiler to find which
165 include files paths are being searched by default. Use '/' if the
166 compiler is searching /usr/include (meaning system header files are
167 installed) or use the root of an SDK if that is being searched.
168 (The SDK may be supplied via Xcode or via the Command Line Tools).
169 The SDK paths used by Apple-supplied tool chains depend on the
170 setting of various variables; see the xcrun man page for more info.
Ned Deily1731d6d2020-05-18 04:32:38 -0400171 Also sets MACOS_SDK_SPECIFIED for use by macosx_sdk_specified().
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000172 """
Ned Deily1731d6d2020-05-18 04:32:38 -0400173 global MACOS_SDK_ROOT, MACOS_SDK_SPECIFIED
Ned Deily0288dd62019-06-03 06:34:48 -0400174
175 # If already called, return cached result.
176 if MACOS_SDK_ROOT:
177 return MACOS_SDK_ROOT
178
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000179 cflags = sysconfig.get_config_var('CFLAGS')
Joshua Rootb3107002020-04-22 17:44:10 +1000180 m = re.search(r'-isysroot\s*(\S+)', cflags)
Ned Deily0288dd62019-06-03 06:34:48 -0400181 if m is not None:
182 MACOS_SDK_ROOT = m.group(1)
Ned Deily29afab62020-12-04 23:02:09 -0500183 MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000184 else:
Ronald Oussoren404a7192020-11-22 06:14:25 +0100185 MACOS_SDK_ROOT = _osx_support._default_sysroot(
186 sysconfig.get_config_var('CC'))
Ned Deily29afab62020-12-04 23:02:09 -0500187 MACOS_SDK_SPECIFIED = False
Ned Deily0288dd62019-06-03 06:34:48 -0400188
189 return MACOS_SDK_ROOT
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000190
Victor Stinnerc991f242019-03-01 17:19:04 +0100191
Ned Deily1731d6d2020-05-18 04:32:38 -0400192def macosx_sdk_specified():
193 """Returns true if an SDK was explicitly configured.
194
195 True if an SDK was selected at configure time, either by specifying
196 --enable-universalsdk=(something other than no or /) or by adding a
197 -isysroot option to CFLAGS. In some cases, like when making
198 decisions about macOS Tk framework paths, we need to be able to
199 know whether the user explicitly asked to build with an SDK versus
200 the implicit use of an SDK when header files are no longer
201 installed on a running system by the Command Line Tools.
202 """
203 global MACOS_SDK_SPECIFIED
204
205 # If already called, return cached result.
206 if MACOS_SDK_SPECIFIED:
207 return MACOS_SDK_SPECIFIED
208
209 # Find the sdk root and set MACOS_SDK_SPECIFIED
210 macosx_sdk_root()
211 return MACOS_SDK_SPECIFIED
212
213
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000214def is_macosx_sdk_path(path):
215 """
216 Returns True if 'path' can be located in an OSX SDK
217 """
Ned Deily2910a7b2012-07-30 02:35:58 -0700218 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
219 or path.startswith('/System/')
220 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000221
Victor Stinnerc991f242019-03-01 17:19:04 +0100222
Ronald Oussoren41761932020-11-08 10:05:27 +0100223def grep_headers_for(function, headers):
224 for header in headers:
Ronald Oussoren7a27c7e2020-11-14 16:07:47 +0100225 with open(header, 'r', errors='surrogateescape') as f:
Ronald Oussoren41761932020-11-08 10:05:27 +0100226 if function in f.read():
227 return True
228 return False
229
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000230def find_file(filename, std_dirs, paths):
231 """Searches for the directory where a given file is located,
232 and returns a possibly-empty list of additional directories, or None
233 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +0000234
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000235 'filename' is the name of a file, such as readline.h or libcrypto.a.
236 'std_dirs' is the list of standard system directories; if the
237 file is found in one of them, no additional directives are needed.
238 'paths' is a list of additional locations to check; if the file is
239 found in one of them, the resulting list will contain the directory.
240 """
Victor Stinner4cbea512019-02-28 17:48:38 +0100241 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000242 # Honor the MacOSX SDK setting when one was specified.
243 # An SDK is a directory with the same structure as a real
244 # system, but with only header files and libraries.
245 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000246
247 # Check the standard locations
248 for dir in std_dirs:
249 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000250
Victor Stinner4cbea512019-02-28 17:48:38 +0100251 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000252 f = os.path.join(sysroot, dir[1:], filename)
253
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000254 if os.path.exists(f): return []
255
256 # Check the additional directories
257 for dir in paths:
258 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000259
Victor Stinner4cbea512019-02-28 17:48:38 +0100260 if MACOS and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000261 f = os.path.join(sysroot, dir[1:], filename)
262
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000263 if os.path.exists(f):
264 return [dir]
265
266 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000267 return None
268
Victor Stinnerc991f242019-03-01 17:19:04 +0100269
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000270def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000271 result = compiler.find_library_file(std_dirs + paths, libname)
272 if result is None:
273 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000274
Victor Stinner4cbea512019-02-28 17:48:38 +0100275 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000276 sysroot = macosx_sdk_root()
277
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000278 # Check whether the found file is in one of the standard directories
279 dirname = os.path.dirname(result)
280 for p in std_dirs:
281 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000282 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000283
Victor Stinner4cbea512019-02-28 17:48:38 +0100284 if MACOS and is_macosx_sdk_path(p):
Ned Deily020250f2016-02-25 00:56:38 +1100285 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
286 # libraries with .tbd extensions rather than the normal .dylib
287 # shared libraries installed in /. The Apple compiler tool
288 # chain handles this transparently but it can cause problems
289 # for programs that are being built with an SDK and searching
290 # for specific libraries. Distutils find_library_file() now
291 # knows to also search for and return .tbd files. But callers
292 # of find_library_file need to keep in mind that the base filename
293 # of the returned SDK library file might have a different extension
294 # from that of the library file installed on the running system,
295 # for example:
296 # /Applications/Xcode.app/Contents/Developer/Platforms/
297 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
298 # usr/lib/libedit.tbd
299 # vs
300 # /usr/lib/libedit.dylib
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000301 if os.path.join(sysroot, p[1:]) == dirname:
302 return [ ]
303
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000304 if p == dirname:
305 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000306
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000307 # Otherwise, it must have been in one of the additional directories,
308 # so we have to figure out which one.
309 for p in paths:
310 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000311 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000312
Victor Stinner4cbea512019-02-28 17:48:38 +0100313 if MACOS and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000314 if os.path.join(sysroot, p[1:]) == dirname:
315 return [ p ]
316
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000317 if p == dirname:
318 return [p]
319 else:
320 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000321
Paul Ganssle62972d92020-05-16 04:20:06 -0400322def validate_tzpath():
323 base_tzpath = sysconfig.get_config_var('TZPATH')
324 if not base_tzpath:
325 return
326
327 tzpaths = base_tzpath.split(os.pathsep)
328 bad_paths = [tzpath for tzpath in tzpaths if not os.path.isabs(tzpath)]
329 if bad_paths:
330 raise ValueError('TZPATH must contain only absolute paths, '
331 + f'found:\n{tzpaths!r}\nwith invalid paths:\n'
332 + f'{bad_paths!r}')
Victor Stinnerc991f242019-03-01 17:19:04 +0100333
Jack Jansen144ebcc2001-08-05 22:31:19 +0000334def find_module_file(module, dirlist):
335 """Find a module in a set of possible folders. If it is not found
336 return the unadorned filename"""
337 list = find_file(module, [], dirlist)
338 if not list:
339 return module
340 if len(list) > 1:
Vinay Sajipdd917f82016-08-31 08:22:29 +0100341 log.info("WARNING: multiple copies of %s found", module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000342 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000343
Victor Stinnerc991f242019-03-01 17:19:04 +0100344
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000345class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000346
Guido van Rossumd8faa362007-04-27 19:54:29 +0000347 def __init__(self, dist):
348 build_ext.__init__(self, dist)
Victor Stinner625dbf22019-03-01 15:59:39 +0100349 self.srcdir = None
350 self.lib_dirs = None
351 self.inc_dirs = None
Victor Stinner5ec33a12019-03-01 16:43:28 +0100352 self.config_h_vars = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000353 self.failed = []
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400354 self.failed_on_import = []
Victor Stinner8058bda2019-03-01 15:31:45 +0100355 self.missing = []
Christian Heimes9b60e552020-05-15 23:54:53 +0200356 self.disabled_configure = []
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200357 if '-j' in os.environ.get('MAKEFLAGS', ''):
358 self.parallel = True
Guido van Rossumd8faa362007-04-27 19:54:29 +0000359
Victor Stinner8058bda2019-03-01 15:31:45 +0100360 def add(self, ext):
361 self.extensions.append(ext)
362
Victor Stinner00c77ae2020-03-04 18:44:49 +0100363 def set_srcdir(self):
Victor Stinner625dbf22019-03-01 15:59:39 +0100364 self.srcdir = sysconfig.get_config_var('srcdir')
365 if not self.srcdir:
366 # Maybe running on Windows but not using CYGWIN?
367 raise ValueError("No source directory; cannot proceed.")
368 self.srcdir = os.path.abspath(self.srcdir)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000369
Victor Stinner00c77ae2020-03-04 18:44:49 +0100370 def remove_disabled(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000371 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000372 extensions = [ext for ext in self.extensions
Victor Stinner4cbea512019-02-28 17:48:38 +0100373 if ext.name not in DISABLED_MODULE_LIST]
Christian Heimes679db4a2008-01-18 09:56:22 +0000374 # move ctypes to the end, it depends on other modules
375 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
376 if "_ctypes" in ext_map:
377 ctypes = extensions.pop(ext_map["_ctypes"])
378 extensions.append(ctypes)
379 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000380
Victor Stinner00c77ae2020-03-04 18:44:49 +0100381 def update_sources_depends(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000382 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000383 # with Modules/.
Victor Stinner625dbf22019-03-01 15:59:39 +0100384 moddirlist = [os.path.join(self.srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000385
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000386 # Fix up the paths for scripts, too
Victor Stinner625dbf22019-03-01 15:59:39 +0100387 self.distribution.scripts = [os.path.join(self.srcdir, filename)
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000388 for filename in self.distribution.scripts]
389
Christian Heimesaf98da12008-01-27 15:18:18 +0000390 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000391 headers = [sysconfig.get_config_h_filename()]
Serhiy Storchaka93558682020-06-20 11:10:31 +0300392 headers += glob(os.path.join(escape(sysconfig.get_path('include')), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000393
Xavier de Gaye84968b72016-10-29 16:57:20 +0200394 for ext in self.extensions:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000395 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000396 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000397 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000398 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000399 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000400 else:
401 ext.depends = []
402 # re-compile extensions if a header file has been changed
403 ext.depends.extend(headers)
404
Victor Stinner00c77ae2020-03-04 18:44:49 +0100405 def remove_configured_extensions(self):
406 # The sysconfig variables built by makesetup that list the already
407 # built modules and the disabled modules as configured by the Setup
408 # files.
409 sysconf_built = sysconfig.get_config_var('MODBUILT_NAMES').split()
410 sysconf_dis = sysconfig.get_config_var('MODDISABLED_NAMES').split()
411
412 mods_built = []
413 mods_disabled = []
414 for ext in self.extensions:
xdegayec0364fc2017-05-27 18:25:03 +0200415 # If a module has already been built or has been disabled in the
416 # Setup files, don't build it here.
417 if ext.name in sysconf_built:
418 mods_built.append(ext)
419 if ext.name in sysconf_dis:
420 mods_disabled.append(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000421
xdegayec0364fc2017-05-27 18:25:03 +0200422 mods_configured = mods_built + mods_disabled
423 if mods_configured:
Xavier de Gaye84968b72016-10-29 16:57:20 +0200424 self.extensions = [x for x in self.extensions if x not in
xdegayec0364fc2017-05-27 18:25:03 +0200425 mods_configured]
426 # Remove the shared libraries built by a previous build.
427 for ext in mods_configured:
428 fullpath = self.get_ext_fullpath(ext.name)
429 if os.path.exists(fullpath):
430 os.unlink(fullpath)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000431
Victor Stinner00c77ae2020-03-04 18:44:49 +0100432 return (mods_built, mods_disabled)
433
434 def set_compiler_executables(self):
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000435 # When you run "make CC=altcc" or something similar, you really want
436 # those environment variables passed into the setup.py phase. Here's
437 # a small set of useful ones.
438 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000439 args = {}
440 # unfortunately, distutils doesn't let us provide separate C and C++
441 # compilers
442 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000443 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
444 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000445 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000446
Victor Stinner00c77ae2020-03-04 18:44:49 +0100447 def build_extensions(self):
448 self.set_srcdir()
449
450 # Detect which modules should be compiled
451 self.detect_modules()
452
Victor Stinnercad80202021-01-19 23:04:49 +0100453 if not LIST_MODULE_NAMES:
454 self.remove_disabled()
Victor Stinner00c77ae2020-03-04 18:44:49 +0100455
456 self.update_sources_depends()
457 mods_built, mods_disabled = self.remove_configured_extensions()
458 self.set_compiler_executables()
459
Victor Stinnercad80202021-01-19 23:04:49 +0100460 if LIST_MODULE_NAMES:
461 for ext in self.extensions:
462 print(ext.name)
463 for name in self.missing:
464 print(name)
465 return
466
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000467 build_ext.build_extensions(self)
468
Victor Stinner1ec63b62020-03-04 14:50:19 +0100469 if SUBPROCESS_BOOTSTRAP:
470 # Drop our custom subprocess module:
471 # use the newly built subprocess module
472 del sys.modules['subprocess']
473
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200474 for ext in self.extensions:
475 self.check_extension_import(ext)
476
Victor Stinner00c77ae2020-03-04 18:44:49 +0100477 self.summary(mods_built, mods_disabled)
478
479 def summary(self, mods_built, mods_disabled):
Berker Peksag1d82a9c2014-10-01 05:11:13 +0300480 longest = max([len(e.name) for e in self.extensions], default=0)
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400481 if self.failed or self.failed_on_import:
482 all_failed = self.failed + self.failed_on_import
483 longest = max(longest, max([len(name) for name in all_failed]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000484
485 def print_three_column(lst):
486 lst.sort(key=str.lower)
487 # guarantee zip() doesn't drop anything
488 while len(lst) % 3:
489 lst.append("")
490 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
491 print("%-*s %-*s %-*s" % (longest, e, longest, f,
492 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000493
Victor Stinner8058bda2019-03-01 15:31:45 +0100494 if self.missing:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000495 print()
Brett Cannonae95b4f2013-07-12 11:30:32 -0400496 print("Python build finished successfully!")
497 print("The necessary bits to build these optional modules were not "
498 "found:")
Victor Stinner8058bda2019-03-01 15:31:45 +0100499 print_three_column(self.missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000500 print("To find the necessary bits, look in setup.py in"
501 " detect_modules() for the module's name.")
502 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000503
xdegayec0364fc2017-05-27 18:25:03 +0200504 if mods_built:
505 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200506 print("The following modules found by detect_modules() in"
507 " setup.py, have been")
508 print("built by the Makefile instead, as configured by the"
509 " Setup files:")
xdegayec0364fc2017-05-27 18:25:03 +0200510 print_three_column([ext.name for ext in mods_built])
511 print()
512
513 if mods_disabled:
514 print()
515 print("The following modules found by detect_modules() in"
516 " setup.py have not")
517 print("been built, they are *disabled* in the Setup files:")
518 print_three_column([ext.name for ext in mods_disabled])
519 print()
Xavier de Gaye84968b72016-10-29 16:57:20 +0200520
Christian Heimes9b60e552020-05-15 23:54:53 +0200521 if self.disabled_configure:
522 print()
523 print("The following modules found by detect_modules() in"
524 " setup.py have not")
525 print("been built, they are *disabled* by configure:")
526 print_three_column(self.disabled_configure)
527 print()
528
Guido van Rossumd8faa362007-04-27 19:54:29 +0000529 if self.failed:
530 failed = self.failed[:]
531 print()
532 print("Failed to build these modules:")
533 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000534 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000535
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400536 if self.failed_on_import:
537 failed = self.failed_on_import[:]
538 print()
539 print("Following modules built successfully"
540 " but were removed because they could not be imported:")
541 print_three_column(failed)
542 print()
543
Christian Heimes61d478c2018-01-27 15:51:38 +0100544 if any('_ssl' in l
Victor Stinner8058bda2019-03-01 15:31:45 +0100545 for l in (self.missing, self.failed, self.failed_on_import)):
Christian Heimes61d478c2018-01-27 15:51:38 +0100546 print()
547 print("Could not build the ssl module!")
548 print("Python requires an OpenSSL 1.0.2 or 1.1 compatible "
549 "libssl with X509_VERIFY_PARAM_set1_host().")
550 print("LibreSSL 2.6.4 and earlier do not provide the necessary "
551 "APIs, https://github.com/libressl-portable/portable/issues/381")
Christian Heimes32eba612021-03-19 10:29:25 +0100552 if sysconfig.get_config_var("OPENSSL_LDFLAGS"):
553 print("Custom linker flags may require --with-openssl-rpath=auto")
Christian Heimes61d478c2018-01-27 15:51:38 +0100554 print()
555
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000556 def build_extension(self, ext):
557
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000558 if ext.name == '_ctypes':
559 if not self.configure_ctypes(ext):
Zachary Waref40d4dd2016-09-17 01:25:24 -0500560 self.failed.append(ext.name)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000561 return
562
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000563 try:
564 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000565 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000566 self.announce('WARNING: building of extension "%s" failed: %s' %
Victor Stinner625dbf22019-03-01 15:59:39 +0100567 (ext.name, why))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000568 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000569 return
Antoine Pitrou2c0a9162014-09-26 23:31:59 +0200570
571 def check_extension_import(self, ext):
572 # Don't try to import an extension that has failed to compile
573 if ext.name in self.failed:
574 self.announce(
575 'WARNING: skipping import check for failed build "%s"' %
576 ext.name, level=1)
577 return
578
Jack Jansenf49c6f92001-11-01 14:44:15 +0000579 # Workaround for Mac OS X: The Carbon-based modules cannot be
580 # reliably imported into a command-line Python
581 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000582 self.announce(
583 'WARNING: skipping import check for Carbon-based "%s"' %
584 ext.name)
585 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000586
Victor Stinner4cbea512019-02-28 17:48:38 +0100587 if MACOS and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000588 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000589 # Don't bother doing an import check when an extension was
590 # build with an explicit '-arch' flag on OSX. That's currently
591 # only used to build 32-bit only extensions in a 4-way
592 # universal build and loading 32-bit code into a 64-bit
593 # process will fail.
594 self.announce(
595 'WARNING: skipping import check for "%s"' %
596 ext.name)
597 return
598
Jason Tishler24cf7762002-05-22 16:46:15 +0000599 # Workaround for Cygwin: Cygwin currently has fork issues when many
600 # modules have been imported
Victor Stinner4cbea512019-02-28 17:48:38 +0100601 if CYGWIN:
Jason Tishler24cf7762002-05-22 16:46:15 +0000602 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
603 % ext.name)
604 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000605 ext_filename = os.path.join(
606 self.build_lib,
607 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000608
609 # If the build directory didn't exist when setup.py was
610 # started, sys.path_importer_cache has a negative result
611 # cached. Clear that cache before trying to import.
612 sys.path_importer_cache.clear()
613
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200614 # Don't try to load extensions for cross builds
Victor Stinner4cbea512019-02-28 17:48:38 +0100615 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200616 return
617
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400618 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Eric Snow335e14d2014-01-04 15:09:28 -0700619 spec = importlib.util.spec_from_file_location(ext.name, ext_filename,
620 loader=loader)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000621 try:
Brett Cannon2a17bde2014-05-30 14:55:29 -0400622 importlib._bootstrap._load(spec)
Guido van Rossumb940e112007-01-10 16:19:56 +0000623 except ImportError as why:
Benjamin Peterson5c2ac8c2014-04-30 11:06:16 -0400624 self.failed_on_import.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000625 self.announce('*** WARNING: renaming "%s" since importing it'
626 ' failed: %s' % (ext.name, why), level=3)
627 assert not self.inplace
628 basename, tail = os.path.splitext(ext_filename)
629 newname = basename + "_failed" + tail
630 if os.path.exists(newname):
631 os.remove(newname)
632 os.rename(ext_filename, newname)
633
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000634 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000635 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000636 self.announce('*** WARNING: importing extension "%s" '
637 'failed with %s: %s' % (ext.name, exc_type, why),
638 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000639 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000640
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400641 def add_multiarch_paths(self):
642 # Debian/Ubuntu multiarch support.
643 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200644 cc = sysconfig.get_config_var('CC')
645 tmpfile = os.path.join(self.build_temp, 'multiarch')
646 if not os.path.exists(self.build_temp):
647 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200648 ret = run_command(
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200649 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
650 multiarch_path_component = ''
651 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200652 if ret == 0:
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200653 with open(tmpfile) as fp:
654 multiarch_path_component = fp.readline().strip()
655 finally:
656 os.unlink(tmpfile)
657
658 if multiarch_path_component != '':
659 add_dir_to_list(self.compiler.library_dirs,
660 '/usr/lib/' + multiarch_path_component)
661 add_dir_to_list(self.compiler.include_dirs,
662 '/usr/include/' + multiarch_path_component)
663 return
664
Barry Warsaw88e19452011-04-07 10:40:36 -0400665 if not find_executable('dpkg-architecture'):
666 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200667 opt = ''
Victor Stinner4cbea512019-02-28 17:48:38 +0100668 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200669 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400670 tmpfile = os.path.join(self.build_temp, 'multiarch')
671 if not os.path.exists(self.build_temp):
672 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200673 ret = run_command(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200674 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
675 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400676 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200677 if ret == 0:
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400678 with open(tmpfile) as fp:
679 multiarch_path_component = fp.readline().strip()
680 add_dir_to_list(self.compiler.library_dirs,
681 '/usr/lib/' + multiarch_path_component)
682 add_dir_to_list(self.compiler.include_dirs,
683 '/usr/include/' + multiarch_path_component)
684 finally:
685 os.unlink(tmpfile)
686
pxinwr5e45f1c2021-01-22 08:55:52 +0800687 def add_wrcc_search_dirs(self):
688 # add library search path by wr-cc, the compiler wrapper
689
690 def convert_mixed_path(path):
691 # convert path like C:\folder1\folder2/folder3/folder4
692 # to msys style /c/folder1/folder2/folder3/folder4
693 drive = path[0].lower()
694 left = path[2:].replace("\\", "/")
695 return "/" + drive + left
696
697 def add_search_path(line):
698 # On Windows building machine, VxWorks does
699 # cross builds under msys2 environment.
700 pathsep = (";" if sys.platform == "msys" else ":")
701 for d in line.strip().split("=")[1].split(pathsep):
702 d = d.strip()
703 if sys.platform == "msys":
704 # On Windows building machine, compiler
705 # returns mixed style path like:
706 # C:\folder1\folder2/folder3/folder4
707 d = convert_mixed_path(d)
708 d = os.path.normpath(d)
709 add_dir_to_list(self.compiler.library_dirs, d)
710
711 cc = sysconfig.get_config_var('CC')
712 tmpfile = os.path.join(self.build_temp, 'wrccpaths')
713 os.makedirs(self.build_temp, exist_ok=True)
714 try:
715 ret = run_command('%s --print-search-dirs >%s' % (cc, tmpfile))
716 if ret:
717 return
718 with open(tmpfile) as fp:
719 # Parse paths in libraries line. The line is like:
720 # On Linux, "libraries: = path1:path2:path3"
721 # On Windows, "libraries: = path1;path2;path3"
722 for line in fp:
723 if not line.startswith("libraries"):
724 continue
725 add_search_path(line)
726 finally:
727 try:
728 os.unlink(tmpfile)
729 except OSError:
730 pass
731
pxinwr32f5fdd2019-02-27 19:09:28 +0800732 def add_cross_compiling_paths(self):
733 cc = sysconfig.get_config_var('CC')
734 tmpfile = os.path.join(self.build_temp, 'ccpaths')
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200735 if not os.path.exists(self.build_temp):
736 os.makedirs(self.build_temp)
Victor Stinner6b982c22020-04-01 01:10:07 +0200737 ret = run_command('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200738 is_gcc = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800739 is_clang = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200740 in_incdirs = False
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200741 try:
Victor Stinner6b982c22020-04-01 01:10:07 +0200742 if ret == 0:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200743 with open(tmpfile) as fp:
744 for line in fp.readlines():
745 if line.startswith("gcc version"):
746 is_gcc = True
pxinwr32f5fdd2019-02-27 19:09:28 +0800747 elif line.startswith("clang version"):
748 is_clang = True
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200749 elif line.startswith("#include <...>"):
750 in_incdirs = True
751 elif line.startswith("End of search list"):
752 in_incdirs = False
pxinwr32f5fdd2019-02-27 19:09:28 +0800753 elif (is_gcc or is_clang) and line.startswith("LIBRARY_PATH"):
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200754 for d in line.strip().split("=")[1].split(":"):
755 d = os.path.normpath(d)
756 if '/gcc/' not in d:
757 add_dir_to_list(self.compiler.library_dirs,
758 d)
pxinwr32f5fdd2019-02-27 19:09:28 +0800759 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 +0200760 add_dir_to_list(self.compiler.include_dirs,
761 line.strip())
762 finally:
763 os.unlink(tmpfile)
764
pxinwr5e45f1c2021-01-22 08:55:52 +0800765 if VXWORKS:
766 self.add_wrcc_search_dirs()
767
Victor Stinnercfe172d2019-03-01 18:21:49 +0100768 def add_ldflags_cppflags(self):
Brett Cannon516592f2004-12-07 00:42:59 +0000769 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000770 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000771 # We must get the values from the Makefile and not the environment
772 # directly since an inconsistently reproducible issue comes up where
773 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000774 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000775 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000776 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
777 ('LDFLAGS', '-L', self.compiler.library_dirs),
778 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000779 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000780 if env_val:
Chih-Hsuan Yen09b2bec2018-07-11 16:48:43 +0800781 parser = argparse.ArgumentParser()
782 parser.add_argument(arg_name, dest="dirs", action="append")
783 options, _ = parser.parse_known_args(env_val.split())
Brett Cannon44837712005-01-02 21:54:07 +0000784 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000785 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000786 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000787
Victor Stinnercfe172d2019-03-01 18:21:49 +0100788 def configure_compiler(self):
789 # Ensure that /usr/local is always used, but the local build
790 # directories (i.e. '.' and 'Include') must be first. See issue
791 # 10520.
792 if not CROSS_COMPILING:
793 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
794 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
795 # only change this for cross builds for 3.3, issues on Mageia
796 if CROSS_COMPILING:
797 self.add_cross_compiling_paths()
798 self.add_multiarch_paths()
799 self.add_ldflags_cppflags()
800
Victor Stinner5ec33a12019-03-01 16:43:28 +0100801 def init_inc_lib_dirs(self):
Victor Stinner4cbea512019-02-28 17:48:38 +0100802 if (not CROSS_COMPILING and
Xavier de Gaye1351c312016-12-14 11:14:33 +0100803 os.path.normpath(sys.base_prefix) != '/usr' and
804 not sysconfig.get_config_var('PYTHONFRAMEWORK')):
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000805 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
806 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
807 # building a framework with different architectures than
808 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000809 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000810 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000811 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000812 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000813
xdegaye77f51392017-11-25 17:25:30 +0100814 system_lib_dirs = ['/lib64', '/usr/lib64', '/lib', '/usr/lib']
815 system_include_dirs = ['/usr/include']
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000816 # lib_dirs and inc_dirs are used to search for files;
817 # if a file is found in one of those directories, it can
818 # be assumed that no additional -I,-L directives are needed.
Victor Stinner4cbea512019-02-28 17:48:38 +0100819 if not CROSS_COMPILING:
Victor Stinner625dbf22019-03-01 15:59:39 +0100820 self.lib_dirs = self.compiler.library_dirs + system_lib_dirs
821 self.inc_dirs = self.compiler.include_dirs + system_include_dirs
Christian Heimesf19529c2012-12-12 12:41:00 +0100822 else:
xdegaye77f51392017-11-25 17:25:30 +0100823 # Add the sysroot paths. 'sysroot' is a compiler option used to
824 # set the logical path of the standard system headers and
825 # libraries.
Victor Stinner625dbf22019-03-01 15:59:39 +0100826 self.lib_dirs = (self.compiler.library_dirs +
827 sysroot_paths(('LDFLAGS', 'CC'), system_lib_dirs))
828 self.inc_dirs = (self.compiler.include_dirs +
829 sysroot_paths(('CPPFLAGS', 'CFLAGS', 'CC'),
830 system_include_dirs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000831
Brett Cannon4454a1f2005-04-15 20:32:39 +0000832 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000833 with open(config_h) as file:
Victor Stinner5ec33a12019-03-01 16:43:28 +0100834 self.config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000835
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000836 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
Victor Stinner4cbea512019-02-28 17:48:38 +0100837 if HOST_PLATFORM in ['osf1', 'unixware7', 'openunix8']:
Victor Stinner625dbf22019-03-01 15:59:39 +0100838 self.lib_dirs += ['/usr/ccs/lib']
Skip Montanaro22e00c42003-05-06 20:43:34 +0000839
Charles-François Natali5739e102012-04-12 19:07:25 +0200840 # HP-UX11iv3 keeps files in lib/hpux folders.
Victor Stinner4cbea512019-02-28 17:48:38 +0100841 if HOST_PLATFORM == 'hp-ux11':
Victor Stinner625dbf22019-03-01 15:59:39 +0100842 self.lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
Charles-François Natali5739e102012-04-12 19:07:25 +0200843
Victor Stinner4cbea512019-02-28 17:48:38 +0100844 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000845 # This should work on any unixy platform ;-)
846 # If the user has bothered specifying additional -I and -L flags
847 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000848 #
849 # NOTE: using shlex.split would technically be more correct, but
850 # also gives a bootstrap problem. Let's hope nobody uses
851 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000852 cflags, ldflags = sysconfig.get_config_vars(
853 'CFLAGS', 'LDFLAGS')
854 for item in cflags.split():
855 if item.startswith('-I'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100856 self.inc_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000857
858 for item in ldflags.split():
859 if item.startswith('-L'):
Victor Stinner625dbf22019-03-01 15:59:39 +0100860 self.lib_dirs.append(item[2:])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000861
Victor Stinner5ec33a12019-03-01 16:43:28 +0100862 def detect_simple_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000863 #
864 # The following modules are all pretty straightforward, and compile
865 # on pretty much any POSIXish platform.
866 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000867
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000868 # array objects
Victor Stinner8058bda2019-03-01 15:31:45 +0100869 self.add(Extension('array', ['arraymodule.c']))
Martin Panterc9deece2016-02-03 05:19:44 +0000870
Yury Selivanovf23746a2018-01-22 19:11:18 -0500871 # Context Variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100872 self.add(Extension('_contextvars', ['_contextvarsmodule.c']))
Yury Selivanovf23746a2018-01-22 19:11:18 -0500873
Martin Panterc9deece2016-02-03 05:19:44 +0000874 shared_math = 'Modules/_math.o'
Victor Stinnercfe172d2019-03-01 18:21:49 +0100875
876 # math library functions, e.g. sin()
877 self.add(Extension('math', ['mathmodule.c'],
Victor Stinnere9e7d282020-02-12 22:54:42 +0100878 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100879 extra_objects=[shared_math],
880 depends=['_math.h', shared_math],
881 libraries=['m']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100882
883 # complex math library functions
884 self.add(Extension('cmath', ['cmathmodule.c'],
Victor Stinnere9e7d282020-02-12 22:54:42 +0100885 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner8058bda2019-03-01 15:31:45 +0100886 extra_objects=[shared_math],
887 depends=['_math.h', shared_math],
888 libraries=['m']))
Victor Stinnere0be4232011-10-25 13:06:09 +0200889
890 # time libraries: librt may be needed for clock_gettime()
891 time_libs = []
892 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
893 if lib:
894 time_libs.append(lib)
895
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000896 # time operations and variables
Victor Stinner8058bda2019-03-01 15:31:45 +0100897 self.add(Extension('time', ['timemodule.c'],
898 libraries=time_libs))
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800899 # libm is needed by delta_new() that uses round() and by accum() that
900 # uses modf().
Victor Stinner8058bda2019-03-01 15:31:45 +0100901 self.add(Extension('_datetime', ['_datetimemodule.c'],
Victor Stinner04fc4f22020-06-16 01:28:07 +0200902 libraries=['m'],
903 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Paul Ganssle62972d92020-05-16 04:20:06 -0400904 # zoneinfo module
Victor Stinner37834132020-10-27 17:12:53 +0100905 self.add(Extension('_zoneinfo', ['_zoneinfo.c'],
906 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Christian Heimesfe337bf2008-03-23 21:54:12 +0000907 # random number generator implemented in C
Victor Stinner9f5fe792020-04-17 19:05:35 +0200908 self.add(Extension("_random", ["_randommodule.c"],
909 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Raymond Hettinger0c410272004-01-05 10:13:35 +0000910 # bisect
Victor Stinner8058bda2019-03-01 15:31:45 +0100911 self.add(Extension("_bisect", ["_bisectmodule.c"]))
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000912 # heapq
Victor Stinnerc45dbe932020-06-22 17:39:32 +0200913 self.add(Extension("_heapq", ["_heapqmodule.c"],
914 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000915 # C-optimized pickle replacement
Victor Stinner5c75f372019-04-17 23:02:26 +0200916 self.add(Extension("_pickle", ["_pickle.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200917 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Christian Heimes90540002008-05-08 14:29:10 +0000918 # _json speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100919 self.add(Extension("_json", ["_json.c"],
Victor Stinner57491342019-04-23 12:26:33 +0200920 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinnercfe172d2019-03-01 18:21:49 +0100921
Fred Drake0e474a82007-10-11 18:01:43 +0000922 # profiler (_lsprof is for cProfile.py)
Victor Stinner8058bda2019-03-01 15:31:45 +0100923 self.add(Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000924 # static Unicode character database
Victor Stinner8058bda2019-03-01 15:31:45 +0100925 self.add(Extension('unicodedata', ['unicodedata.c'],
Victor Stinner47e1afd2020-10-26 16:43:47 +0100926 depends=['unicodedata_db.h', 'unicodename_db.h'],
927 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Larry Hastings3a907972013-11-23 14:49:22 -0800928 # _opcode module
Victor Stinner8058bda2019-03-01 15:31:45 +0100929 self.add(Extension('_opcode', ['_opcode.c']))
INADA Naoki9f2ce252016-10-15 15:39:19 +0900930 # asyncio speedups
Chris Jerdonekda742ba2020-05-17 22:47:31 -0700931 self.add(Extension("_asyncio", ["_asynciomodule.c"],
932 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Ivan Levkivskyi03e3c342018-02-18 12:41:58 +0000933 # _abc speedups
Victor Stinner8058bda2019-03-01 15:31:45 +0100934 self.add(Extension("_abc", ["_abc.c"]))
Antoine Pitrou94e16962018-01-16 00:27:16 +0100935 # _queue module
Victor Stinner8058bda2019-03-01 15:31:45 +0100936 self.add(Extension("_queue", ["_queuemodule.c"]))
Dong-hee Na0a18ee42019-08-24 07:20:30 +0900937 # _statistics module
938 self.add(Extension("_statistics", ["_statisticsmodule.c"]))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000939
940 # Modules with some UNIX dependencies -- on by default:
941 # (If you have a really backward UNIX, select and socket may not be
942 # supported...)
943
944 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000945 libs = []
Victor Stinner5ec33a12019-03-01 16:43:28 +0100946 if (self.config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
Antoine Pitroua3000072010-09-07 14:52:42 +0000947 # May be necessary on AIX for flock function
948 libs = ['bsd']
Victor Stinner8058bda2019-03-01 15:31:45 +0100949 self.add(Extension('fcntl', ['fcntlmodule.c'],
950 libraries=libs))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000951 # pwd(3)
Victor Stinner8058bda2019-03-01 15:31:45 +0100952 self.add(Extension('pwd', ['pwdmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000953 # grp(3)
pxinwr32f5fdd2019-02-27 19:09:28 +0800954 if not VXWORKS:
Victor Stinner8058bda2019-03-01 15:31:45 +0100955 self.add(Extension('grp', ['grpmodule.c']))
Ronald Oussoren94f25282010-05-05 19:11:21 +0000956 # spwd, shadow passwords
Victor Stinner5ec33a12019-03-01 16:43:28 +0100957 if (self.config_h_vars.get('HAVE_GETSPNAM', False) or
958 self.config_h_vars.get('HAVE_GETSPENT', False)):
Victor Stinner8058bda2019-03-01 15:31:45 +0100959 self.add(Extension('spwd', ['spwdmodule.c']))
Michael Felt08970cb2019-06-21 15:58:00 +0200960 # AIX has shadow passwords, but access is not via getspent(), etc.
961 # module support is not expected so it not 'missing'
962 elif not AIX:
Victor Stinner8058bda2019-03-01 15:31:45 +0100963 self.missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000964
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000965 # select(2); not on ancient System V
Victor Stinner8058bda2019-03-01 15:31:45 +0100966 self.add(Extension('select', ['selectmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000967
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000968 # Memory-mapped files (also works on Win32).
Victor Stinner8058bda2019-03-01 15:31:45 +0100969 self.add(Extension('mmap', ['mmapmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000970
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000971 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000972 # syslog daemon interface
Victor Stinner8058bda2019-03-01 15:31:45 +0100973 self.add(Extension('syslog', ['syslogmodule.c']))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000974
Eric Snow7f8bfc92018-01-29 18:23:44 -0700975 # Python interface to subinterpreter C-API.
Eric Snowc11183c2019-03-15 16:35:46 -0600976 self.add(Extension('_xxsubinterpreters', ['_xxsubinterpretersmodule.c']))
Eric Snow7f8bfc92018-01-29 18:23:44 -0700977
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000978 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000979 # Here ends the simple stuff. From here on, modules need certain
980 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000981 #
982
983 # Multimedia modules
984 # These don't work for 64-bit platforms!!!
985 # These represent audio samples or images as strings:
Victor Stinnerdef80722016-04-19 15:58:11 +0200986 #
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000987 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000988 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000989 # 64-bit platforms.
Victor Stinnerdef80722016-04-19 15:58:11 +0200990 #
Benjamin Peterson8acaa312017-11-12 20:53:39 -0800991 # audioop needs libm for floor() in multiple functions.
Victor Stinner8058bda2019-03-01 15:31:45 +0100992 self.add(Extension('audioop', ['audioop.c'],
993 libraries=['m']))
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000994
Victor Stinner5ec33a12019-03-01 16:43:28 +0100995 # CSV files
996 self.add(Extension('_csv', ['_csv.c']))
997
998 # POSIX subprocess module helper.
Kyle Evans79925792020-10-13 15:04:44 -0500999 self.add(Extension('_posixsubprocess', ['_posixsubprocess.c'],
1000 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner5ec33a12019-03-01 16:43:28 +01001001
Victor Stinnercfe172d2019-03-01 18:21:49 +01001002 def detect_test_extensions(self):
1003 # Python C API test module
1004 self.add(Extension('_testcapi', ['_testcapimodule.c'],
1005 depends=['testcapi_long.h']))
1006
Victor Stinner23bace22019-04-18 11:37:26 +02001007 # Python Internal C API test module
1008 self.add(Extension('_testinternalcapi', ['_testinternalcapi.c'],
Victor Stinner57491342019-04-23 12:26:33 +02001009 extra_compile_args=['-DPy_BUILD_CORE_MODULE']))
Victor Stinner23bace22019-04-18 11:37:26 +02001010
Victor Stinnercfe172d2019-03-01 18:21:49 +01001011 # Python PEP-3118 (buffer protocol) test module
1012 self.add(Extension('_testbuffer', ['_testbuffer.c']))
1013
1014 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
1015 self.add(Extension('_testimportmultiple', ['_testimportmultiple.c']))
1016
1017 # Test multi-phase extension module init (PEP 489)
1018 self.add(Extension('_testmultiphase', ['_testmultiphase.c']))
1019
1020 # Fuzz tests.
1021 self.add(Extension('_xxtestfuzz',
1022 ['_xxtestfuzz/_xxtestfuzz.c',
1023 '_xxtestfuzz/fuzzer.c']))
1024
Victor Stinner5ec33a12019-03-01 16:43:28 +01001025 def detect_readline_curses(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001026 # readline
Stefan Krah095b2732010-06-08 13:41:44 +00001027 readline_termcap_library = ""
1028 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +02001029 # Cannot use os.popen here in py3k.
1030 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
1031 if not os.path.exists(self.build_temp):
1032 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +00001033 # Determine if readline is already linked against curses or tinfo.
Roland Hiebere1f77692021-02-09 02:05:25 +01001034 if sysconfig.get_config_var('HAVE_LIBREADLINE'):
1035 if sysconfig.get_config_var('WITH_EDITLINE'):
1036 readline_lib = 'edit'
1037 else:
1038 readline_lib = 'readline'
1039 do_readline = self.compiler.find_library_file(self.lib_dirs,
1040 readline_lib)
Victor Stinner4cbea512019-02-28 17:48:38 +01001041 if CROSS_COMPILING:
Victor Stinner6b982c22020-04-01 01:10:07 +02001042 ret = run_command("%s -d %s | grep '(NEEDED)' > %s"
doko@ubuntu.com58844492012-06-30 18:25:32 +02001043 % (sysconfig.get_config_var('READELF'),
1044 do_readline, tmpfile))
1045 elif find_executable('ldd'):
Victor Stinner6b982c22020-04-01 01:10:07 +02001046 ret = run_command("ldd %s > %s" % (do_readline, tmpfile))
doko@ubuntu.com58844492012-06-30 18:25:32 +02001047 else:
Victor Stinner6b982c22020-04-01 01:10:07 +02001048 ret = 1
1049 if ret == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +00001050 with open(tmpfile) as fp:
1051 for ln in fp:
1052 if 'curses' in ln:
1053 readline_termcap_library = re.sub(
1054 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
1055 ).rstrip()
1056 break
1057 # termcap interface split out from ncurses
1058 if 'tinfo' in ln:
1059 readline_termcap_library = 'tinfo'
1060 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +02001061 if os.path.exists(tmpfile):
1062 os.unlink(tmpfile)
Roland Hiebere1f77692021-02-09 02:05:25 +01001063 else:
1064 do_readline = False
Stefan Krah095b2732010-06-08 13:41:44 +00001065 # Issue 7384: If readline is already linked against curses,
1066 # use the same library for the readline and curses modules.
1067 if 'curses' in readline_termcap_library:
1068 curses_library = readline_termcap_library
Victor Stinner625dbf22019-03-01 15:59:39 +01001069 elif self.compiler.find_library_file(self.lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +00001070 curses_library = 'ncursesw'
Michael Felt08970cb2019-06-21 15:58:00 +02001071 # Issue 36210: OSS provided ncurses does not link on AIX
1072 # Use IBM supplied 'curses' for successful build of _curses
1073 elif AIX and self.compiler.find_library_file(self.lib_dirs, 'curses'):
1074 curses_library = 'curses'
Victor Stinner625dbf22019-03-01 15:59:39 +01001075 elif self.compiler.find_library_file(self.lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001076 curses_library = 'ncurses'
Victor Stinner625dbf22019-03-01 15:59:39 +01001077 elif self.compiler.find_library_file(self.lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001078 curses_library = 'curses'
1079
Victor Stinner4cbea512019-02-28 17:48:38 +01001080 if MACOS:
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001081 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +00001082 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily04cdfa12014-06-25 13:36:14 -07001083 if (dep_target and
Ronald Oussoren49926cf2021-02-01 04:29:44 +01001084 (tuple(int(n) for n in dep_target.split('.')[0:2])
Ned Deily04cdfa12014-06-25 13:36:14 -07001085 < (10, 5) ) ):
Ronald Oussoren961683a2010-03-08 07:09:59 +00001086 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001087 if os_release < 9:
1088 # MacOSX 10.4 has a broken readline. Don't try to build
1089 # the readline module unless the user has installed a fixed
1090 # readline package
Victor Stinner625dbf22019-03-01 15:59:39 +01001091 if find_file('readline/rlconf.h', self.inc_dirs, []) is None:
Ronald Oussoren2efd9242009-09-20 14:53:22 +00001092 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +00001093 if do_readline:
Victor Stinner4cbea512019-02-28 17:48:38 +01001094 if MACOS and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001095 # In every directory on the search path search for a dynamic
1096 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +00001097 # for dynamic libraries on the entire path.
Martin Pantere26da7c2016-06-02 10:07:09 +00001098 # This way a statically linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001099 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +00001100 readline_extra_link_args = ('-Wl,-search_paths_first',)
1101 else:
1102 readline_extra_link_args = ()
1103
Roland Hiebere1f77692021-02-09 02:05:25 +01001104 readline_libs = [readline_lib]
Stefan Krah095b2732010-06-08 13:41:44 +00001105 if readline_termcap_library:
1106 pass # Issue 7384: Already linked against curses or tinfo.
1107 elif curses_library:
1108 readline_libs.append(curses_library)
Victor Stinner625dbf22019-03-01 15:59:39 +01001109 elif self.compiler.find_library_file(self.lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001110 ['/usr/lib/termcap'],
1111 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +00001112 readline_libs.append('termcap')
Victor Stinner8058bda2019-03-01 15:31:45 +01001113 self.add(Extension('readline', ['readline.c'],
1114 library_dirs=['/usr/lib/termcap'],
1115 extra_link_args=readline_extra_link_args,
1116 libraries=readline_libs))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001117 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001118 self.missing.append('readline')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001119
Victor Stinner5ec33a12019-03-01 16:43:28 +01001120 # Curses support, requiring the System V version of curses, often
1121 # provided by the ncurses library.
1122 curses_defines = []
1123 curses_includes = []
1124 panel_library = 'panel'
1125 if curses_library == 'ncursesw':
1126 curses_defines.append(('HAVE_NCURSESW', '1'))
1127 if not CROSS_COMPILING:
1128 curses_includes.append('/usr/include/ncursesw')
1129 # Bug 1464056: If _curses.so links with ncursesw,
1130 # _curses_panel.so must link with panelw.
1131 panel_library = 'panelw'
1132 if MACOS:
1133 # On OS X, there is no separate /usr/lib/libncursesw nor
1134 # libpanelw. If we are here, we found a locally-supplied
1135 # version of libncursesw. There should also be a
1136 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1137 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1138 # ncurses wide char support
1139 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
1140 elif MACOS and curses_library == 'ncurses':
1141 # Building with the system-suppied combined libncurses/libpanel
1142 curses_defines.append(('HAVE_NCURSESW', '1'))
1143 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Tim Peters2c60f7a2003-01-29 03:49:43 +00001144
Victor Stinnercfe172d2019-03-01 18:21:49 +01001145 curses_enabled = True
Victor Stinner5ec33a12019-03-01 16:43:28 +01001146 if curses_library.startswith('ncurses'):
1147 curses_libs = [curses_library]
1148 self.add(Extension('_curses', ['_cursesmodule.c'],
Victor Stinner37834132020-10-27 17:12:53 +01001149 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001150 include_dirs=curses_includes,
1151 define_macros=curses_defines,
1152 libraries=curses_libs))
1153 elif curses_library == 'curses' and not MACOS:
1154 # OSX has an old Berkeley curses, not good enough for
1155 # the _curses module.
1156 if (self.compiler.find_library_file(self.lib_dirs, 'terminfo')):
1157 curses_libs = ['curses', 'terminfo']
1158 elif (self.compiler.find_library_file(self.lib_dirs, 'termcap')):
1159 curses_libs = ['curses', 'termcap']
1160 else:
1161 curses_libs = ['curses']
1162
1163 self.add(Extension('_curses', ['_cursesmodule.c'],
Victor Stinner37834132020-10-27 17:12:53 +01001164 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001165 define_macros=curses_defines,
1166 libraries=curses_libs))
1167 else:
Victor Stinnercfe172d2019-03-01 18:21:49 +01001168 curses_enabled = False
Victor Stinner5ec33a12019-03-01 16:43:28 +01001169 self.missing.append('_curses')
1170
1171 # If the curses module is enabled, check for the panel module
Michael Felt08970cb2019-06-21 15:58:00 +02001172 # _curses_panel needs some form of ncurses
1173 skip_curses_panel = True if AIX else False
1174 if (curses_enabled and not skip_curses_panel and
1175 self.compiler.find_library_file(self.lib_dirs, panel_library)):
Victor Stinner5ec33a12019-03-01 16:43:28 +01001176 self.add(Extension('_curses_panel', ['_curses_panel.c'],
Michael Felt08970cb2019-06-21 15:58:00 +02001177 include_dirs=curses_includes,
1178 define_macros=curses_defines,
1179 libraries=[panel_library, *curses_libs]))
1180 elif not skip_curses_panel:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001181 self.missing.append('_curses_panel')
1182
1183 def detect_crypt(self):
1184 # crypt module.
pxinwr236d0b72019-04-15 17:02:20 +08001185 if VXWORKS:
1186 # bpo-31904: crypt() function is not provided by VxWorks.
1187 # DES_crypt() OpenSSL provides is too weak to implement
1188 # the encryption.
Victor Stinnercad80202021-01-19 23:04:49 +01001189 self.missing.append('_crypt')
pxinwr236d0b72019-04-15 17:02:20 +08001190 return
1191
Victor Stinner625dbf22019-03-01 15:59:39 +01001192 if self.compiler.find_library_file(self.lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +00001193 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +00001194 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +00001195 libs = []
pxinwr32f5fdd2019-02-27 19:09:28 +08001196
Victor Stinnercad80202021-01-19 23:04:49 +01001197 self.add(Extension('_crypt', ['_cryptmodule.c'], libraries=libs))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001198
Victor Stinner5ec33a12019-03-01 16:43:28 +01001199 def detect_socket(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001200 # socket(2)
Erlend Egeberg Aaslandccdcb202020-11-18 01:08:58 +01001201 kwargs = {'depends': ['socketmodule.h']}
pxinwr00a65682020-11-29 06:14:16 +08001202 if MACOS:
Erlend Egeberg Aaslandccdcb202020-11-18 01:08:58 +01001203 # Issue #35569: Expose RFC 3542 socket options.
1204 kwargs['extra_compile_args'] = ['-D__APPLE_USE_RFC_3542']
Erlend Egeberg Aasland9a45bfe2020-05-17 08:32:46 +02001205
Erlend Egeberg Aaslandccdcb202020-11-18 01:08:58 +01001206 self.add(Extension('_socket', ['socketmodule.c'], **kwargs))
pxinwr32f5fdd2019-02-27 19:09:28 +08001207
Victor Stinner5ec33a12019-03-01 16:43:28 +01001208 def detect_dbm_gdbm(self):
Georg Brandl489cb4f2009-07-11 10:08:49 +00001209 # Modules that provide persistent dictionary-like semantics. You will
1210 # probably want to arrange for at least one of them to be available on
1211 # your machine, though none are defined by default because of library
1212 # dependencies. The Python module dbm/__init__.py provides an
1213 # implementation independent wrapper for these; dbm/dumb.py provides
1214 # similar functionality (but slower of course) implemented in Python.
1215
1216 # Sleepycat^WOracle Berkeley DB interface.
1217 # http://www.oracle.com/database/berkeley-db/db/index.html
1218 #
1219 # This requires the Sleepycat^WOracle DB code. The supported versions
1220 # are set below. Visit the URL above to download
1221 # a release. Most open source OSes come with one or more
1222 # versions of BerkeleyDB already installed.
1223
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +02001224 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001225 min_db_ver = (3, 3)
1226 db_setup_debug = False # verbose debug prints from this script?
1227
1228 def allow_db_ver(db_ver):
1229 """Returns a boolean if the given BerkeleyDB version is acceptable.
1230
1231 Args:
1232 db_ver: A tuple of the version to verify.
1233 """
1234 if not (min_db_ver <= db_ver <= max_db_ver):
1235 return False
1236 return True
1237
1238 def gen_db_minor_ver_nums(major):
1239 if major == 4:
1240 for x in range(max_db_ver[1]+1):
1241 if allow_db_ver((4, x)):
1242 yield x
1243 elif major == 3:
1244 for x in (3,):
1245 if allow_db_ver((3, x)):
1246 yield x
1247 else:
1248 raise ValueError("unknown major BerkeleyDB version", major)
1249
1250 # construct a list of paths to look for the header file in on
1251 # top of the normal inc_dirs.
1252 db_inc_paths = [
1253 '/usr/include/db4',
1254 '/usr/local/include/db4',
1255 '/opt/sfw/include/db4',
1256 '/usr/include/db3',
1257 '/usr/local/include/db3',
1258 '/opt/sfw/include/db3',
1259 # Fink defaults (http://fink.sourceforge.net/)
1260 '/sw/include/db4',
1261 '/sw/include/db3',
1262 ]
1263 # 4.x minor number specific paths
1264 for x in gen_db_minor_ver_nums(4):
1265 db_inc_paths.append('/usr/include/db4%d' % x)
1266 db_inc_paths.append('/usr/include/db4.%d' % x)
1267 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
1268 db_inc_paths.append('/usr/local/include/db4%d' % x)
1269 db_inc_paths.append('/pkg/db-4.%d/include' % x)
1270 db_inc_paths.append('/opt/db-4.%d/include' % x)
1271 # MacPorts default (http://www.macports.org/)
1272 db_inc_paths.append('/opt/local/include/db4%d' % x)
1273 # 3.x minor number specific paths
1274 for x in gen_db_minor_ver_nums(3):
1275 db_inc_paths.append('/usr/include/db3%d' % x)
1276 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
1277 db_inc_paths.append('/usr/local/include/db3%d' % x)
1278 db_inc_paths.append('/pkg/db-3.%d/include' % x)
1279 db_inc_paths.append('/opt/db-3.%d/include' % x)
1280
Victor Stinner4cbea512019-02-28 17:48:38 +01001281 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001282 db_inc_paths = []
1283
Georg Brandl489cb4f2009-07-11 10:08:49 +00001284 # Add some common subdirectories for Sleepycat DB to the list,
1285 # based on the standard include directories. This way DB3/4 gets
1286 # picked up when it is installed in a non-standard prefix and
1287 # the user has added that prefix into inc_dirs.
1288 std_variants = []
Victor Stinner625dbf22019-03-01 15:59:39 +01001289 for dn in self.inc_dirs:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001290 std_variants.append(os.path.join(dn, 'db3'))
1291 std_variants.append(os.path.join(dn, 'db4'))
1292 for x in gen_db_minor_ver_nums(4):
1293 std_variants.append(os.path.join(dn, "db4%d"%x))
1294 std_variants.append(os.path.join(dn, "db4.%d"%x))
1295 for x in gen_db_minor_ver_nums(3):
1296 std_variants.append(os.path.join(dn, "db3%d"%x))
1297 std_variants.append(os.path.join(dn, "db3.%d"%x))
1298
1299 db_inc_paths = std_variants + db_inc_paths
1300 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
1301
1302 db_ver_inc_map = {}
1303
Victor Stinner4cbea512019-02-28 17:48:38 +01001304 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001305 sysroot = macosx_sdk_root()
1306
Georg Brandl489cb4f2009-07-11 10:08:49 +00001307 class db_found(Exception): pass
1308 try:
1309 # See whether there is a Sleepycat header in the standard
1310 # search path.
Victor Stinner625dbf22019-03-01 15:59:39 +01001311 for d in self.inc_dirs + db_inc_paths:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001312 f = os.path.join(d, "db.h")
Victor Stinner4cbea512019-02-28 17:48:38 +01001313 if MACOS and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001314 f = os.path.join(sysroot, d[1:], "db.h")
1315
Georg Brandl489cb4f2009-07-11 10:08:49 +00001316 if db_setup_debug: print("db: looking for db.h in", f)
1317 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +00001318 with open(f, 'rb') as file:
1319 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +00001320 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001321 if m:
1322 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +00001323 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001324 db_minor = int(m.group(1))
1325 db_ver = (db_major, db_minor)
1326
1327 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1328 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +00001329 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001330 db_patch = int(m.group(1))
1331 if db_patch < 21:
1332 print("db.h:", db_ver, "patch", db_patch,
1333 "being ignored (4.6.x must be >= 4.6.21)")
1334 continue
1335
1336 if ( (db_ver not in db_ver_inc_map) and
1337 allow_db_ver(db_ver) ):
1338 # save the include directory with the db.h version
1339 # (first occurrence only)
1340 db_ver_inc_map[db_ver] = d
1341 if db_setup_debug:
1342 print("db.h: found", db_ver, "in", d)
1343 else:
1344 # we already found a header for this library version
1345 if db_setup_debug: print("db.h: ignoring", d)
1346 else:
1347 # ignore this header, it didn't contain a version number
1348 if db_setup_debug:
1349 print("db.h: no version number version in", d)
1350
1351 db_found_vers = list(db_ver_inc_map.keys())
1352 db_found_vers.sort()
1353
1354 while db_found_vers:
1355 db_ver = db_found_vers.pop()
1356 db_incdir = db_ver_inc_map[db_ver]
1357
1358 # check lib directories parallel to the location of the header
1359 db_dirs_to_check = [
1360 db_incdir.replace("include", 'lib64'),
1361 db_incdir.replace("include", 'lib'),
1362 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001363
Victor Stinner4cbea512019-02-28 17:48:38 +01001364 if not MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001365 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
1366
1367 else:
1368 # Same as other branch, but takes OSX SDK into account
1369 tmp = []
1370 for dn in db_dirs_to_check:
1371 if is_macosx_sdk_path(dn):
1372 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1373 tmp.append(dn)
1374 else:
1375 if os.path.isdir(dn):
1376 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001377 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001378
1379 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001380
Ezio Melotti42da6632011-03-15 05:18:48 +02001381 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001382 # XXX should we -ever- look for a dbX name? Do any
1383 # systems really not name their library by version and
1384 # symlink to more general names?
1385 for dblib in (('db-%d.%d' % db_ver),
1386 ('db%d%d' % db_ver),
1387 ('db%d' % db_ver[0])):
1388 dblib_file = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001389 db_dirs_to_check + self.lib_dirs, dblib )
Georg Brandl489cb4f2009-07-11 10:08:49 +00001390 if dblib_file:
1391 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1392 raise db_found
1393 else:
1394 if db_setup_debug: print("db lib: ", dblib, "not found")
1395
1396 except db_found:
1397 if db_setup_debug:
1398 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1399 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
Georg Brandl489cb4f2009-07-11 10:08:49 +00001400 dblibs = [dblib]
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001401 # Only add the found library and include directories if they aren't
1402 # already being searched. This avoids an explicit runtime library
1403 # dependency.
Victor Stinner625dbf22019-03-01 15:59:39 +01001404 if db_incdir in self.inc_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001405 db_incs = None
1406 else:
1407 db_incs = [db_incdir]
Victor Stinner625dbf22019-03-01 15:59:39 +01001408 if dblib_dir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001409 dblib_dir = None
Georg Brandl489cb4f2009-07-11 10:08:49 +00001410 else:
1411 if db_setup_debug: print("db: no appropriate library found")
1412 db_incs = None
1413 dblibs = []
1414 dblib_dir = None
1415
Victor Stinner5ec33a12019-03-01 16:43:28 +01001416 dbm_setup_debug = False # verbose debug prints from this script?
1417 dbm_order = ['gdbm']
1418 # The standard Unix dbm module:
1419 if not CYGWIN:
1420 config_args = [arg.strip("'")
1421 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1422 dbm_args = [arg for arg in config_args
1423 if arg.startswith('--with-dbmliborder=')]
1424 if dbm_args:
1425 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1426 else:
1427 dbm_order = "ndbm:gdbm:bdb".split(":")
1428 dbmext = None
1429 for cand in dbm_order:
1430 if cand == "ndbm":
1431 if find_file("ndbm.h", self.inc_dirs, []) is not None:
1432 # Some systems have -lndbm, others have -lgdbm_compat,
1433 # others don't have either
1434 if self.compiler.find_library_file(self.lib_dirs,
1435 'ndbm'):
1436 ndbm_libs = ['ndbm']
1437 elif self.compiler.find_library_file(self.lib_dirs,
1438 'gdbm_compat'):
1439 ndbm_libs = ['gdbm_compat']
1440 else:
1441 ndbm_libs = []
1442 if dbm_setup_debug: print("building dbm using ndbm")
1443 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1444 define_macros=[
1445 ('HAVE_NDBM_H',None),
1446 ],
1447 libraries=ndbm_libs)
1448 break
1449
1450 elif cand == "gdbm":
1451 if self.compiler.find_library_file(self.lib_dirs, 'gdbm'):
1452 gdbm_libs = ['gdbm']
1453 if self.compiler.find_library_file(self.lib_dirs,
1454 'gdbm_compat'):
1455 gdbm_libs.append('gdbm_compat')
1456 if find_file("gdbm/ndbm.h", self.inc_dirs, []) is not None:
1457 if dbm_setup_debug: print("building dbm using gdbm")
1458 dbmext = Extension(
1459 '_dbm', ['_dbmmodule.c'],
1460 define_macros=[
1461 ('HAVE_GDBM_NDBM_H', None),
1462 ],
1463 libraries = gdbm_libs)
1464 break
1465 if find_file("gdbm-ndbm.h", self.inc_dirs, []) is not None:
1466 if dbm_setup_debug: print("building dbm using gdbm")
1467 dbmext = Extension(
1468 '_dbm', ['_dbmmodule.c'],
1469 define_macros=[
1470 ('HAVE_GDBM_DASH_NDBM_H', None),
1471 ],
1472 libraries = gdbm_libs)
1473 break
1474 elif cand == "bdb":
1475 if dblibs:
1476 if dbm_setup_debug: print("building dbm using bdb")
1477 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1478 library_dirs=dblib_dir,
1479 runtime_library_dirs=dblib_dir,
1480 include_dirs=db_incs,
1481 define_macros=[
1482 ('HAVE_BERKDB_H', None),
1483 ('DB_DBM_HSEARCH', None),
1484 ],
1485 libraries=dblibs)
1486 break
1487 if dbmext is not None:
1488 self.add(dbmext)
1489 else:
1490 self.missing.append('_dbm')
1491
1492 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1493 if ('gdbm' in dbm_order and
1494 self.compiler.find_library_file(self.lib_dirs, 'gdbm')):
1495 self.add(Extension('_gdbm', ['_gdbmmodule.c'],
1496 libraries=['gdbm']))
1497 else:
1498 self.missing.append('_gdbm')
1499
1500 def detect_sqlite(self):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001501 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001502 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001503
1504 # We hunt for #define SQLITE_VERSION "n.n.n"
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001505 sqlite_incdir = sqlite_libdir = None
1506 sqlite_inc_paths = [ '/usr/include',
1507 '/usr/include/sqlite',
1508 '/usr/include/sqlite3',
1509 '/usr/local/include',
1510 '/usr/local/include/sqlite',
1511 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001512 ]
Victor Stinner4cbea512019-02-28 17:48:38 +01001513 if CROSS_COMPILING:
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001514 sqlite_inc_paths = []
Erlend Egeberg Aaslandcf0b2392021-01-06 01:02:43 +01001515 MIN_SQLITE_VERSION_NUMBER = (3, 7, 15) # Issue 40810
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001516 MIN_SQLITE_VERSION = ".".join([str(x)
1517 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001518
1519 # Scan the default include directories before the SQLite specific
1520 # ones. This allows one to override the copy of sqlite on OSX,
1521 # where /usr/include contains an old version of sqlite.
Victor Stinner4cbea512019-02-28 17:48:38 +01001522 if MACOS:
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001523 sysroot = macosx_sdk_root()
1524
Victor Stinner625dbf22019-03-01 15:59:39 +01001525 for d_ in self.inc_dirs + sqlite_inc_paths:
Ned Deily9b635832012-08-05 15:13:33 -07001526 d = d_
Victor Stinner4cbea512019-02-28 17:48:38 +01001527 if MACOS and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001528 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001529
Ned Deily9b635832012-08-05 15:13:33 -07001530 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001531 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001532 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001533 with open(f) as file:
1534 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001535 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001536 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001537 if m:
1538 sqlite_version = m.group(1)
1539 sqlite_version_tuple = tuple([int(x)
1540 for x in sqlite_version.split(".")])
1541 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1542 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001543 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001544 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001545 sqlite_incdir = d
1546 break
1547 else:
1548 if sqlite_setup_debug:
Charles Pigottad0daf52019-04-26 16:38:12 +01001549 print("%s: version %s is too old, need >= %s"%(d,
Guido van Rossum452bf512007-02-09 05:32:43 +00001550 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001551 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001552 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001553
1554 if sqlite_incdir:
1555 sqlite_dirs_to_check = [
1556 os.path.join(sqlite_incdir, '..', 'lib64'),
1557 os.path.join(sqlite_incdir, '..', 'lib'),
1558 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1559 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1560 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001561 sqlite_libfile = self.compiler.find_library_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01001562 sqlite_dirs_to_check + self.lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001563 if sqlite_libfile:
1564 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001565
1566 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001567 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001568 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001569 '_sqlite/cursor.c',
1570 '_sqlite/microprotocols.c',
1571 '_sqlite/module.c',
1572 '_sqlite/prepare_protocol.c',
1573 '_sqlite/row.c',
1574 '_sqlite/statement.c',
1575 '_sqlite/util.c', ]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001576 sqlite_defines = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001577
Benjamin Peterson076ed002010-10-31 17:11:02 +00001578 # Enable support for loadable extensions in the sqlite3 module
1579 # if --enable-loadable-sqlite-extensions configure option is used.
1580 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1581 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001582
Victor Stinner4cbea512019-02-28 17:48:38 +01001583 if MACOS:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001584 # In every directory on the search path search for a dynamic
1585 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001586 # for dynamic libraries on the entire path.
1587 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001588 # before the dynamic library in /usr/lib.
1589 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1590 else:
1591 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001592
Brett Cannonc5011fe2011-06-06 20:09:10 -07001593 include_dirs = ["Modules/_sqlite"]
1594 # Only include the directory where sqlite was found if it does
1595 # not already exist in set include directories, otherwise you
1596 # can end up with a bad search path order.
1597 if sqlite_incdir not in self.compiler.include_dirs:
1598 include_dirs.append(sqlite_incdir)
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001599 # avoid a runtime library path for a system library dir
Victor Stinner625dbf22019-03-01 15:59:39 +01001600 if sqlite_libdir and sqlite_libdir[0] in self.lib_dirs:
doko@ubuntu.coma3818a32014-04-17 17:52:48 +02001601 sqlite_libdir = None
Victor Stinner8058bda2019-03-01 15:31:45 +01001602 self.add(Extension('_sqlite3', sqlite_srcs,
1603 define_macros=sqlite_defines,
1604 include_dirs=include_dirs,
1605 library_dirs=sqlite_libdir,
1606 extra_link_args=sqlite_extra_link_args,
1607 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001608 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001609 self.missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001610
Victor Stinner5ec33a12019-03-01 16:43:28 +01001611 def detect_platform_specific_exts(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001612 # Unix-only modules
Victor Stinner4cbea512019-02-28 17:48:38 +01001613 if not MS_WINDOWS:
pxinwr32f5fdd2019-02-27 19:09:28 +08001614 if not VXWORKS:
1615 # Steen Lumholt's termios module
Victor Stinner8058bda2019-03-01 15:31:45 +01001616 self.add(Extension('termios', ['termios.c']))
pxinwr32f5fdd2019-02-27 19:09:28 +08001617 # Jeremy Hylton's rlimit interface
Victor Stinner8058bda2019-03-01 15:31:45 +01001618 self.add(Extension('resource', ['resource.c']))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001619 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001620 self.missing.extend(['resource', 'termios'])
Christian Heimes29a7df72018-01-26 23:28:46 +01001621
Victor Stinner5ec33a12019-03-01 16:43:28 +01001622 # Platform-specific libraries
1623 if HOST_PLATFORM.startswith(('linux', 'freebsd', 'gnukfreebsd')):
1624 self.add(Extension('ossaudiodev', ['ossaudiodev.c']))
Michael Felt08970cb2019-06-21 15:58:00 +02001625 elif not AIX:
Victor Stinner5ec33a12019-03-01 16:43:28 +01001626 self.missing.append('ossaudiodev')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001627
Victor Stinner5ec33a12019-03-01 16:43:28 +01001628 if MACOS:
Ned Deily951ab582020-05-18 11:31:21 -04001629 self.add(Extension('_scproxy', ['_scproxy.c'],
Victor Stinner5ec33a12019-03-01 16:43:28 +01001630 extra_link_args=[
1631 '-framework', 'SystemConfiguration',
Ned Deily951ab582020-05-18 11:31:21 -04001632 '-framework', 'CoreFoundation']))
Fredrik Lundhade711a2001-01-24 08:00:28 +00001633
Victor Stinner5ec33a12019-03-01 16:43:28 +01001634 def detect_compress_exts(self):
Barry Warsaw259b1e12002-08-13 20:09:26 +00001635 # Andrew Kuchling's zlib module. Note that some versions of zlib
1636 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1637 # http://www.cert.org/advisories/CA-2002-07.html
1638 #
1639 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1640 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1641 # now, we still accept 1.1.3, because we think it's difficult to
1642 # exploit this in Python, and we'd rather make it RedHat's problem
1643 # than our problem <wink>.
1644 #
1645 # You can upgrade zlib to version 1.1.4 yourself by going to
1646 # http://www.gzip.org/zlib/
Victor Stinner625dbf22019-03-01 15:59:39 +01001647 zlib_inc = find_file('zlib.h', [], self.inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001648 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001649 if zlib_inc is not None:
1650 zlib_h = zlib_inc[0] + '/zlib.h'
1651 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001652 version_req = '"1.1.3"'
Victor Stinner4cbea512019-02-28 17:48:38 +01001653 if MACOS and is_macosx_sdk_path(zlib_h):
Ned Deily507c5912013-10-18 21:32:00 -07001654 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Brett Cannon9f5db072010-10-29 20:19:27 +00001655 with open(zlib_h) as fp:
1656 while 1:
1657 line = fp.readline()
1658 if not line:
1659 break
1660 if line.startswith('#define ZLIB_VERSION'):
1661 version = line.split()[2]
1662 break
Guido van Rossume6970912001-04-15 15:16:12 +00001663 if version >= version_req:
Victor Stinner625dbf22019-03-01 15:59:39 +01001664 if (self.compiler.find_library_file(self.lib_dirs, 'z')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001665 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001666 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1667 else:
1668 zlib_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001669 self.add(Extension('zlib', ['zlibmodule.c'],
1670 libraries=['z'],
1671 extra_link_args=zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001672 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001673 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001674 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001675 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001676 self.missing.append('zlib')
Guido van Rossumd8faa362007-04-27 19:54:29 +00001677 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001678 self.missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001679
Christian Heimes1dc54002008-03-24 02:19:29 +00001680 # Helper module for various ascii-encoders. Uses zlib for an optimized
1681 # crc32 if we have it. Otherwise binascii uses its own.
1682 if have_zlib:
1683 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1684 libraries = ['z']
1685 extra_link_args = zlib_extra_link_args
1686 else:
1687 extra_compile_args = []
1688 libraries = []
1689 extra_link_args = []
Victor Stinner8058bda2019-03-01 15:31:45 +01001690 self.add(Extension('binascii', ['binascii.c'],
1691 extra_compile_args=extra_compile_args,
1692 libraries=libraries,
1693 extra_link_args=extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001694
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001695 # Gustavo Niemeyer's bz2 module.
Victor Stinner625dbf22019-03-01 15:59:39 +01001696 if (self.compiler.find_library_file(self.lib_dirs, 'bz2')):
Victor Stinner4cbea512019-02-28 17:48:38 +01001697 if MACOS:
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001698 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1699 else:
1700 bz2_extra_link_args = ()
Victor Stinner8058bda2019-03-01 15:31:45 +01001701 self.add(Extension('_bz2', ['_bz2module.c'],
1702 libraries=['bz2'],
1703 extra_link_args=bz2_extra_link_args))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001704 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001705 self.missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001706
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001707 # LZMA compression support.
Victor Stinner625dbf22019-03-01 15:59:39 +01001708 if self.compiler.find_library_file(self.lib_dirs, 'lzma'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001709 self.add(Extension('_lzma', ['_lzmamodule.c'],
1710 libraries=['lzma']))
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001711 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001712 self.missing.append('_lzma')
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001713
Victor Stinner5ec33a12019-03-01 16:43:28 +01001714 def detect_expat_elementtree(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001715 # Interface to the Expat XML parser
1716 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001717 # Expat was written by James Clark and is now maintained by a group of
1718 # developers on SourceForge; see www.libexpat.org for more information.
1719 # The pyexpat module was written by Paul Prescod after a prototype by
1720 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1721 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001722 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001723 #
1724 # More information on Expat can be found at www.libexpat.org.
1725 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001726 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1727 expat_inc = []
1728 define_macros = []
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001729 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001730 expat_lib = ['expat']
1731 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001732 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001733 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01001734 expat_inc = [os.path.join(self.srcdir, 'Modules', 'expat')]
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001735 define_macros = [
1736 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinner93d0cb52017-08-18 23:43:54 +02001737 # bpo-30947: Python uses best available entropy sources to
1738 # call XML_SetHashSalt(), expat entropy sources are not needed
1739 ('XML_POOR_ENTROPY', '1'),
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001740 ]
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001741 extra_compile_args = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001742 expat_lib = []
1743 expat_sources = ['expat/xmlparse.c',
1744 'expat/xmlrole.c',
1745 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001746 expat_depends = ['expat/ascii.h',
1747 'expat/asciitab.h',
1748 'expat/expat.h',
1749 'expat/expat_config.h',
1750 'expat/expat_external.h',
1751 'expat/internal.h',
1752 'expat/latin1tab.h',
1753 'expat/utf8tab.h',
1754 'expat/xmlrole.h',
1755 'expat/xmltok.h',
1756 'expat/xmltok_impl.h'
1757 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001758
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001759 cc = sysconfig.get_config_var('CC').split()[0]
Victor Stinner6b982c22020-04-01 01:10:07 +02001760 ret = run_command(
Benjamin Peterson95da3102019-06-29 16:00:22 -07001761 '"%s" -Werror -Wno-unreachable-code -E -xc /dev/null >/dev/null 2>&1' % cc)
Victor Stinner6b982c22020-04-01 01:10:07 +02001762 if ret == 0:
Benjamin Peterson95da3102019-06-29 16:00:22 -07001763 extra_compile_args.append('-Wno-unreachable-code')
Stefan Krah9e1e6f52017-08-25 14:07:50 +02001764
Victor Stinner8058bda2019-03-01 15:31:45 +01001765 self.add(Extension('pyexpat',
1766 define_macros=define_macros,
1767 extra_compile_args=extra_compile_args,
1768 include_dirs=expat_inc,
1769 libraries=expat_lib,
1770 sources=['pyexpat.c'] + expat_sources,
1771 depends=expat_depends))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001772
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001773 # Fredrik Lundh's cElementTree module. Note that this also
1774 # uses expat (via the CAPI hook in pyexpat).
1775
Victor Stinner625dbf22019-03-01 15:59:39 +01001776 if os.path.isfile(os.path.join(self.srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001777 define_macros.append(('USE_PYEXPAT_CAPI', None))
Victor Stinner8058bda2019-03-01 15:31:45 +01001778 self.add(Extension('_elementtree',
1779 define_macros=define_macros,
1780 include_dirs=expat_inc,
1781 libraries=expat_lib,
1782 sources=['_elementtree.c'],
1783 depends=['pyexpat.c', *expat_sources,
1784 *expat_depends]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001785 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001786 self.missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001787
Victor Stinner5ec33a12019-03-01 16:43:28 +01001788 def detect_multibytecodecs(self):
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001789 # Hye-Shik Chang's CJKCodecs modules.
Victor Stinner8058bda2019-03-01 15:31:45 +01001790 self.add(Extension('_multibytecodec',
1791 ['cjkcodecs/multibytecodec.c']))
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001792 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Victor Stinner8058bda2019-03-01 15:31:45 +01001793 self.add(Extension('_codecs_%s' % loc,
1794 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001795
Victor Stinner5ec33a12019-03-01 16:43:28 +01001796 def detect_multiprocessing(self):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001797 # Richard Oudkerk's multiprocessing module
Victor Stinner4cbea512019-02-28 17:48:38 +01001798 if MS_WINDOWS:
Victor Stinnerc991f242019-03-01 17:19:04 +01001799 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c',
1800 '_multiprocessing/semaphore.c']
Benjamin Petersone711caf2008-06-11 16:44:04 +00001801 else:
Victor Stinnerc991f242019-03-01 17:19:04 +01001802 multiprocessing_srcs = ['_multiprocessing/multiprocessing.c']
Mark Dickinsona614f042009-11-28 12:48:43 +00001803 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1804 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001805 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
Victor Stinner8058bda2019-03-01 15:31:45 +01001806 self.add(Extension('_multiprocessing', multiprocessing_srcs,
Victor Stinner8058bda2019-03-01 15:31:45 +01001807 include_dirs=["Modules/_multiprocessing"]))
Guido van Rossuma9e20242007-03-08 00:43:48 +00001808
Victor Stinnercad80202021-01-19 23:04:49 +01001809 if (not MS_WINDOWS and
1810 sysconfig.get_config_var('HAVE_SHM_OPEN') and
1811 sysconfig.get_config_var('HAVE_SHM_UNLINK')):
1812 posixshmem_srcs = ['_multiprocessing/posixshmem.c']
1813 libs = []
1814 if sysconfig.get_config_var('SHM_NEEDS_LIBRT'):
1815 # need to link with librt to get shm_open()
1816 libs.append('rt')
1817 self.add(Extension('_posixshmem', posixshmem_srcs,
1818 define_macros={},
1819 libraries=libs,
1820 include_dirs=["Modules/_multiprocessing"]))
1821 else:
1822 self.missing.append('_posixshmem')
1823
Victor Stinner5ec33a12019-03-01 16:43:28 +01001824 def detect_uuid(self):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001825 # Build the _uuid module if possible
Victor Stinner625dbf22019-03-01 15:59:39 +01001826 uuid_incs = find_file("uuid.h", self.inc_dirs, ["/usr/include/uuid"])
Nick Coghlan53efbf32017-11-26 13:04:46 +10001827 if uuid_incs is not None:
Victor Stinner625dbf22019-03-01 15:59:39 +01001828 if self.compiler.find_library_file(self.lib_dirs, 'uuid'):
Antoine Pitroua106aec2017-09-28 23:03:06 +02001829 uuid_libs = ['uuid']
1830 else:
1831 uuid_libs = []
Victor Stinnercfe172d2019-03-01 18:21:49 +01001832 self.add(Extension('_uuid', ['_uuidmodule.c'],
1833 libraries=uuid_libs,
1834 include_dirs=uuid_incs))
Antoine Pitroua106aec2017-09-28 23:03:06 +02001835 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01001836 self.missing.append('_uuid')
Antoine Pitroua106aec2017-09-28 23:03:06 +02001837
Victor Stinner5ec33a12019-03-01 16:43:28 +01001838 def detect_modules(self):
Victor Stinnercfe172d2019-03-01 18:21:49 +01001839 self.configure_compiler()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001840 self.init_inc_lib_dirs()
1841
1842 self.detect_simple_extensions()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001843 if TEST_EXTENSIONS:
1844 self.detect_test_extensions()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001845 self.detect_readline_curses()
1846 self.detect_crypt()
1847 self.detect_socket()
1848 self.detect_openssl_hashlib()
xdegaye2ee077f2019-04-09 17:20:08 +02001849 self.detect_hash_builtins()
Victor Stinner5ec33a12019-03-01 16:43:28 +01001850 self.detect_dbm_gdbm()
1851 self.detect_sqlite()
1852 self.detect_platform_specific_exts()
1853 self.detect_nis()
1854 self.detect_compress_exts()
1855 self.detect_expat_elementtree()
1856 self.detect_multibytecodecs()
1857 self.detect_decimal()
1858 self.detect_ctypes()
1859 self.detect_multiprocessing()
1860 if not self.detect_tkinter():
1861 self.missing.append('_tkinter')
1862 self.detect_uuid()
1863
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001864## # Uncomment these lines if you want to play with xxmodule.c
Victor Stinnercfe172d2019-03-01 18:21:49 +01001865## self.add(Extension('xx', ['xxmodule.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001866
Hai Shi5787ba42021-04-06 20:55:13 +08001867 # The limited C API is not compatible with the Py_TRACE_REFS macro.
1868 if not sysconfig.get_config_var('Py_TRACE_REFS'):
1869 self.add(Extension('xxlimited', ['xxlimited.c']))
1870 self.add(Extension('xxlimited_35', ['xxlimited_35.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001871
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001872 def detect_tkinter_fromenv(self):
1873 # Build _tkinter using the Tcl/Tk locations specified by
1874 # the _TCLTK_INCLUDES and _TCLTK_LIBS environment variables.
1875 # This method is meant to be invoked by detect_tkinter().
Ned Deilyd819b932013-09-06 01:07:05 -07001876 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001877 # The variables can be set via one of the following ways.
Ned Deilyd819b932013-09-06 01:07:05 -07001878 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001879 # - Automatically, at configuration time, by using pkg-config.
1880 # The tool is called by the configure script.
1881 # Additional pkg-config configuration paths can be set via the
1882 # PKG_CONFIG_PATH environment variable.
1883 #
1884 # PKG_CONFIG_PATH=".../lib/pkgconfig" ./configure ...
1885 #
1886 # - Explicitly, at configuration time by setting both
1887 # --with-tcltk-includes and --with-tcltk-libs.
1888 #
1889 # ./configure ... \
Ned Deilyd819b932013-09-06 01:07:05 -07001890 # --with-tcltk-includes="-I/path/to/tclincludes \
1891 # -I/path/to/tkincludes"
1892 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1893 # -L/path/to/tklibs -ltkm.n"
1894 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001895 # - Explicitly, at compile time, by passing TCLTK_INCLUDES and
1896 # TCLTK_LIBS to the make target.
1897 # This will override any configuration-time option.
1898 #
1899 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
Ned Deilyd819b932013-09-06 01:07:05 -07001900 #
1901 # This can be useful for building and testing tkinter with multiple
1902 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1903 # build of Tcl so you need to specify both arguments and use care when
1904 # overriding.
1905
1906 # The _TCLTK variables are created in the Makefile sharedmods target.
1907 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1908 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1909 if not (tcltk_includes and tcltk_libs):
1910 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001911 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001912
1913 extra_compile_args = tcltk_includes.split()
1914 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001915 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1916 define_macros=[('WITH_APPINIT', 1)],
1917 extra_compile_args = extra_compile_args,
1918 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001919 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001920
Victor Stinner625dbf22019-03-01 15:59:39 +01001921 def detect_tkinter_darwin(self):
Ned Deily1731d6d2020-05-18 04:32:38 -04001922 # Build default _tkinter on macOS using Tcl and Tk frameworks.
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001923 # This method is meant to be invoked by detect_tkinter().
Ned Deily1731d6d2020-05-18 04:32:38 -04001924 #
1925 # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly
1926 # built and installed as macOS framework bundles. However,
1927 # for several reasons, we cannot take full advantage of the
1928 # Apple-supplied compiler chain's -framework options here.
1929 # Instead, we need to find and pass to the compiler the
1930 # absolute paths of the Tcl and Tk headers files we want to use
1931 # and the absolute path to the directory containing the Tcl
1932 # and Tk frameworks for linking.
1933 #
1934 # We want to handle here two common use cases on macOS:
1935 # 1. Build and link with system-wide third-party or user-built
1936 # Tcl and Tk frameworks installed in /Library/Frameworks.
1937 # 2. Build and link using a user-specified macOS SDK so that the
1938 # built Python can be exported to other systems. In this case,
1939 # search only the SDK's /Library/Frameworks (normally empty)
1940 # and /System/Library/Frameworks.
1941 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001942 # Any other use cases are handled either by detect_tkinter_fromenv(),
1943 # or detect_tkinter(). The former handles non-standard locations of
1944 # Tcl/Tk, defined via the _TCLTK_INCLUDES and _TCLTK_LIBS environment
1945 # variables. The latter handles any Tcl/Tk versions installed in
1946 # standard Unix directories.
1947 #
1948 # It would be desirable to also handle here the case where
Ned Deily1731d6d2020-05-18 04:32:38 -04001949 # you want to build and link with a framework build of Tcl and Tk
1950 # that is not in /Library/Frameworks, say, in your private
1951 # $HOME/Library/Frameworks directory or elsewhere. It turns
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301952 # out to be difficult to make that work automatically here
Ned Deily1731d6d2020-05-18 04:32:38 -04001953 # without bringing into play more tools and magic. That case
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301954 # can be handled using a recipe with the right arguments
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001955 # to detect_tkinter_fromenv().
Ned Deily1731d6d2020-05-18 04:32:38 -04001956 #
1957 # Note also that the fallback case here is to try to use the
1958 # Apple-supplied Tcl and Tk frameworks in /System/Library but
1959 # be forewarned that they are deprecated by Apple and typically
1960 # out-of-date and buggy; their use should be avoided if at
1961 # all possible by installing a newer version of Tcl and Tk in
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301962 # /Library/Frameworks before building Python without
Ned Deily1731d6d2020-05-18 04:32:38 -04001963 # an explicit SDK or by configuring build arguments explicitly.
1964
Jack Jansen0b06be72002-06-21 14:48:38 +00001965 from os.path import join, exists
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001966
Ned Deily1731d6d2020-05-18 04:32:38 -04001967 sysroot = macosx_sdk_root() # path to the SDK or '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001968
Ned Deily1731d6d2020-05-18 04:32:38 -04001969 if macosx_sdk_specified():
1970 # Use case #2: an SDK other than '/' was specified.
1971 # Only search there.
1972 framework_dirs = [
1973 join(sysroot, 'Library', 'Frameworks'),
1974 join(sysroot, 'System', 'Library', 'Frameworks'),
1975 ]
1976 else:
1977 # Use case #1: no explicit SDK selected.
1978 # Search the local system-wide /Library/Frameworks,
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301979 # not the one in the default SDK, otherwise fall back to
Ned Deily1731d6d2020-05-18 04:32:38 -04001980 # /System/Library/Frameworks whose header files may be in
1981 # the default SDK or, on older systems, actually installed.
1982 framework_dirs = [
1983 join('/', 'Library', 'Frameworks'),
1984 join(sysroot, 'System', 'Library', 'Frameworks'),
1985 ]
1986
1987 # Find the directory that contains the Tcl.framework and
1988 # Tk.framework bundles.
Jack Jansen0b06be72002-06-21 14:48:38 +00001989 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001990 # both Tcl.framework and Tk.framework should be present
Jack Jansen0b06be72002-06-21 14:48:38 +00001991 for fw in 'Tcl', 'Tk':
Ned Deily1731d6d2020-05-18 04:32:38 -04001992 if not exists(join(F, fw + '.framework')):
1993 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001994 else:
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301995 # ok, F is now directory with both frameworks. Continue
Jack Jansen0b06be72002-06-21 14:48:38 +00001996 # building
1997 break
1998 else:
1999 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
2000 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01002001 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00002002
Jack Jansen0b06be72002-06-21 14:48:38 +00002003 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00002004 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002005 for fw in ('Tcl', 'Tk')
Ned Deily1731d6d2020-05-18 04:32:38 -04002006 for H in ('Headers',)
Jack Jansen0b06be72002-06-21 14:48:38 +00002007 ]
2008
Ned Deily1731d6d2020-05-18 04:32:38 -04002009 # Add the base framework directory as well
2010 compile_args = ['-F', F]
Jack Jansen0b06be72002-06-21 14:48:38 +00002011
Ned Deily1731d6d2020-05-18 04:32:38 -04002012 # Do not build tkinter for archs that this Tk was not built with.
Georg Brandlfcaf9102008-07-16 02:17:56 +00002013 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04002014 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00002015
Ronald Oussorend097efe2009-09-15 19:07:58 +00002016 tmpfile = os.path.join(self.build_temp, 'tk.arch')
2017 if not os.path.exists(self.build_temp):
2018 os.makedirs(self.build_temp)
2019
Ned Deily1731d6d2020-05-18 04:32:38 -04002020 run_command(
2021 "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile)
2022 )
Brett Cannon9f5db072010-10-29 20:19:27 +00002023 with open(tmpfile) as fp:
2024 detected_archs = []
2025 for ln in fp:
2026 a = ln.split()[-1]
2027 if a in archs:
2028 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00002029 os.unlink(tmpfile)
2030
Ned Deily1731d6d2020-05-18 04:32:38 -04002031 arch_args = []
Ronald Oussorend097efe2009-09-15 19:07:58 +00002032 for a in detected_archs:
Ned Deily1731d6d2020-05-18 04:32:38 -04002033 arch_args.append('-arch')
2034 arch_args.append(a)
2035
2036 compile_args += arch_args
2037 link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk']), *arch_args]
2038
2039 # The X11/xlib.h file bundled in the Tk sources can cause function
2040 # prototype warnings from the compiler. Since we cannot easily fix
2041 # that, suppress the warnings here instead.
2042 if '-Wstrict-prototypes' in cflags.split():
2043 compile_args.append('-Wno-strict-prototypes')
Georg Brandlfcaf9102008-07-16 02:17:56 +00002044
Victor Stinnercfe172d2019-03-01 18:21:49 +01002045 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
2046 define_macros=[('WITH_APPINIT', 1)],
2047 include_dirs=include_dirs,
2048 libraries=[],
Ned Deily1731d6d2020-05-18 04:32:38 -04002049 extra_compile_args=compile_args,
2050 extra_link_args=link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01002051 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00002052
Victor Stinner625dbf22019-03-01 15:59:39 +01002053 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002054 # The _tkinter module.
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01002055 #
2056 # Detection of Tcl/Tk is attempted in the following order:
2057 # - Through environment variables.
2058 # - Platform specific detection of Tcl/Tk (currently only macOS).
2059 # - Search of various standard Unix header/library paths.
2060 #
2061 # Detection stops at the first successful method.
Michael W. Hudson5b109102002-01-23 15:04:41 +00002062
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01002063 # Check for Tcl and Tk at the locations indicated by _TCLTK_INCLUDES
2064 # and _TCLTK_LIBS environment variables.
2065 if self.detect_tkinter_fromenv():
Victor Stinner5ec33a12019-03-01 16:43:28 +01002066 return True
Ned Deilyd819b932013-09-06 01:07:05 -07002067
Jack Jansen0b06be72002-06-21 14:48:38 +00002068 # Rather than complicate the code below, detecting and building
2069 # AquaTk is a separate method. Only one Tkinter will be built on
2070 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01002071 if (MACOS and self.detect_tkinter_darwin()):
2072 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00002073
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002074 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002075 # The versions with dots are used on Unix, and the versions without
2076 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002077 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00002078 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
2079 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01002080 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002081 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01002082 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002083 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00002084 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002085 # Exit the loop when we've found the Tcl/Tk libraries
2086 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002087
Fredrik Lundhade711a2001-01-24 08:00:28 +00002088 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002089 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002090 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002091 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002092 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01002093 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002094 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
2095 # but the include subdirs are named like .../include/tcl8.3.
2096 dotversion = dotversion[:-1] + '.' + dotversion[-1]
2097 tcl_include_sub = []
2098 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01002099 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002100 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
2101 tk_include_sub += [dir + os.sep + "tk" + dotversion]
2102 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01002103 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
2104 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002105
Martin v. Löwise86a59a2003-05-03 08:45:51 +00002106 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002107 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002108 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01002109 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00002110
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002111 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002112
Victor Stinnercfe172d2019-03-01 18:21:49 +01002113 include_dirs = []
2114 libs = []
2115 defs = []
2116 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002117 for dir in tcl_includes + tk_includes:
2118 if dir not in include_dirs:
2119 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002120
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002121 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01002122 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002123 include_dirs.append('/usr/openwin/include')
2124 added_lib_dirs.append('/usr/openwin/lib')
2125 elif os.path.exists('/usr/X11R6/include'):
2126 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00002127 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002128 added_lib_dirs.append('/usr/X11R6/lib')
2129 elif os.path.exists('/usr/X11R5/include'):
2130 include_dirs.append('/usr/X11R5/include')
2131 added_lib_dirs.append('/usr/X11R5/lib')
2132 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002133 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002134 include_dirs.append('/usr/X11/include')
2135 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002136
Jason Tishler9181c942003-02-05 15:16:17 +00002137 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01002138 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00002139 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
2140 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01002141 return False
Jason Tishler9181c942003-02-05 15:16:17 +00002142
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002143 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01002144 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002145 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002146 defs.append( ('WITH_BLT', 1) )
2147 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01002148 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002149 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00002150 defs.append( ('WITH_BLT', 1) )
2151 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002152
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002153 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00002154 libs.append('tk'+ version)
2155 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002156
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002157 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01002158 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002159 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002160
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002161 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002162 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002163 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002164 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002165 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002166 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002167 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002168
Victor Stinnercfe172d2019-03-01 18:21:49 +01002169 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
2170 define_macros=[('WITH_APPINIT', 1)] + defs,
2171 include_dirs=include_dirs,
2172 libraries=libs,
2173 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002174 return True
2175
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002176 def configure_ctypes(self, ext):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002177 return True
2178
Victor Stinner625dbf22019-03-01 15:59:39 +01002179 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002180 # Thomas Heller's _ctypes module
Ronald Oussoren41761932020-11-08 10:05:27 +01002181
2182 if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS):
2183 self.use_system_libffi = True
2184 else:
2185 self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
2186
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002187 include_dirs = []
Victor Stinner1ae035b2020-04-17 17:47:20 +02002188 extra_compile_args = ['-DPy_BUILD_CORE_MODULE']
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002189 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002190 sources = ['_ctypes/_ctypes.c',
2191 '_ctypes/callbacks.c',
2192 '_ctypes/callproc.c',
2193 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00002194 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002195 depends = ['_ctypes/ctypes.h']
2196
Victor Stinner4cbea512019-02-28 17:48:38 +01002197 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00002198 sources.append('_ctypes/malloc_closure.c')
Ronald Oussoren41761932020-11-08 10:05:27 +01002199 extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1')
Christian Heimes78644762008-03-04 23:39:23 +00002200 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002201 include_dirs.append('_ctypes/darwin')
Thomas Hellercf567c12006-03-08 19:51:58 +00002202
Victor Stinner4cbea512019-02-28 17:48:38 +01002203 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002204 # XXX This shouldn't be necessary; it appears that some
2205 # of the assembler code is non-PIC (i.e. it has relocations
2206 # when it shouldn't. The proper fix would be to rewrite
2207 # the assembler code to be PIC.
2208 # This only works with GCC; the Sun compiler likely refuses
2209 # this option. If you want to compile ctypes with the Sun
2210 # compiler, please research a proper solution, instead of
2211 # finding some -z option for the Sun compiler.
2212 extra_link_args.append('-mimpure-text')
2213
Victor Stinner4cbea512019-02-28 17:48:38 +01002214 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00002215 extra_link_args.append('-fPIC')
2216
Thomas Hellercf567c12006-03-08 19:51:58 +00002217 ext = Extension('_ctypes',
2218 include_dirs=include_dirs,
2219 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002220 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002221 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002222 sources=sources,
2223 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01002224 self.add(ext)
2225 if TEST_EXTENSIONS:
2226 # function my_sqrt() needs libm for sqrt()
2227 self.add(Extension('_ctypes_test',
2228 sources=['_ctypes/_ctypes_test.c'],
2229 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00002230
Ronald Oussoren41761932020-11-08 10:05:27 +01002231 ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
2232 ffi_lib = None
2233
Victor Stinner625dbf22019-03-01 15:59:39 +01002234 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01002235 if MACOS:
Ronald Oussoren41761932020-11-08 10:05:27 +01002236 ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi")
Christian Heimes78644762008-03-04 23:39:23 +00002237
Ronald Oussoren41761932020-11-08 10:05:27 +01002238 if not ffi_inc:
2239 if os.path.exists(ffi_in_sdk):
2240 ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1")
2241 ffi_inc = ffi_in_sdk
2242 ffi_lib = 'ffi'
2243 else:
2244 # OS X 10.5 comes with libffi.dylib; the include files are
2245 # in /usr/include/ffi
2246 ffi_inc_dirs.append('/usr/include/ffi')
2247
2248 if not ffi_inc:
2249 found = find_file('ffi.h', [], ffi_inc_dirs)
2250 if found:
2251 ffi_inc = found[0]
2252 if ffi_inc:
2253 ffi_h = ffi_inc + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002254 if not os.path.exists(ffi_h):
2255 ffi_inc = None
2256 print('Header file {} does not exist'.format(ffi_h))
Ronald Oussoren41761932020-11-08 10:05:27 +01002257 if ffi_lib is None and ffi_inc:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002258 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002259 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002260 ffi_lib = lib_name
2261 break
2262
2263 if ffi_inc and ffi_lib:
Ronald Oussoren41761932020-11-08 10:05:27 +01002264 ffi_headers = glob(os.path.join(ffi_inc, '*.h'))
2265 if grep_headers_for('ffi_prep_cif_var', ffi_headers):
2266 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1")
2267 if grep_headers_for('ffi_prep_closure_loc', ffi_headers):
2268 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1")
2269 if grep_headers_for('ffi_closure_alloc', ffi_headers):
2270 ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1")
2271
2272 ext.include_dirs.append(ffi_inc)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002273 ext.libraries.append(ffi_lib)
2274 self.use_system_libffi = True
2275
Christian Heimes5bb96922018-02-25 10:22:14 +01002276 if sysconfig.get_config_var('HAVE_LIBDL'):
2277 # for dlopen, see bpo-32647
2278 ext.libraries.append('dl')
2279
Victor Stinner5ec33a12019-03-01 16:43:28 +01002280 def detect_decimal(self):
2281 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002282 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002283 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002284 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2285 include_dirs = []
Antoine Pitrou73b20ae2021-03-30 18:11:06 +02002286 libraries = ['mpdec']
Stefan Krah60187b52012-03-23 19:06:27 +01002287 sources = ['_decimal/_decimal.c']
2288 depends = ['_decimal/docstrings.h']
2289 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002290 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002291 'Modules',
2292 '_decimal',
2293 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002294 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002295 sources = [
2296 '_decimal/_decimal.c',
2297 '_decimal/libmpdec/basearith.c',
2298 '_decimal/libmpdec/constants.c',
2299 '_decimal/libmpdec/context.c',
2300 '_decimal/libmpdec/convolute.c',
2301 '_decimal/libmpdec/crt.c',
2302 '_decimal/libmpdec/difradix2.c',
2303 '_decimal/libmpdec/fnt.c',
2304 '_decimal/libmpdec/fourstep.c',
2305 '_decimal/libmpdec/io.c',
Stefan Krahf117d872019-07-10 18:27:38 +02002306 '_decimal/libmpdec/mpalloc.c',
Stefan Krah60187b52012-03-23 19:06:27 +01002307 '_decimal/libmpdec/mpdecimal.c',
2308 '_decimal/libmpdec/numbertheory.c',
2309 '_decimal/libmpdec/sixstep.c',
2310 '_decimal/libmpdec/transpose.c',
2311 ]
2312 depends = [
2313 '_decimal/docstrings.h',
2314 '_decimal/libmpdec/basearith.h',
2315 '_decimal/libmpdec/bits.h',
2316 '_decimal/libmpdec/constants.h',
2317 '_decimal/libmpdec/convolute.h',
2318 '_decimal/libmpdec/crt.h',
2319 '_decimal/libmpdec/difradix2.h',
2320 '_decimal/libmpdec/fnt.h',
2321 '_decimal/libmpdec/fourstep.h',
2322 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002323 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002324 '_decimal/libmpdec/mpdecimal.h',
2325 '_decimal/libmpdec/numbertheory.h',
2326 '_decimal/libmpdec/sixstep.h',
2327 '_decimal/libmpdec/transpose.h',
2328 '_decimal/libmpdec/typearith.h',
2329 '_decimal/libmpdec/umodarith.h',
2330 ]
2331
Stefan Krah1919b7e2012-03-21 18:25:23 +01002332 config = {
2333 'x64': [('CONFIG_64','1'), ('ASM','1')],
2334 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2335 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2336 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2337 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2338 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2339 ('LEGACY_COMPILER','1')],
2340 'universal': [('UNIVERSAL','1')]
2341 }
2342
Stefan Krah1919b7e2012-03-21 18:25:23 +01002343 cc = sysconfig.get_config_var('CC')
2344 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2345 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2346
2347 if machine:
2348 # Override automatic configuration to facilitate testing.
2349 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002350 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002351 # Universal here means: build with the same options Python
2352 # was built with.
2353 define_macros = config['universal']
2354 elif sizeof_size_t == 8:
2355 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2356 define_macros = config['x64']
2357 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2358 define_macros = config['uint128']
2359 else:
2360 define_macros = config['ansi64']
2361 elif sizeof_size_t == 4:
2362 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2363 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002364 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002365 # solaris: problems with register allocation.
2366 # icc >= 11.0 works as well.
2367 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002368 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002369 else:
2370 define_macros = config['ansi32']
2371 else:
2372 raise DistutilsError("_decimal: unsupported architecture")
2373
2374 # Workarounds for toolchain bugs:
2375 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2376 # Some versions of gcc miscompile inline asm:
2377 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2378 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2379 extra_compile_args.append('-fno-ipa-pure-const')
2380 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2381 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2382 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2383 undef_macros.append('_FORTIFY_SOURCE')
2384
Stefan Krah1919b7e2012-03-21 18:25:23 +01002385 # Uncomment for extra functionality:
2386 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002387 self.add(Extension('_decimal',
2388 include_dirs=include_dirs,
2389 libraries=libraries,
2390 define_macros=define_macros,
2391 undef_macros=undef_macros,
2392 extra_compile_args=extra_compile_args,
2393 sources=sources,
2394 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002395
Victor Stinner5ec33a12019-03-01 16:43:28 +01002396 def detect_openssl_hashlib(self):
2397 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002398 config_vars = sysconfig.get_config_vars()
2399
2400 def split_var(name, sep):
2401 # poor man's shlex, the re module is not available yet.
2402 value = config_vars.get(name)
2403 if not value:
2404 return ()
2405 # This trick works because ax_check_openssl uses --libs-only-L,
2406 # --libs-only-l, and --cflags-only-I.
2407 value = ' ' + value
2408 sep = ' ' + sep
2409 return [v.strip() for v in value.split(sep) if v.strip()]
2410
2411 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2412 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2413 openssl_libs = split_var('OPENSSL_LIBS', '-l')
Christian Heimes32eba612021-03-19 10:29:25 +01002414 openssl_rpath = config_vars.get('OPENSSL_RPATH')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002415 if not openssl_libs:
2416 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002417 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002418 return None, None
2419
2420 # Find OpenSSL includes
2421 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002422 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002423 )
2424 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002425 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002426 return None, None
2427
2428 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2429 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002430 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002431 ['/usr/kerberos/include']
2432 )
2433 if krb5_h:
2434 ssl_incs.extend(krb5_h)
2435
Christian Heimes32eba612021-03-19 10:29:25 +01002436 if openssl_rpath == 'auto':
2437 runtime_library_dirs = openssl_libdirs[:]
2438 elif not openssl_rpath:
2439 runtime_library_dirs = []
2440 else:
2441 runtime_library_dirs = [openssl_rpath]
2442
Christian Heimesbacefbf2021-03-27 18:03:54 +01002443 openssl_extension_kwargs = dict(
2444 include_dirs=openssl_includes,
2445 library_dirs=openssl_libdirs,
2446 libraries=openssl_libs,
2447 runtime_library_dirs=runtime_library_dirs,
2448 )
2449
2450 # This static linking is NOT OFFICIALLY SUPPORTED.
2451 # Requires static OpenSSL build with position-independent code. Some
2452 # features like DSO engines or external OSSL providers don't work.
2453 # Only tested on GCC and clang on X86_64.
2454 if os.environ.get("PY_UNSUPPORTED_OPENSSL_BUILD") == "static":
2455 extra_linker_args = []
2456 for lib in openssl_extension_kwargs["libraries"]:
2457 # link statically
2458 extra_linker_args.append(f"-l:lib{lib}.a")
2459 # don't export symbols
2460 extra_linker_args.append(f"-Wl,--exclude-libs,lib{lib}.a")
2461 openssl_extension_kwargs["extra_link_args"] = extra_linker_args
2462 # don't link OpenSSL shared libraries.
2463 openssl_extension_kwargs["libraries"] = []
2464
Christian Heimes61d478c2018-01-27 15:51:38 +01002465 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Christian Heimesbacefbf2021-03-27 18:03:54 +01002466 self.add(
2467 Extension(
2468 '_ssl',
2469 ['_ssl.c'],
2470 depends=['socketmodule.h', '_ssl/debughelpers.c'],
2471 **openssl_extension_kwargs
2472 )
Christian Heimesc7f70692019-05-31 11:44:05 +02002473 )
Christian Heimes61d478c2018-01-27 15:51:38 +01002474 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002475 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002476
Christian Heimesbacefbf2021-03-27 18:03:54 +01002477 self.add(
2478 Extension(
2479 '_hashlib',
2480 ['_hashopenssl.c'],
2481 depends=['hashlib.h'],
2482 **openssl_extension_kwargs,
2483 )
2484 )
Christian Heimesff5be6e2018-01-20 13:19:21 +01002485
xdegaye2ee077f2019-04-09 17:20:08 +02002486 def detect_hash_builtins(self):
Christian Heimes9b60e552020-05-15 23:54:53 +02002487 # By default we always compile these even when OpenSSL is available
2488 # (issue #14693). It's harmless and the object code is tiny
2489 # (40-50 KiB per module, only loaded when actually used). Modules can
2490 # be disabled via the --with-builtin-hashlib-hashes configure flag.
2491 supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"}
Victor Stinner5ec33a12019-03-01 16:43:28 +01002492
Christian Heimes9b60e552020-05-15 23:54:53 +02002493 configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES")
2494 configured = configured.strip('"').lower()
2495 configured = {
2496 m.strip() for m in configured.split(",")
2497 }
Victor Stinner5ec33a12019-03-01 16:43:28 +01002498
Christian Heimes9b60e552020-05-15 23:54:53 +02002499 self.disabled_configure.extend(
2500 sorted(supported.difference(configured))
2501 )
Victor Stinner5ec33a12019-03-01 16:43:28 +01002502
Christian Heimes9b60e552020-05-15 23:54:53 +02002503 if "sha256" in configured:
2504 self.add(Extension(
2505 '_sha256', ['sha256module.c'],
2506 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2507 depends=['hashlib.h']
2508 ))
2509
2510 if "sha512" in configured:
2511 self.add(Extension(
2512 '_sha512', ['sha512module.c'],
2513 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2514 depends=['hashlib.h']
2515 ))
2516
2517 if "md5" in configured:
2518 self.add(Extension(
2519 '_md5', ['md5module.c'],
2520 depends=['hashlib.h']
2521 ))
2522
2523 if "sha1" in configured:
2524 self.add(Extension(
2525 '_sha1', ['sha1module.c'],
2526 depends=['hashlib.h']
2527 ))
2528
2529 if "blake2" in configured:
2530 blake2_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002531 os.path.join(escape(self.srcdir), 'Modules/_blake2/impl/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002532 )
2533 blake2_deps.append('hashlib.h')
2534 self.add(Extension(
2535 '_blake2',
2536 [
2537 '_blake2/blake2module.c',
2538 '_blake2/blake2b_impl.c',
2539 '_blake2/blake2s_impl.c'
2540 ],
2541 depends=blake2_deps
2542 ))
2543
2544 if "sha3" in configured:
2545 sha3_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002546 os.path.join(escape(self.srcdir), 'Modules/_sha3/kcp/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002547 )
2548 sha3_deps.append('hashlib.h')
2549 self.add(Extension(
2550 '_sha3',
2551 ['_sha3/sha3module.c'],
2552 depends=sha3_deps
2553 ))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002554
2555 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002556 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002557 self.missing.append('nis')
2558 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002559
2560 libs = []
2561 library_dirs = []
2562 includes_dirs = []
2563
2564 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2565 # moved headers and libraries to libtirpc and libnsl. The headers
2566 # are in tircp and nsl sub directories.
2567 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002568 'rpcsvc/yp_prot.h', self.inc_dirs,
2569 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002570 )
2571 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002572 'rpc/rpc.h', self.inc_dirs,
2573 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002574 )
2575 if rpcsvc_inc is None or rpc_inc is None:
2576 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002577 self.missing.append('nis')
2578 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002579 includes_dirs.extend(rpcsvc_inc)
2580 includes_dirs.extend(rpc_inc)
2581
Victor Stinner625dbf22019-03-01 15:59:39 +01002582 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002583 libs.append('nsl')
2584 else:
2585 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002586 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002587 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2588 if libnsl is not None:
2589 library_dirs.append(os.path.dirname(libnsl))
2590 libs.append('nsl')
2591
Victor Stinner625dbf22019-03-01 15:59:39 +01002592 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002593 libs.append('tirpc')
2594
Victor Stinner8058bda2019-03-01 15:31:45 +01002595 self.add(Extension('nis', ['nismodule.c'],
2596 libraries=libs,
2597 library_dirs=library_dirs,
2598 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002599
Christian Heimesff5be6e2018-01-20 13:19:21 +01002600
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002601class PyBuildInstall(install):
2602 # Suppress the warning about installation into the lib_dynload
2603 # directory, which is not in sys.path when running Python during
2604 # installation:
2605 def initialize_options (self):
2606 install.initialize_options(self)
2607 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002608
Éric Araujoe6792c12011-06-09 14:07:02 +02002609 # Customize subcommands to not install an egg-info file for Python
2610 sub_commands = [('install_lib', install.has_lib),
2611 ('install_headers', install.has_headers),
2612 ('install_scripts', install.has_scripts),
2613 ('install_data', install.has_data)]
2614
2615
Michael W. Hudson529a5052002-12-17 16:47:17 +00002616class PyBuildInstallLib(install_lib):
2617 # Do exactly what install_lib does but make sure correct access modes get
2618 # set on installed directories and files. All installed files with get
2619 # mode 644 unless they are a shared library in which case they will get
2620 # mode 755. All installed directories will get mode 755.
2621
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002622 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2623 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002624
2625 def install(self):
2626 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002627 self.set_file_modes(outfiles, 0o644, 0o755)
2628 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002629 return outfiles
2630
2631 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002632 if not files: return
2633
2634 for filename in files:
2635 if os.path.islink(filename): continue
2636 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002637 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002638 log.info("changing mode of %s to %o", filename, mode)
2639 if not self.dry_run: os.chmod(filename, mode)
2640
2641 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002642 for dirpath, dirnames, fnames in os.walk(dirname):
2643 if os.path.islink(dirpath):
2644 continue
2645 log.info("changing mode of %s to %o", dirpath, mode)
2646 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002647
Victor Stinnerc991f242019-03-01 17:19:04 +01002648
Georg Brandlff52f762010-12-28 09:51:43 +00002649class PyBuildScripts(build_scripts):
2650 def copy_scripts(self):
2651 outfiles, updated_files = build_scripts.copy_scripts(self)
2652 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2653 minoronly = '.{0[1]}'.format(sys.version_info)
2654 newoutfiles = []
2655 newupdated_files = []
2656 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002657 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002658 newfilename = filename + fullversion
2659 else:
2660 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002661 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002662 os.rename(filename, newfilename)
2663 newoutfiles.append(newfilename)
2664 if filename in updated_files:
2665 newupdated_files.append(newfilename)
2666 return newoutfiles, newupdated_files
2667
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002668
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002669def main():
Victor Stinnercad80202021-01-19 23:04:49 +01002670 global LIST_MODULE_NAMES
2671
2672 if "--list-module-names" in sys.argv:
2673 LIST_MODULE_NAMES = True
2674 sys.argv.remove("--list-module-names")
2675
Victor Stinnerc991f242019-03-01 17:19:04 +01002676 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2677 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2678
2679 class DummyProcess:
2680 """Hack for parallel build"""
2681 ProcessPoolExecutor = None
2682
2683 sys.modules['concurrent.futures.process'] = DummyProcess
Paul Ganssle62972d92020-05-16 04:20:06 -04002684 validate_tzpath()
Victor Stinnerc991f242019-03-01 17:19:04 +01002685
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002686 # turn off warnings when deprecated modules are imported
2687 import warnings
2688 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002689 setup(# PyPI Metadata (PEP 301)
2690 name = "Python",
2691 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002692 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002693 maintainer = "Guido van Rossum and the Python community",
2694 maintainer_email = "python-dev@python.org",
2695 description = "A high-level object-oriented programming language",
2696 long_description = SUMMARY.strip(),
2697 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002698 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002699 platforms = ["Many"],
2700
2701 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002702 cmdclass = {'build_ext': PyBuildExt,
2703 'build_scripts': PyBuildScripts,
2704 'install': PyBuildInstall,
2705 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002706 # The struct module is defined here, because build_ext won't be
2707 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002708 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002709
Georg Brandlff52f762010-12-28 09:51:43 +00002710 # If you change the scripts installed here, you also need to
2711 # check the PyBuildScripts command above, and change the links
2712 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002713 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002714 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002715 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002716
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002717# --install-platlib
2718if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002719 main()