blob: 80deacce8de48c2667fc24ca20cc0dc94336e450 [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
Xavier de Gaye13f1c332016-12-10 16:45:53 +01001867 if 'd' not in sysconfig.get_config_var('ABIFLAGS'):
Petr Viktorinc168b502020-12-08 17:36:53 +01001868 # Non-debug mode: Build xxlimited with limited API
Victor Stinnercfe172d2019-03-01 18:21:49 +01001869 self.add(Extension('xxlimited', ['xxlimited.c'],
Petr Viktorinc168b502020-12-08 17:36:53 +01001870 define_macros=[('Py_LIMITED_API', '0x03100000')]))
1871 self.add(Extension('xxlimited_35', ['xxlimited_35.c'],
Victor Stinnercfe172d2019-03-01 18:21:49 +01001872 define_macros=[('Py_LIMITED_API', '0x03050000')]))
Petr Viktorinc168b502020-12-08 17:36:53 +01001873 else:
1874 # Debug mode: Build xxlimited with the full API
1875 # (which is compatible with the limited one)
1876 self.add(Extension('xxlimited', ['xxlimited.c']))
1877 self.add(Extension('xxlimited_35', ['xxlimited_35.c']))
Ned Deilycd3d8fb2013-08-01 23:51:27 -07001878
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001879 def detect_tkinter_fromenv(self):
1880 # Build _tkinter using the Tcl/Tk locations specified by
1881 # the _TCLTK_INCLUDES and _TCLTK_LIBS environment variables.
1882 # This method is meant to be invoked by detect_tkinter().
Ned Deilyd819b932013-09-06 01:07:05 -07001883 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001884 # The variables can be set via one of the following ways.
Ned Deilyd819b932013-09-06 01:07:05 -07001885 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001886 # - Automatically, at configuration time, by using pkg-config.
1887 # The tool is called by the configure script.
1888 # Additional pkg-config configuration paths can be set via the
1889 # PKG_CONFIG_PATH environment variable.
1890 #
1891 # PKG_CONFIG_PATH=".../lib/pkgconfig" ./configure ...
1892 #
1893 # - Explicitly, at configuration time by setting both
1894 # --with-tcltk-includes and --with-tcltk-libs.
1895 #
1896 # ./configure ... \
Ned Deilyd819b932013-09-06 01:07:05 -07001897 # --with-tcltk-includes="-I/path/to/tclincludes \
1898 # -I/path/to/tkincludes"
1899 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1900 # -L/path/to/tklibs -ltkm.n"
1901 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001902 # - Explicitly, at compile time, by passing TCLTK_INCLUDES and
1903 # TCLTK_LIBS to the make target.
1904 # This will override any configuration-time option.
1905 #
1906 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
Ned Deilyd819b932013-09-06 01:07:05 -07001907 #
1908 # This can be useful for building and testing tkinter with multiple
1909 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1910 # build of Tcl so you need to specify both arguments and use care when
1911 # overriding.
1912
1913 # The _TCLTK variables are created in the Makefile sharedmods target.
1914 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1915 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1916 if not (tcltk_includes and tcltk_libs):
1917 # Resume default configuration search.
Victor Stinner4cbea512019-02-28 17:48:38 +01001918 return False
Ned Deilyd819b932013-09-06 01:07:05 -07001919
1920 extra_compile_args = tcltk_includes.split()
1921 extra_link_args = tcltk_libs.split()
Victor Stinnercfe172d2019-03-01 18:21:49 +01001922 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1923 define_macros=[('WITH_APPINIT', 1)],
1924 extra_compile_args = extra_compile_args,
1925 extra_link_args = extra_link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01001926 return True
Ned Deilyd819b932013-09-06 01:07:05 -07001927
Victor Stinner625dbf22019-03-01 15:59:39 +01001928 def detect_tkinter_darwin(self):
Ned Deily1731d6d2020-05-18 04:32:38 -04001929 # Build default _tkinter on macOS using Tcl and Tk frameworks.
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001930 # This method is meant to be invoked by detect_tkinter().
Ned Deily1731d6d2020-05-18 04:32:38 -04001931 #
1932 # The macOS native Tk (AKA Aqua Tk) and Tcl are most commonly
1933 # built and installed as macOS framework bundles. However,
1934 # for several reasons, we cannot take full advantage of the
1935 # Apple-supplied compiler chain's -framework options here.
1936 # Instead, we need to find and pass to the compiler the
1937 # absolute paths of the Tcl and Tk headers files we want to use
1938 # and the absolute path to the directory containing the Tcl
1939 # and Tk frameworks for linking.
1940 #
1941 # We want to handle here two common use cases on macOS:
1942 # 1. Build and link with system-wide third-party or user-built
1943 # Tcl and Tk frameworks installed in /Library/Frameworks.
1944 # 2. Build and link using a user-specified macOS SDK so that the
1945 # built Python can be exported to other systems. In this case,
1946 # search only the SDK's /Library/Frameworks (normally empty)
1947 # and /System/Library/Frameworks.
1948 #
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001949 # Any other use cases are handled either by detect_tkinter_fromenv(),
1950 # or detect_tkinter(). The former handles non-standard locations of
1951 # Tcl/Tk, defined via the _TCLTK_INCLUDES and _TCLTK_LIBS environment
1952 # variables. The latter handles any Tcl/Tk versions installed in
1953 # standard Unix directories.
1954 #
1955 # It would be desirable to also handle here the case where
Ned Deily1731d6d2020-05-18 04:32:38 -04001956 # you want to build and link with a framework build of Tcl and Tk
1957 # that is not in /Library/Frameworks, say, in your private
1958 # $HOME/Library/Frameworks directory or elsewhere. It turns
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301959 # out to be difficult to make that work automatically here
Ned Deily1731d6d2020-05-18 04:32:38 -04001960 # without bringing into play more tools and magic. That case
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301961 # can be handled using a recipe with the right arguments
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01001962 # to detect_tkinter_fromenv().
Ned Deily1731d6d2020-05-18 04:32:38 -04001963 #
1964 # Note also that the fallback case here is to try to use the
1965 # Apple-supplied Tcl and Tk frameworks in /System/Library but
1966 # be forewarned that they are deprecated by Apple and typically
1967 # out-of-date and buggy; their use should be avoided if at
1968 # all possible by installing a newer version of Tcl and Tk in
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301969 # /Library/Frameworks before building Python without
Ned Deily1731d6d2020-05-18 04:32:38 -04001970 # an explicit SDK or by configuring build arguments explicitly.
1971
Jack Jansen0b06be72002-06-21 14:48:38 +00001972 from os.path import join, exists
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001973
Ned Deily1731d6d2020-05-18 04:32:38 -04001974 sysroot = macosx_sdk_root() # path to the SDK or '/'
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001975
Ned Deily1731d6d2020-05-18 04:32:38 -04001976 if macosx_sdk_specified():
1977 # Use case #2: an SDK other than '/' was specified.
1978 # Only search there.
1979 framework_dirs = [
1980 join(sysroot, 'Library', 'Frameworks'),
1981 join(sysroot, 'System', 'Library', 'Frameworks'),
1982 ]
1983 else:
1984 # Use case #1: no explicit SDK selected.
1985 # Search the local system-wide /Library/Frameworks,
Manan Kumar Garg619f9802020-10-05 02:58:43 +05301986 # not the one in the default SDK, otherwise fall back to
Ned Deily1731d6d2020-05-18 04:32:38 -04001987 # /System/Library/Frameworks whose header files may be in
1988 # the default SDK or, on older systems, actually installed.
1989 framework_dirs = [
1990 join('/', 'Library', 'Frameworks'),
1991 join(sysroot, 'System', 'Library', 'Frameworks'),
1992 ]
1993
1994 # Find the directory that contains the Tcl.framework and
1995 # Tk.framework bundles.
Jack Jansen0b06be72002-06-21 14:48:38 +00001996 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001997 # both Tcl.framework and Tk.framework should be present
Jack Jansen0b06be72002-06-21 14:48:38 +00001998 for fw in 'Tcl', 'Tk':
Ned Deily1731d6d2020-05-18 04:32:38 -04001999 if not exists(join(F, fw + '.framework')):
2000 break
Jack Jansen0b06be72002-06-21 14:48:38 +00002001 else:
Manan Kumar Garg619f9802020-10-05 02:58:43 +05302002 # ok, F is now directory with both frameworks. Continue
Jack Jansen0b06be72002-06-21 14:48:38 +00002003 # building
2004 break
2005 else:
2006 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
2007 # will now resume.
Victor Stinner4cbea512019-02-28 17:48:38 +01002008 return False
Tim Peters2c60f7a2003-01-29 03:49:43 +00002009
Jack Jansen0b06be72002-06-21 14:48:38 +00002010 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00002011 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00002012 for fw in ('Tcl', 'Tk')
Ned Deily1731d6d2020-05-18 04:32:38 -04002013 for H in ('Headers',)
Jack Jansen0b06be72002-06-21 14:48:38 +00002014 ]
2015
Ned Deily1731d6d2020-05-18 04:32:38 -04002016 # Add the base framework directory as well
2017 compile_args = ['-F', F]
Jack Jansen0b06be72002-06-21 14:48:38 +00002018
Ned Deily1731d6d2020-05-18 04:32:38 -04002019 # Do not build tkinter for archs that this Tk was not built with.
Georg Brandlfcaf9102008-07-16 02:17:56 +00002020 cflags = sysconfig.get_config_vars('CFLAGS')[0]
R David Murray44b548d2016-09-08 13:59:53 -04002021 archs = re.findall(r'-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00002022
Ronald Oussorend097efe2009-09-15 19:07:58 +00002023 tmpfile = os.path.join(self.build_temp, 'tk.arch')
2024 if not os.path.exists(self.build_temp):
2025 os.makedirs(self.build_temp)
2026
Ned Deily1731d6d2020-05-18 04:32:38 -04002027 run_command(
2028 "file {}/Tk.framework/Tk | grep 'for architecture' > {}".format(F, tmpfile)
2029 )
Brett Cannon9f5db072010-10-29 20:19:27 +00002030 with open(tmpfile) as fp:
2031 detected_archs = []
2032 for ln in fp:
2033 a = ln.split()[-1]
2034 if a in archs:
2035 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00002036 os.unlink(tmpfile)
2037
Ned Deily1731d6d2020-05-18 04:32:38 -04002038 arch_args = []
Ronald Oussorend097efe2009-09-15 19:07:58 +00002039 for a in detected_archs:
Ned Deily1731d6d2020-05-18 04:32:38 -04002040 arch_args.append('-arch')
2041 arch_args.append(a)
2042
2043 compile_args += arch_args
2044 link_args = [','.join(['-Wl', '-F', F, '-framework', 'Tcl', '-framework', 'Tk']), *arch_args]
2045
2046 # The X11/xlib.h file bundled in the Tk sources can cause function
2047 # prototype warnings from the compiler. Since we cannot easily fix
2048 # that, suppress the warnings here instead.
2049 if '-Wstrict-prototypes' in cflags.split():
2050 compile_args.append('-Wno-strict-prototypes')
Georg Brandlfcaf9102008-07-16 02:17:56 +00002051
Victor Stinnercfe172d2019-03-01 18:21:49 +01002052 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
2053 define_macros=[('WITH_APPINIT', 1)],
2054 include_dirs=include_dirs,
2055 libraries=[],
Ned Deily1731d6d2020-05-18 04:32:38 -04002056 extra_compile_args=compile_args,
2057 extra_link_args=link_args))
Victor Stinner4cbea512019-02-28 17:48:38 +01002058 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00002059
Victor Stinner625dbf22019-03-01 15:59:39 +01002060 def detect_tkinter(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002061 # The _tkinter module.
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01002062 #
2063 # Detection of Tcl/Tk is attempted in the following order:
2064 # - Through environment variables.
2065 # - Platform specific detection of Tcl/Tk (currently only macOS).
2066 # - Search of various standard Unix header/library paths.
2067 #
2068 # Detection stops at the first successful method.
Michael W. Hudson5b109102002-01-23 15:04:41 +00002069
Manolis Stamatogiannakisd2027942021-03-01 04:29:57 +01002070 # Check for Tcl and Tk at the locations indicated by _TCLTK_INCLUDES
2071 # and _TCLTK_LIBS environment variables.
2072 if self.detect_tkinter_fromenv():
Victor Stinner5ec33a12019-03-01 16:43:28 +01002073 return True
Ned Deilyd819b932013-09-06 01:07:05 -07002074
Jack Jansen0b06be72002-06-21 14:48:38 +00002075 # Rather than complicate the code below, detecting and building
2076 # AquaTk is a separate method. Only one Tkinter will be built on
2077 # Darwin - either AquaTk, if it is found, or X11 based Tk.
Victor Stinner5ec33a12019-03-01 16:43:28 +01002078 if (MACOS and self.detect_tkinter_darwin()):
2079 return True
Jack Jansen0b06be72002-06-21 14:48:38 +00002080
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002081 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002082 # The versions with dots are used on Unix, and the versions without
2083 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002084 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00002085 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
2086 '8.2', '82', '8.1', '81', '8.0', '80']:
Victor Stinner625dbf22019-03-01 15:59:39 +01002087 tklib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002088 'tk' + version)
Victor Stinner625dbf22019-03-01 15:59:39 +01002089 tcllib = self.compiler.find_library_file(self.lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002090 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00002091 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002092 # Exit the loop when we've found the Tcl/Tk libraries
2093 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002094
Fredrik Lundhade711a2001-01-24 08:00:28 +00002095 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002096 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002097 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002098 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002099 dotversion = version
Victor Stinner4cbea512019-02-28 17:48:38 +01002100 if '.' not in dotversion and "bsd" in HOST_PLATFORM.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002101 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
2102 # but the include subdirs are named like .../include/tcl8.3.
2103 dotversion = dotversion[:-1] + '.' + dotversion[-1]
2104 tcl_include_sub = []
2105 tk_include_sub = []
Victor Stinner625dbf22019-03-01 15:59:39 +01002106 for dir in self.inc_dirs:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002107 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
2108 tk_include_sub += [dir + os.sep + "tk" + dotversion]
2109 tk_include_sub += tcl_include_sub
Victor Stinner625dbf22019-03-01 15:59:39 +01002110 tcl_includes = find_file('tcl.h', self.inc_dirs, tcl_include_sub)
2111 tk_includes = find_file('tk.h', self.inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002112
Martin v. Löwise86a59a2003-05-03 08:45:51 +00002113 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002114 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00002115 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Victor Stinner5ec33a12019-03-01 16:43:28 +01002116 return False
Fredrik Lundhade711a2001-01-24 08:00:28 +00002117
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002118 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002119
Victor Stinnercfe172d2019-03-01 18:21:49 +01002120 include_dirs = []
2121 libs = []
2122 defs = []
2123 added_lib_dirs = []
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002124 for dir in tcl_includes + tk_includes:
2125 if dir not in include_dirs:
2126 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002127
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002128 # Check for various platform-specific directories
Victor Stinner4cbea512019-02-28 17:48:38 +01002129 if HOST_PLATFORM == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002130 include_dirs.append('/usr/openwin/include')
2131 added_lib_dirs.append('/usr/openwin/lib')
2132 elif os.path.exists('/usr/X11R6/include'):
2133 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00002134 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002135 added_lib_dirs.append('/usr/X11R6/lib')
2136 elif os.path.exists('/usr/X11R5/include'):
2137 include_dirs.append('/usr/X11R5/include')
2138 added_lib_dirs.append('/usr/X11R5/lib')
2139 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002140 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002141 include_dirs.append('/usr/X11/include')
2142 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002143
Jason Tishler9181c942003-02-05 15:16:17 +00002144 # If Cygwin, then verify that X is installed before proceeding
Victor Stinner4cbea512019-02-28 17:48:38 +01002145 if CYGWIN:
Jason Tishler9181c942003-02-05 15:16:17 +00002146 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
2147 if x11_inc is None:
Victor Stinner5ec33a12019-03-01 16:43:28 +01002148 return False
Jason Tishler9181c942003-02-05 15:16:17 +00002149
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002150 # Check for BLT extension
Victor Stinner625dbf22019-03-01 15:59:39 +01002151 if self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002152 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002153 defs.append( ('WITH_BLT', 1) )
2154 libs.append('BLT8.0')
Victor Stinner625dbf22019-03-01 15:59:39 +01002155 elif self.compiler.find_library_file(self.lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00002156 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00002157 defs.append( ('WITH_BLT', 1) )
2158 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002159
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002160 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00002161 libs.append('tk'+ version)
2162 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00002163
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002164 # Finally, link with the X11 libraries (not appropriate on cygwin)
Victor Stinner4cbea512019-02-28 17:48:38 +01002165 if not CYGWIN:
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00002166 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002167
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00002168 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002169 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002170 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002171 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002172 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002173 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00002174 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002175
Victor Stinnercfe172d2019-03-01 18:21:49 +01002176 self.add(Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
2177 define_macros=[('WITH_APPINIT', 1)] + defs,
2178 include_dirs=include_dirs,
2179 libraries=libs,
2180 library_dirs=added_lib_dirs))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002181 return True
2182
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002183 def configure_ctypes(self, ext):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002184 return True
2185
Victor Stinner625dbf22019-03-01 15:59:39 +01002186 def detect_ctypes(self):
Victor Stinner5ec33a12019-03-01 16:43:28 +01002187 # Thomas Heller's _ctypes module
Ronald Oussoren41761932020-11-08 10:05:27 +01002188
2189 if (not sysconfig.get_config_var("LIBFFI_INCLUDEDIR") and MACOS):
2190 self.use_system_libffi = True
2191 else:
2192 self.use_system_libffi = '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS")
2193
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002194 include_dirs = []
Victor Stinner1ae035b2020-04-17 17:47:20 +02002195 extra_compile_args = ['-DPy_BUILD_CORE_MODULE']
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002196 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002197 sources = ['_ctypes/_ctypes.c',
2198 '_ctypes/callbacks.c',
2199 '_ctypes/callproc.c',
2200 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00002201 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002202 depends = ['_ctypes/ctypes.h']
2203
Victor Stinner4cbea512019-02-28 17:48:38 +01002204 if MACOS:
Ronald Oussoren2decf222010-09-05 18:25:59 +00002205 sources.append('_ctypes/malloc_closure.c')
Ronald Oussoren41761932020-11-08 10:05:27 +01002206 extra_compile_args.append('-DUSING_MALLOC_CLOSURE_DOT_C=1')
Christian Heimes78644762008-03-04 23:39:23 +00002207 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002208 include_dirs.append('_ctypes/darwin')
Thomas Hellercf567c12006-03-08 19:51:58 +00002209
Victor Stinner4cbea512019-02-28 17:48:38 +01002210 elif HOST_PLATFORM == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002211 # XXX This shouldn't be necessary; it appears that some
2212 # of the assembler code is non-PIC (i.e. it has relocations
2213 # when it shouldn't. The proper fix would be to rewrite
2214 # the assembler code to be PIC.
2215 # This only works with GCC; the Sun compiler likely refuses
2216 # this option. If you want to compile ctypes with the Sun
2217 # compiler, please research a proper solution, instead of
2218 # finding some -z option for the Sun compiler.
2219 extra_link_args.append('-mimpure-text')
2220
Victor Stinner4cbea512019-02-28 17:48:38 +01002221 elif HOST_PLATFORM.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00002222 extra_link_args.append('-fPIC')
2223
Thomas Hellercf567c12006-03-08 19:51:58 +00002224 ext = Extension('_ctypes',
2225 include_dirs=include_dirs,
2226 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00002227 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002228 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002229 sources=sources,
2230 depends=depends)
Victor Stinnercfe172d2019-03-01 18:21:49 +01002231 self.add(ext)
2232 if TEST_EXTENSIONS:
2233 # function my_sqrt() needs libm for sqrt()
2234 self.add(Extension('_ctypes_test',
2235 sources=['_ctypes/_ctypes_test.c'],
2236 libraries=['m']))
Thomas Hellercf567c12006-03-08 19:51:58 +00002237
Ronald Oussoren41761932020-11-08 10:05:27 +01002238 ffi_inc = sysconfig.get_config_var("LIBFFI_INCLUDEDIR")
2239 ffi_lib = None
2240
Victor Stinner625dbf22019-03-01 15:59:39 +01002241 ffi_inc_dirs = self.inc_dirs.copy()
Victor Stinner4cbea512019-02-28 17:48:38 +01002242 if MACOS:
Ronald Oussoren41761932020-11-08 10:05:27 +01002243 ffi_in_sdk = os.path.join(macosx_sdk_root(), "usr/include/ffi")
Christian Heimes78644762008-03-04 23:39:23 +00002244
Ronald Oussoren41761932020-11-08 10:05:27 +01002245 if not ffi_inc:
2246 if os.path.exists(ffi_in_sdk):
2247 ext.extra_compile_args.append("-DUSING_APPLE_OS_LIBFFI=1")
2248 ffi_inc = ffi_in_sdk
2249 ffi_lib = 'ffi'
2250 else:
2251 # OS X 10.5 comes with libffi.dylib; the include files are
2252 # in /usr/include/ffi
2253 ffi_inc_dirs.append('/usr/include/ffi')
2254
2255 if not ffi_inc:
2256 found = find_file('ffi.h', [], ffi_inc_dirs)
2257 if found:
2258 ffi_inc = found[0]
2259 if ffi_inc:
2260 ffi_h = ffi_inc + '/ffi.h'
Shlomi Fish6d51b872017-09-06 23:19:19 +03002261 if not os.path.exists(ffi_h):
2262 ffi_inc = None
2263 print('Header file {} does not exist'.format(ffi_h))
Ronald Oussoren41761932020-11-08 10:05:27 +01002264 if ffi_lib is None and ffi_inc:
doko@ubuntu.comae683652016-06-05 01:38:29 +02002265 for lib_name in ('ffi', 'ffi_pic'):
Victor Stinner625dbf22019-03-01 15:59:39 +01002266 if (self.compiler.find_library_file(self.lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002267 ffi_lib = lib_name
2268 break
2269
2270 if ffi_inc and ffi_lib:
Ronald Oussoren41761932020-11-08 10:05:27 +01002271 ffi_headers = glob(os.path.join(ffi_inc, '*.h'))
2272 if grep_headers_for('ffi_prep_cif_var', ffi_headers):
2273 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CIF_VAR=1")
2274 if grep_headers_for('ffi_prep_closure_loc', ffi_headers):
2275 ext.extra_compile_args.append("-DHAVE_FFI_PREP_CLOSURE_LOC=1")
2276 if grep_headers_for('ffi_closure_alloc', ffi_headers):
2277 ext.extra_compile_args.append("-DHAVE_FFI_CLOSURE_ALLOC=1")
2278
2279 ext.include_dirs.append(ffi_inc)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002280 ext.libraries.append(ffi_lib)
2281 self.use_system_libffi = True
2282
Christian Heimes5bb96922018-02-25 10:22:14 +01002283 if sysconfig.get_config_var('HAVE_LIBDL'):
2284 # for dlopen, see bpo-32647
2285 ext.libraries.append('dl')
2286
Victor Stinner5ec33a12019-03-01 16:43:28 +01002287 def detect_decimal(self):
2288 # Stefan Krah's _decimal module
Stefan Krah60187b52012-03-23 19:06:27 +01002289 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02002290 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01002291 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
2292 include_dirs = []
Stefan Krah45059eb2013-11-24 19:44:57 +01002293 libraries = [':libmpdec.so.2']
Stefan Krah60187b52012-03-23 19:06:27 +01002294 sources = ['_decimal/_decimal.c']
2295 depends = ['_decimal/docstrings.h']
2296 else:
Victor Stinner625dbf22019-03-01 15:59:39 +01002297 include_dirs = [os.path.abspath(os.path.join(self.srcdir,
Ned Deily458a6fb2012-04-01 02:30:46 -07002298 'Modules',
2299 '_decimal',
2300 'libmpdec'))]
Stefan Krahbd4ed772017-12-06 18:24:17 +01002301 libraries = ['m']
Stefan Krah60187b52012-03-23 19:06:27 +01002302 sources = [
2303 '_decimal/_decimal.c',
2304 '_decimal/libmpdec/basearith.c',
2305 '_decimal/libmpdec/constants.c',
2306 '_decimal/libmpdec/context.c',
2307 '_decimal/libmpdec/convolute.c',
2308 '_decimal/libmpdec/crt.c',
2309 '_decimal/libmpdec/difradix2.c',
2310 '_decimal/libmpdec/fnt.c',
2311 '_decimal/libmpdec/fourstep.c',
2312 '_decimal/libmpdec/io.c',
Stefan Krahf117d872019-07-10 18:27:38 +02002313 '_decimal/libmpdec/mpalloc.c',
Stefan Krah60187b52012-03-23 19:06:27 +01002314 '_decimal/libmpdec/mpdecimal.c',
2315 '_decimal/libmpdec/numbertheory.c',
2316 '_decimal/libmpdec/sixstep.c',
2317 '_decimal/libmpdec/transpose.c',
2318 ]
2319 depends = [
2320 '_decimal/docstrings.h',
2321 '_decimal/libmpdec/basearith.h',
2322 '_decimal/libmpdec/bits.h',
2323 '_decimal/libmpdec/constants.h',
2324 '_decimal/libmpdec/convolute.h',
2325 '_decimal/libmpdec/crt.h',
2326 '_decimal/libmpdec/difradix2.h',
2327 '_decimal/libmpdec/fnt.h',
2328 '_decimal/libmpdec/fourstep.h',
2329 '_decimal/libmpdec/io.h',
Stefan Krah8d013a82016-04-26 16:34:41 +02002330 '_decimal/libmpdec/mpalloc.h',
Stefan Krah60187b52012-03-23 19:06:27 +01002331 '_decimal/libmpdec/mpdecimal.h',
2332 '_decimal/libmpdec/numbertheory.h',
2333 '_decimal/libmpdec/sixstep.h',
2334 '_decimal/libmpdec/transpose.h',
2335 '_decimal/libmpdec/typearith.h',
2336 '_decimal/libmpdec/umodarith.h',
2337 ]
2338
Stefan Krah1919b7e2012-03-21 18:25:23 +01002339 config = {
2340 'x64': [('CONFIG_64','1'), ('ASM','1')],
2341 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
2342 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
2343 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
2344 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
2345 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
2346 ('LEGACY_COMPILER','1')],
2347 'universal': [('UNIVERSAL','1')]
2348 }
2349
Stefan Krah1919b7e2012-03-21 18:25:23 +01002350 cc = sysconfig.get_config_var('CC')
2351 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
2352 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
2353
2354 if machine:
2355 # Override automatic configuration to facilitate testing.
2356 define_macros = config[machine]
Victor Stinner4cbea512019-02-28 17:48:38 +01002357 elif MACOS:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002358 # Universal here means: build with the same options Python
2359 # was built with.
2360 define_macros = config['universal']
2361 elif sizeof_size_t == 8:
2362 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
2363 define_macros = config['x64']
2364 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
2365 define_macros = config['uint128']
2366 else:
2367 define_macros = config['ansi64']
2368 elif sizeof_size_t == 4:
2369 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
2370 if ppro and ('gcc' in cc or 'clang' in cc) and \
Victor Stinner4cbea512019-02-28 17:48:38 +01002371 not 'sunos' in HOST_PLATFORM:
Stefan Krah1919b7e2012-03-21 18:25:23 +01002372 # solaris: problems with register allocation.
2373 # icc >= 11.0 works as well.
2374 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02002375 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002376 else:
2377 define_macros = config['ansi32']
2378 else:
2379 raise DistutilsError("_decimal: unsupported architecture")
2380
2381 # Workarounds for toolchain bugs:
2382 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2383 # Some versions of gcc miscompile inline asm:
2384 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2385 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2386 extra_compile_args.append('-fno-ipa-pure-const')
2387 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2388 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2389 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2390 undef_macros.append('_FORTIFY_SOURCE')
2391
Stefan Krah1919b7e2012-03-21 18:25:23 +01002392 # Uncomment for extra functionality:
2393 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
Victor Stinner8058bda2019-03-01 15:31:45 +01002394 self.add(Extension('_decimal',
2395 include_dirs=include_dirs,
2396 libraries=libraries,
2397 define_macros=define_macros,
2398 undef_macros=undef_macros,
2399 extra_compile_args=extra_compile_args,
2400 sources=sources,
2401 depends=depends))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002402
Victor Stinner5ec33a12019-03-01 16:43:28 +01002403 def detect_openssl_hashlib(self):
2404 # Detect SSL support for the socket module (via _ssl)
Christian Heimesff5be6e2018-01-20 13:19:21 +01002405 config_vars = sysconfig.get_config_vars()
2406
2407 def split_var(name, sep):
2408 # poor man's shlex, the re module is not available yet.
2409 value = config_vars.get(name)
2410 if not value:
2411 return ()
2412 # This trick works because ax_check_openssl uses --libs-only-L,
2413 # --libs-only-l, and --cflags-only-I.
2414 value = ' ' + value
2415 sep = ' ' + sep
2416 return [v.strip() for v in value.split(sep) if v.strip()]
2417
2418 openssl_includes = split_var('OPENSSL_INCLUDES', '-I')
2419 openssl_libdirs = split_var('OPENSSL_LDFLAGS', '-L')
2420 openssl_libs = split_var('OPENSSL_LIBS', '-l')
Christian Heimes32eba612021-03-19 10:29:25 +01002421 openssl_rpath = config_vars.get('OPENSSL_RPATH')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002422 if not openssl_libs:
2423 # libssl and libcrypto not found
Christian Heimes8abc3f42019-04-09 18:40:12 +02002424 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002425 return None, None
2426
2427 # Find OpenSSL includes
2428 ssl_incs = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002429 'openssl/ssl.h', self.inc_dirs, openssl_includes
Christian Heimesff5be6e2018-01-20 13:19:21 +01002430 )
2431 if ssl_incs is None:
Christian Heimes8abc3f42019-04-09 18:40:12 +02002432 self.missing.extend(['_ssl', '_hashlib'])
Christian Heimesff5be6e2018-01-20 13:19:21 +01002433 return None, None
2434
2435 # OpenSSL 1.0.2 uses Kerberos for KRB5 ciphers
2436 krb5_h = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002437 'krb5.h', self.inc_dirs,
Christian Heimesff5be6e2018-01-20 13:19:21 +01002438 ['/usr/kerberos/include']
2439 )
2440 if krb5_h:
2441 ssl_incs.extend(krb5_h)
2442
Christian Heimes32eba612021-03-19 10:29:25 +01002443 if openssl_rpath == 'auto':
2444 runtime_library_dirs = openssl_libdirs[:]
2445 elif not openssl_rpath:
2446 runtime_library_dirs = []
2447 else:
2448 runtime_library_dirs = [openssl_rpath]
2449
Christian Heimes61d478c2018-01-27 15:51:38 +01002450 if config_vars.get("HAVE_X509_VERIFY_PARAM_SET1_HOST"):
Christian Heimesc7f70692019-05-31 11:44:05 +02002451 self.add(Extension(
2452 '_ssl', ['_ssl.c'],
2453 include_dirs=openssl_includes,
2454 library_dirs=openssl_libdirs,
2455 libraries=openssl_libs,
Christian Heimes32eba612021-03-19 10:29:25 +01002456 runtime_library_dirs=runtime_library_dirs,
Christian Heimesc7f70692019-05-31 11:44:05 +02002457 depends=['socketmodule.h', '_ssl/debughelpers.c'])
2458 )
Christian Heimes61d478c2018-01-27 15:51:38 +01002459 else:
Victor Stinner8058bda2019-03-01 15:31:45 +01002460 self.missing.append('_ssl')
Christian Heimesff5be6e2018-01-20 13:19:21 +01002461
Victor Stinner8058bda2019-03-01 15:31:45 +01002462 self.add(Extension('_hashlib', ['_hashopenssl.c'],
2463 depends=['hashlib.h'],
2464 include_dirs=openssl_includes,
2465 library_dirs=openssl_libdirs,
Christian Heimes32eba612021-03-19 10:29:25 +01002466 runtime_library_dirs=runtime_library_dirs,
Victor Stinner8058bda2019-03-01 15:31:45 +01002467 libraries=openssl_libs))
Christian Heimesff5be6e2018-01-20 13:19:21 +01002468
xdegaye2ee077f2019-04-09 17:20:08 +02002469 def detect_hash_builtins(self):
Christian Heimes9b60e552020-05-15 23:54:53 +02002470 # By default we always compile these even when OpenSSL is available
2471 # (issue #14693). It's harmless and the object code is tiny
2472 # (40-50 KiB per module, only loaded when actually used). Modules can
2473 # be disabled via the --with-builtin-hashlib-hashes configure flag.
2474 supported = {"md5", "sha1", "sha256", "sha512", "sha3", "blake2"}
Victor Stinner5ec33a12019-03-01 16:43:28 +01002475
Christian Heimes9b60e552020-05-15 23:54:53 +02002476 configured = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES")
2477 configured = configured.strip('"').lower()
2478 configured = {
2479 m.strip() for m in configured.split(",")
2480 }
Victor Stinner5ec33a12019-03-01 16:43:28 +01002481
Christian Heimes9b60e552020-05-15 23:54:53 +02002482 self.disabled_configure.extend(
2483 sorted(supported.difference(configured))
2484 )
Victor Stinner5ec33a12019-03-01 16:43:28 +01002485
Christian Heimes9b60e552020-05-15 23:54:53 +02002486 if "sha256" in configured:
2487 self.add(Extension(
2488 '_sha256', ['sha256module.c'],
2489 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2490 depends=['hashlib.h']
2491 ))
2492
2493 if "sha512" in configured:
2494 self.add(Extension(
2495 '_sha512', ['sha512module.c'],
2496 extra_compile_args=['-DPy_BUILD_CORE_MODULE'],
2497 depends=['hashlib.h']
2498 ))
2499
2500 if "md5" in configured:
2501 self.add(Extension(
2502 '_md5', ['md5module.c'],
2503 depends=['hashlib.h']
2504 ))
2505
2506 if "sha1" in configured:
2507 self.add(Extension(
2508 '_sha1', ['sha1module.c'],
2509 depends=['hashlib.h']
2510 ))
2511
2512 if "blake2" in configured:
2513 blake2_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002514 os.path.join(escape(self.srcdir), 'Modules/_blake2/impl/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002515 )
2516 blake2_deps.append('hashlib.h')
2517 self.add(Extension(
2518 '_blake2',
2519 [
2520 '_blake2/blake2module.c',
2521 '_blake2/blake2b_impl.c',
2522 '_blake2/blake2s_impl.c'
2523 ],
2524 depends=blake2_deps
2525 ))
2526
2527 if "sha3" in configured:
2528 sha3_deps = glob(
Serhiy Storchaka93558682020-06-20 11:10:31 +03002529 os.path.join(escape(self.srcdir), 'Modules/_sha3/kcp/*')
Christian Heimes9b60e552020-05-15 23:54:53 +02002530 )
2531 sha3_deps.append('hashlib.h')
2532 self.add(Extension(
2533 '_sha3',
2534 ['_sha3/sha3module.c'],
2535 depends=sha3_deps
2536 ))
Victor Stinner5ec33a12019-03-01 16:43:28 +01002537
2538 def detect_nis(self):
Victor Stinner4cbea512019-02-28 17:48:38 +01002539 if MS_WINDOWS or CYGWIN or HOST_PLATFORM == 'qnx6':
Victor Stinner8058bda2019-03-01 15:31:45 +01002540 self.missing.append('nis')
2541 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002542
2543 libs = []
2544 library_dirs = []
2545 includes_dirs = []
2546
2547 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2548 # moved headers and libraries to libtirpc and libnsl. The headers
2549 # are in tircp and nsl sub directories.
2550 rpcsvc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002551 'rpcsvc/yp_prot.h', self.inc_dirs,
2552 [os.path.join(inc_dir, 'nsl') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002553 )
2554 rpc_inc = find_file(
Victor Stinner625dbf22019-03-01 15:59:39 +01002555 'rpc/rpc.h', self.inc_dirs,
2556 [os.path.join(inc_dir, 'tirpc') for inc_dir in self.inc_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002557 )
2558 if rpcsvc_inc is None or rpc_inc is None:
2559 # not found
Victor Stinner8058bda2019-03-01 15:31:45 +01002560 self.missing.append('nis')
2561 return
Christian Heimes29a7df72018-01-26 23:28:46 +01002562 includes_dirs.extend(rpcsvc_inc)
2563 includes_dirs.extend(rpc_inc)
2564
Victor Stinner625dbf22019-03-01 15:59:39 +01002565 if self.compiler.find_library_file(self.lib_dirs, 'nsl'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002566 libs.append('nsl')
2567 else:
2568 # libnsl-devel: check for libnsl in nsl/ subdirectory
Victor Stinner625dbf22019-03-01 15:59:39 +01002569 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in self.lib_dirs]
Christian Heimes29a7df72018-01-26 23:28:46 +01002570 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2571 if libnsl is not None:
2572 library_dirs.append(os.path.dirname(libnsl))
2573 libs.append('nsl')
2574
Victor Stinner625dbf22019-03-01 15:59:39 +01002575 if self.compiler.find_library_file(self.lib_dirs, 'tirpc'):
Christian Heimes29a7df72018-01-26 23:28:46 +01002576 libs.append('tirpc')
2577
Victor Stinner8058bda2019-03-01 15:31:45 +01002578 self.add(Extension('nis', ['nismodule.c'],
2579 libraries=libs,
2580 library_dirs=library_dirs,
2581 include_dirs=includes_dirs))
Christian Heimes29a7df72018-01-26 23:28:46 +01002582
Christian Heimesff5be6e2018-01-20 13:19:21 +01002583
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002584class PyBuildInstall(install):
2585 # Suppress the warning about installation into the lib_dynload
2586 # directory, which is not in sys.path when running Python during
2587 # installation:
2588 def initialize_options (self):
2589 install.initialize_options(self)
2590 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002591
Éric Araujoe6792c12011-06-09 14:07:02 +02002592 # Customize subcommands to not install an egg-info file for Python
2593 sub_commands = [('install_lib', install.has_lib),
2594 ('install_headers', install.has_headers),
2595 ('install_scripts', install.has_scripts),
2596 ('install_data', install.has_data)]
2597
2598
Michael W. Hudson529a5052002-12-17 16:47:17 +00002599class PyBuildInstallLib(install_lib):
2600 # Do exactly what install_lib does but make sure correct access modes get
2601 # set on installed directories and files. All installed files with get
2602 # mode 644 unless they are a shared library in which case they will get
2603 # mode 755. All installed directories will get mode 755.
2604
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002605 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2606 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002607
2608 def install(self):
2609 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002610 self.set_file_modes(outfiles, 0o644, 0o755)
2611 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002612 return outfiles
2613
2614 def set_file_modes(self, files, defaultMode, sharedLibMode):
Michael W. Hudson529a5052002-12-17 16:47:17 +00002615 if not files: return
2616
2617 for filename in files:
2618 if os.path.islink(filename): continue
2619 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002620 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002621 log.info("changing mode of %s to %o", filename, mode)
2622 if not self.dry_run: os.chmod(filename, mode)
2623
2624 def set_dir_modes(self, dirname, mode):
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002625 for dirpath, dirnames, fnames in os.walk(dirname):
2626 if os.path.islink(dirpath):
2627 continue
2628 log.info("changing mode of %s to %o", dirpath, mode)
2629 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002630
Victor Stinnerc991f242019-03-01 17:19:04 +01002631
Georg Brandlff52f762010-12-28 09:51:43 +00002632class PyBuildScripts(build_scripts):
2633 def copy_scripts(self):
2634 outfiles, updated_files = build_scripts.copy_scripts(self)
2635 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2636 minoronly = '.{0[1]}'.format(sys.version_info)
2637 newoutfiles = []
2638 newupdated_files = []
2639 for filename in outfiles:
Brett Cannona8c34242018-04-20 14:15:40 -07002640 if filename.endswith('2to3'):
Georg Brandlff52f762010-12-28 09:51:43 +00002641 newfilename = filename + fullversion
2642 else:
2643 newfilename = filename + minoronly
Vinay Sajipdd917f82016-08-31 08:22:29 +01002644 log.info('renaming %s to %s', filename, newfilename)
Georg Brandlff52f762010-12-28 09:51:43 +00002645 os.rename(filename, newfilename)
2646 newoutfiles.append(newfilename)
2647 if filename in updated_files:
2648 newupdated_files.append(newfilename)
2649 return newoutfiles, newupdated_files
2650
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002651
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002652def main():
Victor Stinnercad80202021-01-19 23:04:49 +01002653 global LIST_MODULE_NAMES
2654
2655 if "--list-module-names" in sys.argv:
2656 LIST_MODULE_NAMES = True
2657 sys.argv.remove("--list-module-names")
2658
Victor Stinnerc991f242019-03-01 17:19:04 +01002659 set_compiler_flags('CFLAGS', 'PY_CFLAGS_NODIST')
2660 set_compiler_flags('LDFLAGS', 'PY_LDFLAGS_NODIST')
2661
2662 class DummyProcess:
2663 """Hack for parallel build"""
2664 ProcessPoolExecutor = None
2665
2666 sys.modules['concurrent.futures.process'] = DummyProcess
Paul Ganssle62972d92020-05-16 04:20:06 -04002667 validate_tzpath()
Victor Stinnerc991f242019-03-01 17:19:04 +01002668
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002669 # turn off warnings when deprecated modules are imported
2670 import warnings
2671 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002672 setup(# PyPI Metadata (PEP 301)
2673 name = "Python",
2674 version = sys.version.split()[0],
Serhiy Storchaka885bdc42016-02-11 13:10:36 +02002675 url = "http://www.python.org/%d.%d" % sys.version_info[:2],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002676 maintainer = "Guido van Rossum and the Python community",
2677 maintainer_email = "python-dev@python.org",
2678 description = "A high-level object-oriented programming language",
2679 long_description = SUMMARY.strip(),
2680 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002681 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002682 platforms = ["Many"],
2683
2684 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002685 cmdclass = {'build_ext': PyBuildExt,
2686 'build_scripts': PyBuildScripts,
2687 'install': PyBuildInstall,
2688 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002689 # The struct module is defined here, because build_ext won't be
2690 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002691 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002692
Georg Brandlff52f762010-12-28 09:51:43 +00002693 # If you change the scripts installed here, you also need to
2694 # check the PyBuildScripts command above, and change the links
2695 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002696 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Brett Cannona8c34242018-04-20 14:15:40 -07002697 "Tools/scripts/2to3"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002698 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002699
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002700# --install-platlib
2701if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002702 main()