blob: 33cecc6875739c507c5f3236077e2cc0c47c4e22 [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
2#
Fredrik Lundhade711a2001-01-24 08:00:28 +00003
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00004__version__ = "$Revision$"
5
Brett Cannon84667c02004-12-07 03:25:18 +00006import sys, os, imp, re, optparse
Christian Heimes8608d912008-01-25 15:52:11 +00007from glob import glob
Gregory P. Smith0902cac2008-05-27 08:40:09 +00008from platform import machine as platform_machine
Tarek Ziadé5633a802010-01-23 09:23:15 +00009import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +000010
11from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +000012from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000013from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000014from distutils.core import Extension, setup
15from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000016from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000017from distutils.command.install_lib import install_lib
Stefan Krah4d32c9c2010-06-04 09:49:20 +000018from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000019
doko@python.orgd65e2ba2013-01-31 23:52:03 +010020cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
21
22def get_platform():
23 # cross build
24 if "_PYTHON_HOST_PLATFORM" in os.environ:
25 return os.environ["_PYTHON_HOST_PLATFORM"]
26 # Get value of sys.platform
27 if sys.platform.startswith('osf1'):
28 return 'osf1'
29 return sys.platform
30host_platform = get_platform()
31
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000032# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@python.orgd65e2ba2013-01-31 23:52:03 +010033COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000034
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000035# This global variable is used to hold the list of modules to be disabled.
36disabled_module_list = []
37
Michael W. Hudson39230b32002-01-16 15:26:48 +000038def add_dir_to_list(dirlist, dir):
39 """Add the directory 'dir' to the list 'dirlist' (at the front) if
40 1) 'dir' is not already in 'dirlist'
41 2) 'dir' actually exists, and is a directory."""
Jack Jansen4439b7c2002-06-26 15:44:30 +000042 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
Michael W. Hudson39230b32002-01-16 15:26:48 +000043 dirlist.insert(0, dir)
44
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000045def macosx_sdk_root():
46 """
47 Return the directory of the current OSX SDK,
48 or '/' if no SDK was specified.
49 """
50 cflags = sysconfig.get_config_var('CFLAGS')
51 m = re.search(r'-isysroot\s+(\S+)', cflags)
52 if m is None:
53 sysroot = '/'
54 else:
55 sysroot = m.group(1)
56 return sysroot
57
58def is_macosx_sdk_path(path):
59 """
60 Returns True if 'path' can be located in an OSX SDK
61 """
Ned Deilyd8ec4642012-07-30 04:07:49 -070062 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
63 or path.startswith('/System/')
64 or path.startswith('/Library/') )
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000065
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000066def find_file(filename, std_dirs, paths):
67 """Searches for the directory where a given file is located,
68 and returns a possibly-empty list of additional directories, or None
69 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000070
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000071 'filename' is the name of a file, such as readline.h or libcrypto.a.
72 'std_dirs' is the list of standard system directories; if the
73 file is found in one of them, no additional directives are needed.
74 'paths' is a list of additional locations to check; if the file is
75 found in one of them, the resulting list will contain the directory.
76 """
doko@python.orgd65e2ba2013-01-31 23:52:03 +010077 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000078 # Honor the MacOSX SDK setting when one was specified.
79 # An SDK is a directory with the same structure as a real
80 # system, but with only header files and libraries.
81 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000082
83 # Check the standard locations
84 for dir in std_dirs:
85 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000086
doko@python.orgd65e2ba2013-01-31 23:52:03 +010087 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000088 f = os.path.join(sysroot, dir[1:], filename)
89
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000090 if os.path.exists(f): return []
91
92 # Check the additional directories
93 for dir in paths:
94 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000095
doko@python.orgd65e2ba2013-01-31 23:52:03 +010096 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000097 f = os.path.join(sysroot, dir[1:], filename)
98
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000099 if os.path.exists(f):
100 return [dir]
101
102 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000103 return None
104
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000105def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000106 result = compiler.find_library_file(std_dirs + paths, libname)
107 if result is None:
108 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000109
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100110 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000111 sysroot = macosx_sdk_root()
112
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000113 # Check whether the found file is in one of the standard directories
114 dirname = os.path.dirname(result)
115 for p in std_dirs:
116 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000117 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000118
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100119 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ned Deily83abccb2016-02-25 00:55:24 +1100120 # Note that, as of Xcode 7, Apple SDKs may contain textual stub
121 # libraries with .tbd extensions rather than the normal .dylib
122 # shared libraries installed in /. The Apple compiler tool
123 # chain handles this transparently but it can cause problems
124 # for programs that are being built with an SDK and searching
125 # for specific libraries. Distutils find_library_file() now
126 # knows to also search for and return .tbd files. But callers
127 # of find_library_file need to keep in mind that the base filename
128 # of the returned SDK library file might have a different extension
129 # from that of the library file installed on the running system,
130 # for example:
131 # /Applications/Xcode.app/Contents/Developer/Platforms/
132 # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
133 # usr/lib/libedit.tbd
134 # vs
135 # /usr/lib/libedit.dylib
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000136 if os.path.join(sysroot, p[1:]) == dirname:
137 return [ ]
138
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000139 if p == dirname:
140 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000141
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000142 # Otherwise, it must have been in one of the additional directories,
143 # so we have to figure out which one.
144 for p in paths:
145 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000146 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000147
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100148 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000149 if os.path.join(sysroot, p[1:]) == dirname:
150 return [ p ]
151
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000152 if p == dirname:
153 return [p]
154 else:
155 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000156
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000157def module_enabled(extlist, modname):
158 """Returns whether the module 'modname' is present in the list
159 of extensions 'extlist'."""
160 extlist = [ext for ext in extlist if ext.name == modname]
161 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000162
Jack Jansen144ebcc2001-08-05 22:31:19 +0000163def find_module_file(module, dirlist):
164 """Find a module in a set of possible folders. If it is not found
165 return the unadorned filename"""
166 list = find_file(module, [], dirlist)
167 if not list:
168 return module
169 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000170 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000171 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000172
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000173class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000174
Skip Montanarod1287322007-03-06 15:41:38 +0000175 def __init__(self, dist):
176 build_ext.__init__(self, dist)
177 self.failed = []
178
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000179 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000180
181 # Detect which modules should be compiled
Skip Montanarod1287322007-03-06 15:41:38 +0000182 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000183
184 # Remove modules that are present on the disabled list
Christian Heimesb222bbc2008-01-18 09:51:43 +0000185 extensions = [ext for ext in self.extensions
186 if ext.name not in disabled_module_list]
187 # move ctypes to the end, it depends on other modules
188 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
189 if "_ctypes" in ext_map:
190 ctypes = extensions.pop(ext_map["_ctypes"])
191 extensions.append(ctypes)
192 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000193
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000194 # Fix up the autodetected modules, prefixing all the source files
195 # with Modules/ and adding Python's include directory to the path.
196 (srcdir,) = sysconfig.get_config_vars('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000197 if not srcdir:
198 # Maybe running on Windows but not using CYGWIN?
199 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer0189ddc2009-02-06 00:21:55 +0000200 srcdir = os.path.abspath(srcdir)
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000201 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000202
Jack Jansen144ebcc2001-08-05 22:31:19 +0000203 # Platform-dependent module source and include directories
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000204 incdirlist = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100205
206 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07 +0000207 sysconfig.get_config_var("CONFIG_ARGS")):
Jack Jansen144ebcc2001-08-05 22:31:19 +0000208 # Mac OS X also includes some mac-specific modules
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000209 macmoddir = os.path.join(srcdir, 'Mac/Modules')
Jack Jansen144ebcc2001-08-05 22:31:19 +0000210 moddirlist.append(macmoddir)
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000211 incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000212
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000213 # Fix up the paths for scripts, too
214 self.distribution.scripts = [os.path.join(srcdir, filename)
215 for filename in self.distribution.scripts]
216
Christian Heimes8608d912008-01-25 15:52:11 +0000217 # Python header files
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000218 headers = [sysconfig.get_config_h_filename()]
Stefan Krah4666ebd2012-02-29 14:17:18 +0100219 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000220 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000221 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000222 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000223 if ext.depends is not None:
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000224 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000225 for filename in ext.depends]
Christian Heimes8608d912008-01-25 15:52:11 +0000226 else:
227 ext.depends = []
228 # re-compile extensions if a header file has been changed
229 ext.depends.extend(headers)
230
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000231 # platform specific include directories
232 ext.include_dirs.extend(incdirlist)
233
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000234 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000235 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000236 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000237 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000238
Ronald Oussoren9545a232010-05-05 19:09:31 +0000239 # Parse Modules/Setup and Modules/Setup.local to figure out which
240 # modules are turned on in the file.
241 remove_modules = []
242 for filename in ('Modules/Setup', 'Modules/Setup.local'):
243 input = text_file.TextFile(filename, join_lines=1)
244 while 1:
245 line = input.readline()
246 if not line: break
247 line = line.split()
248 remove_modules.append(line[0])
249 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000250
Ronald Oussoren9545a232010-05-05 19:09:31 +0000251 for ext in self.extensions[:]:
252 if ext.name in remove_modules:
253 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000254
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000255 # When you run "make CC=altcc" or something similar, you really want
256 # those environment variables passed into the setup.py phase. Here's
257 # a small set of useful ones.
258 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000259 args = {}
260 # unfortunately, distutils doesn't let us provide separate C and C++
261 # compilers
262 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000263 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
264 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000265 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000266
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000267 build_ext.build_extensions(self)
268
Berker Peksag1b4b7af2014-09-27 22:55:10 +0300269 longest = 0
270 if self.extensions:
271 longest = max([len(e.name) for e in self.extensions])
Skip Montanarod1287322007-03-06 15:41:38 +0000272 if self.failed:
273 longest = max(longest, max([len(name) for name in self.failed]))
274
275 def print_three_column(lst):
Georg Brandle95cf1c2007-03-06 17:49:14 +0000276 lst.sort(key=str.lower)
Skip Montanarod1287322007-03-06 15:41:38 +0000277 # guarantee zip() doesn't drop anything
278 while len(lst) % 3:
279 lst.append("")
280 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
281 print "%-*s %-*s %-*s" % (longest, e, longest, f,
282 longest, g)
Skip Montanarod1287322007-03-06 15:41:38 +0000283
284 if missing:
285 print
Georg Brandl40f982f2008-12-28 11:58:49 +0000286 print ("Python build finished, but the necessary bits to build "
287 "these modules were not found:")
Skip Montanarod1287322007-03-06 15:41:38 +0000288 print_three_column(missing)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000289 print ("To find the necessary bits, look in setup.py in"
290 " detect_modules() for the module's name.")
291 print
Skip Montanarod1287322007-03-06 15:41:38 +0000292
293 if self.failed:
294 failed = self.failed[:]
295 print
296 print "Failed to build these modules:"
297 print_three_column(failed)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000298 print
Skip Montanarod1287322007-03-06 15:41:38 +0000299
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000300 def build_extension(self, ext):
301
Thomas Hellereba43c12006-04-07 19:04:09 +0000302 if ext.name == '_ctypes':
Thomas Heller795246c2006-04-07 19:27:56 +0000303 if not self.configure_ctypes(ext):
304 return
Thomas Hellereba43c12006-04-07 19:04:09 +0000305
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000306 try:
307 build_ext.build_extension(self, ext)
308 except (CCompilerError, DistutilsError), why:
309 self.announce('WARNING: building of extension "%s" failed: %s' %
310 (ext.name, sys.exc_info()[1]))
Skip Montanarod1287322007-03-06 15:41:38 +0000311 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000312 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000313 # Workaround for Mac OS X: The Carbon-based modules cannot be
314 # reliably imported into a command-line Python
315 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000316 self.announce(
317 'WARNING: skipping import check for Carbon-based "%s"' %
318 ext.name)
319 return
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000320
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100321 if host_platform == 'darwin' and (
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000322 sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
323 # Don't bother doing an import check when an extension was
324 # build with an explicit '-arch' flag on OSX. That's currently
325 # only used to build 32-bit only extensions in a 4-way
326 # universal build and loading 32-bit code into a 64-bit
327 # process will fail.
328 self.announce(
329 'WARNING: skipping import check for "%s"' %
330 ext.name)
331 return
332
Jason Tishler24cf7762002-05-22 16:46:15 +0000333 # Workaround for Cygwin: Cygwin currently has fork issues when many
334 # modules have been imported
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100335 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000336 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
337 % ext.name)
338 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000339 ext_filename = os.path.join(
340 self.build_lib,
341 self.get_ext_filename(self.get_ext_fullname(ext.name)))
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100342
343 # Don't try to load extensions for cross builds
344 if cross_compiling:
345 return
346
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000347 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000348 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000349 except ImportError, why:
Skip Montanarod1287322007-03-06 15:41:38 +0000350 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000351 self.announce('*** WARNING: renaming "%s" since importing it'
352 ' failed: %s' % (ext.name, why), level=3)
353 assert not self.inplace
354 basename, tail = os.path.splitext(ext_filename)
355 newname = basename + "_failed" + tail
356 if os.path.exists(newname):
357 os.remove(newname)
358 os.rename(ext_filename, newname)
359
360 # XXX -- This relies on a Vile HACK in
361 # distutils.command.build_ext.build_extension(). The
362 # _built_objects attribute is stored there strictly for
363 # use here.
364 # If there is a failure, _built_objects may not be there,
365 # so catch the AttributeError and move on.
366 try:
367 for filename in self._built_objects:
368 os.remove(filename)
369 except AttributeError:
370 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000371 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000372 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000373 self.announce('*** WARNING: importing extension "%s" '
374 'failed with %s: %s' % (ext.name, exc_type, why),
375 level=3)
Skip Montanarod1287322007-03-06 15:41:38 +0000376 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000377
Barry Warsawffc9caf2011-04-07 11:28:11 -0400378 def add_multiarch_paths(self):
379 # Debian/Ubuntu multiarch support.
380 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3d2fc152012-09-21 13:51:40 +0200381 cc = sysconfig.get_config_var('CC')
382 tmpfile = os.path.join(self.build_temp, 'multiarch')
383 if not os.path.exists(self.build_temp):
384 os.makedirs(self.build_temp)
385 ret = os.system(
386 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
387 multiarch_path_component = ''
388 try:
389 if ret >> 8 == 0:
390 with open(tmpfile) as fp:
391 multiarch_path_component = fp.readline().strip()
392 finally:
393 os.unlink(tmpfile)
394
395 if multiarch_path_component != '':
396 add_dir_to_list(self.compiler.library_dirs,
397 '/usr/lib/' + multiarch_path_component)
398 add_dir_to_list(self.compiler.include_dirs,
399 '/usr/include/' + multiarch_path_component)
400 return
401
Barry Warsawffc9caf2011-04-07 11:28:11 -0400402 if not find_executable('dpkg-architecture'):
403 return
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100404 opt = ''
405 if cross_compiling:
406 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400407 tmpfile = os.path.join(self.build_temp, 'multiarch')
408 if not os.path.exists(self.build_temp):
409 os.makedirs(self.build_temp)
410 ret = os.system(
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100411 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
412 (opt, tmpfile))
Barry Warsawffc9caf2011-04-07 11:28:11 -0400413 try:
414 if ret >> 8 == 0:
415 with open(tmpfile) as fp:
416 multiarch_path_component = fp.readline().strip()
417 add_dir_to_list(self.compiler.library_dirs,
418 '/usr/lib/' + multiarch_path_component)
419 add_dir_to_list(self.compiler.include_dirs,
420 '/usr/include/' + multiarch_path_component)
421 finally:
422 os.unlink(tmpfile)
423
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100424 def add_gcc_paths(self):
425 gcc = sysconfig.get_config_var('CC')
426 tmpfile = os.path.join(self.build_temp, 'gccpaths')
427 if not os.path.exists(self.build_temp):
428 os.makedirs(self.build_temp)
429 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
430 is_gcc = False
431 in_incdirs = False
432 inc_dirs = []
433 lib_dirs = []
434 try:
435 if ret >> 8 == 0:
436 with open(tmpfile) as fp:
437 for line in fp.readlines():
438 if line.startswith("gcc version"):
439 is_gcc = True
440 elif line.startswith("#include <...>"):
441 in_incdirs = True
442 elif line.startswith("End of search list"):
443 in_incdirs = False
444 elif is_gcc and line.startswith("LIBRARY_PATH"):
445 for d in line.strip().split("=")[1].split(":"):
446 d = os.path.normpath(d)
447 if '/gcc/' not in d:
448 add_dir_to_list(self.compiler.library_dirs,
449 d)
450 elif is_gcc and in_incdirs and '/gcc/' not in line:
451 add_dir_to_list(self.compiler.include_dirs,
452 line.strip())
453 finally:
454 os.unlink(tmpfile)
455
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000456 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000457 # Ensure that /usr/local is always used
Ned Deily61667092013-05-15 18:00:45 -0700458 if not cross_compiling:
459 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
460 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
461 if cross_compiling:
462 self.add_gcc_paths()
Barry Warsawffc9caf2011-04-07 11:28:11 -0400463 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000464
Brett Cannon516592f2004-12-07 00:42:59 +0000465 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000466 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000467 # We must get the values from the Makefile and not the environment
468 # directly since an inconsistently reproducible issue comes up where
469 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000470 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000471 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000472 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
473 ('LDFLAGS', '-L', self.compiler.library_dirs),
474 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000475 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000476 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000477 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000478 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000479 # all double dashes and any dashes followed by a character
480 # that is not for the option we are dealing with.
481 #
482 # Please note that order of the regex is important! We must
483 # strip out double-dashes first so that we don't end up with
484 # substituting "--Long" to "-Long" and thus lead to "ong" being
485 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000486 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
487 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000488 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000489 # Make sure that allowing args interspersed with options is
490 # allowed
491 parser.allow_interspersed_args = True
492 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000493 parser.add_option(arg_name, dest="dirs", action="append")
494 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000495 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000496 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000497 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000498
Ronald Oussoren24215252010-10-20 13:11:46 +0000499 if os.path.normpath(sys.prefix) != '/usr' \
500 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
501 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
502 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
503 # building a framework with different architectures than
504 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000505 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000506 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000507 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000508 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000509
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000510 try:
511 have_unicode = unicode
512 except NameError:
513 have_unicode = 0
514
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000515 # lib_dirs and inc_dirs are used to search for files;
516 # if a file is found in one of those directories, it can
517 # be assumed that no additional -I,-L directives are needed.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100518 inc_dirs = self.compiler.include_dirs[:]
519 lib_dirs = self.compiler.library_dirs[:]
520 if not cross_compiling:
521 for d in (
522 '/usr/include',
523 ):
524 add_dir_to_list(inc_dirs, d)
525 for d in (
526 '/lib64', '/usr/lib64',
527 '/lib', '/usr/lib',
528 ):
529 add_dir_to_list(lib_dirs, d)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000530 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000531 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000532
Brett Cannon4454a1f2005-04-15 20:32:39 +0000533 config_h = sysconfig.get_config_h_filename()
534 config_h_vars = sysconfig.parse_config_h(open(config_h))
535
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000536 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000537
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000538 # Check for AtheOS which has libraries in non-standard locations
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100539 if host_platform == 'atheos':
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000540 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
541 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
542 inc_dirs += ['/system/include', '/atheos/autolnk/include']
543 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
544
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000545 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100546 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000547 lib_dirs += ['/usr/ccs/lib']
548
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200549 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100550 if host_platform == 'hp-ux11':
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200551 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
552
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100553 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000554 # This should work on any unixy platform ;-)
555 # If the user has bothered specifying additional -I and -L flags
556 # in OPT and LDFLAGS we might as well use them here.
557 # NOTE: using shlex.split would technically be more correct, but
558 # also gives a bootstrap problem. Let's hope nobody uses directories
559 # with whitespace in the name to store libraries.
560 cflags, ldflags = sysconfig.get_config_vars(
561 'CFLAGS', 'LDFLAGS')
562 for item in cflags.split():
563 if item.startswith('-I'):
564 inc_dirs.append(item[2:])
565
566 for item in ldflags.split():
567 if item.startswith('-L'):
568 lib_dirs.append(item[2:])
569
Fredrik Lundhade711a2001-01-24 08:00:28 +0000570 # Check for MacOS X, which doesn't need libm.a at all
571 math_libs = ['m']
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100572 if host_platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000573 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000574
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000575 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
576
577 #
578 # The following modules are all pretty straightforward, and compile
579 # on pretty much any POSIXish platform.
580 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000581
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000582 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000583 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000584
585 # array objects
586 exts.append( Extension('array', ['arraymodule.c']) )
Martin Panter83e9b572016-02-03 05:19:44 +0000587
588 shared_math = 'Modules/_math.o'
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000589 # complex math library functions
Martin Panter83e9b572016-02-03 05:19:44 +0000590 exts.append( Extension('cmath', ['cmathmodule.c'],
591 extra_objects=[shared_math],
592 depends=['_math.h', shared_math],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000593 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000594 # math library functions, e.g. sin()
Martin Panter83e9b572016-02-03 05:19:44 +0000595 exts.append( Extension('math', ['mathmodule.c'],
596 extra_objects=[shared_math],
597 depends=['_math.h', shared_math],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000598 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000599 # fast string operations implemented in C
600 exts.append( Extension('strop', ['stropmodule.c']) )
601 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000602 exts.append( Extension('time', ['timemodule.c'],
603 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000604 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000605 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000606 # fast iterator tools implemented in C
607 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000608 # code that will be builtins in the future, but conflict with the
609 # current builtins
610 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000611 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000612 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000613 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000614 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000615 # bisect
616 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000617 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000618 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000619 # operator.add() and similar goodies
620 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000621 # Python 3.1 _io library
622 exts.append( Extension("_io",
623 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
624 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
625 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000626 # _functools
627 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000628 # _json speedups
629 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000630 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000631 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
632 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000633 # profilers (_lsprof is for cProfile.py)
634 exts.append( Extension('_hotshot', ['_hotshot.c']) )
635 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000636 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000637 if have_unicode:
638 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000639 else:
640 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000641 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000642 data = open('pyconfig.h').read()
643 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
644 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000645 locale_libs = ['intl']
646 else:
647 locale_libs = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100648 if host_platform == 'darwin':
Jack Jansen84b74472004-07-15 19:56:25 +0000649 locale_extra_link_args = ['-framework', 'CoreFoundation']
650 else:
651 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000652
Jack Jansen84b74472004-07-15 19:56:25 +0000653
Jason Tishlerd28216b2002-08-14 11:13:52 +0000654 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000655 libraries=locale_libs,
656 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000657
658 # Modules with some UNIX dependencies -- on by default:
659 # (If you have a really backward UNIX, select and socket may not be
660 # supported...)
661
662 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000663 libs = []
664 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
665 # May be necessary on AIX for flock function
666 libs = ['bsd']
667 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000668 # pwd(3)
669 exts.append( Extension('pwd', ['pwdmodule.c']) )
670 # grp(3)
671 exts.append( Extension('grp', ['grpmodule.c']) )
672 # spwd, shadow passwords
673 if (config_h_vars.get('HAVE_GETSPNAM', False) or
674 config_h_vars.get('HAVE_GETSPENT', False)):
675 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000676 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000677 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000678
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000679 # select(2); not on ancient System V
680 exts.append( Extension('select', ['selectmodule.c']) )
681
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000682 # Fred Drake's interface to the Python parser
683 exts.append( Extension('parser', ['parsermodule.c']) )
684
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000685 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000686 exts.append( Extension('cStringIO', ['cStringIO.c']) )
687 exts.append( Extension('cPickle', ['cPickle.c']) )
688
689 # Memory-mapped files (also works on Win32).
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100690 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000691 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000692 else:
693 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000694
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000695 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000696 # syslog daemon interface
697 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000698
699 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000700 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
701 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
702 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000703
704 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000705 # Here ends the simple stuff. From here on, modules need certain
706 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000707 #
708
709 # Multimedia modules
710 # These don't work for 64-bit platforms!!!
711 # These represent audio samples or images as strings:
712
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000713 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000714 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000715 # 64-bit platforms.
716 exts.append( Extension('audioop', ['audioop.c']) )
717
Fredrik Lundhade711a2001-01-24 08:00:28 +0000718 # Disabled on 64-bit platforms
Benjamin Peterson6e3c3c32015-01-21 00:47:54 -0500719 if sys.maxsize != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000720 # Operations on images
721 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000722 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000723 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000724
725 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000726 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000727 readline_termcap_library = ""
728 curses_library = ""
729 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000730 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000731 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000732 ldd_output = fp.readlines()
733 ret = fp.close()
734 if ret is None or ret >> 8 == 0:
735 for ln in ldd_output:
736 if 'curses' in ln:
737 readline_termcap_library = re.sub(
738 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
739 ).rstrip()
740 break
741 if 'tinfo' in ln: # termcap interface split out from ncurses
742 readline_termcap_library = 'tinfo'
743 break
Stefan Krah449aa862010-06-03 12:39:50 +0000744 # Issue 7384: If readline is already linked against curses,
745 # use the same library for the readline and curses modules.
746 if 'curses' in readline_termcap_library:
747 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000748 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000749 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000750 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000751 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000752 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000753 curses_library = 'curses'
754
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100755 if host_platform == 'darwin':
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000756 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000757 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily1f70b872014-06-25 13:33:57 -0700758 if (dep_target and
759 (tuple(int(n) for n in dep_target.split('.')[0:2])
760 < (10, 5) ) ):
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000761 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000762 if os_release < 9:
763 # MacOSX 10.4 has a broken readline. Don't try to build
764 # the readline module unless the user has installed a fixed
765 # readline package
766 if find_file('readline/rlconf.h', inc_dirs, []) is None:
767 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000768 if do_readline:
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100769 if host_platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000770 # In every directory on the search path search for a dynamic
771 # library and then a static library, instead of first looking
Fred Drake9c771ba2007-09-04 19:43:19 +0000772 # for dynamic libraries on the entire path.
Martin Panter8d496ad2016-06-02 10:35:44 +0000773 # This way a statically linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000774 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000775 readline_extra_link_args = ('-Wl,-search_paths_first',)
776 else:
777 readline_extra_link_args = ()
778
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000779 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000780 if readline_termcap_library:
781 pass # Issue 7384: Already linked against curses or tinfo.
782 elif curses_library:
783 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000784 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000785 ['/usr/lib/termcap'],
786 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000787 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000788 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000789 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000790 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000791 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000792 else:
793 missing.append('readline')
794
Ronald Oussoren9545a232010-05-05 19:09:31 +0000795 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000796
Ronald Oussoren9545a232010-05-05 19:09:31 +0000797 if self.compiler.find_library_file(lib_dirs, 'crypt'):
798 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000799 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000800 libs = []
801 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000802
Skip Montanaroba9e9782003-03-20 23:34:22 +0000803 # CSV files
804 exts.append( Extension('_csv', ['_csv.c']) )
805
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000806 # socket(2)
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700807 exts.append( Extension('_socket', ['socketmodule.c', 'timemodule.c'],
808 depends=['socketmodule.h'],
809 libraries=math_libs) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000810 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000811 search_for_ssl_incs_in = [
812 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000813 '/usr/contrib/ssl/include/'
814 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000815 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
816 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000817 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000818 if ssl_incs is not None:
819 krb5_h = find_file('krb5.h', inc_dirs,
820 ['/usr/kerberos/include'])
821 if krb5_h:
822 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000823 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000824 ['/usr/local/ssl/lib',
825 '/usr/contrib/ssl/lib/'
826 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000827
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000828 if (ssl_incs is not None and
829 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000830 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000831 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000832 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000833 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000834 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000835 else:
836 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000837
Gregory P. Smithade97332005-08-23 21:19:40 +0000838 # find out which version of OpenSSL we have
839 openssl_ver = 0
840 openssl_ver_re = re.compile(
841 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000842
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000843 # look for the openssl version header on the compiler search path.
844 opensslv_h = find_file('openssl/opensslv.h', [],
845 inc_dirs + search_for_ssl_incs_in)
846 if opensslv_h:
847 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100848 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000849 name = os.path.join(macosx_sdk_root(), name[1:])
850 try:
851 incfile = open(name, 'r')
852 for line in incfile:
853 m = openssl_ver_re.match(line)
854 if m:
855 openssl_ver = eval(m.group(1))
856 except IOError, msg:
857 print "IOError while reading opensshv.h:", msg
858 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000859
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000860 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000861 have_any_openssl = ssl_incs is not None and ssl_libs is not None
862 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000863 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000864
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000865 if have_any_openssl:
866 if have_usable_openssl:
867 # The _hashlib module wraps optimized implementations
868 # of hash functions from the OpenSSL library.
869 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
870 include_dirs = ssl_incs,
871 library_dirs = ssl_libs,
872 libraries = ['ssl', 'crypto']) )
873 else:
874 print ("warning: openssl 0x%08x is too old for _hashlib" %
875 openssl_ver)
876 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000877 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000878 # The _sha module implements the SHA1 hash algorithm.
879 exts.append( Extension('_sha', ['shamodule.c']) )
880 # The _md5 module implements the RSA Data Security, Inc. MD5
881 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000882 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000883 exts.append( Extension('_md5',
884 sources = ['md5module.c', 'md5.c'],
885 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000886
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000887 min_sha2_openssl_ver = 0x00908000
888 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000889 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
890 exts.append( Extension('_sha256', ['sha256module.c']) )
891 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000892
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000893 # Modules that provide persistent dictionary-like semantics. You will
894 # probably want to arrange for at least one of them to be available on
895 # your machine, though none are defined by default because of library
896 # dependencies. The Python module anydbm.py provides an
897 # implementation independent wrapper for these; dumbdbm.py provides
898 # similar functionality (but slower of course) implemented in Python.
899
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000900 # Sleepycat^WOracle Berkeley DB interface.
901 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000902 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000903 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000904 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000905 # a release. Most open source OSes come with one or more
906 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000907
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700908 max_db_ver = (5, 3)
909 min_db_ver = (4, 3)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000910 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000911
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000912 def allow_db_ver(db_ver):
913 """Returns a boolean if the given BerkeleyDB version is acceptable.
914
915 Args:
916 db_ver: A tuple of the version to verify.
917 """
918 if not (min_db_ver <= db_ver <= max_db_ver):
919 return False
920 # Use this function to filter out known bad configurations.
921 if (4, 6) == db_ver[:2]:
922 # BerkeleyDB 4.6.x is not stable on many architectures.
923 arch = platform_machine()
924 if arch not in ('i386', 'i486', 'i586', 'i686',
925 'x86_64', 'ia64'):
926 return False
927 return True
928
929 def gen_db_minor_ver_nums(major):
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700930 if major == 5:
931 for x in range(max_db_ver[1]+1):
932 if allow_db_ver((5, x)):
933 yield x
934 elif major == 4:
Benjamin Petersonef2436f2013-10-26 13:55:25 -0400935 for x in range(9):
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000936 if allow_db_ver((4, x)):
937 yield x
938 elif major == 3:
939 for x in (3,):
940 if allow_db_ver((3, x)):
941 yield x
942 else:
943 raise ValueError("unknown major BerkeleyDB version", major)
944
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000945 # construct a list of paths to look for the header file in on
946 # top of the normal inc_dirs.
947 db_inc_paths = [
948 '/usr/include/db4',
949 '/usr/local/include/db4',
950 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000951 '/usr/include/db3',
952 '/usr/local/include/db3',
953 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000954 # Fink defaults (http://fink.sourceforge.net/)
955 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000956 '/sw/include/db3',
957 ]
958 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000959 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000960 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000961 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000962 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
963 db_inc_paths.append('/usr/local/include/db4%d' % x)
964 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000965 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000966 # MacPorts default (http://www.macports.org/)
967 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000968 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000969 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000970 db_inc_paths.append('/usr/include/db3%d' % x)
971 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
972 db_inc_paths.append('/usr/local/include/db3%d' % x)
973 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000974 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000975
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100976 if cross_compiling:
977 db_inc_paths = []
978
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000979 # Add some common subdirectories for Sleepycat DB to the list,
980 # based on the standard include directories. This way DB3/4 gets
981 # picked up when it is installed in a non-standard prefix and
982 # the user has added that prefix into inc_dirs.
983 std_variants = []
984 for dn in inc_dirs:
985 std_variants.append(os.path.join(dn, 'db3'))
986 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000987 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000988 std_variants.append(os.path.join(dn, "db4%d"%x))
989 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000990 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000991 std_variants.append(os.path.join(dn, "db3%d"%x))
992 std_variants.append(os.path.join(dn, "db3.%d"%x))
993
Tim Peters38ff36c2006-06-30 06:18:39 +0000994 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000995 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000996
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000997 db_ver_inc_map = {}
998
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100999 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001000 sysroot = macosx_sdk_root()
1001
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001002 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +00001003 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001004 # See whether there is a Sleepycat header in the standard
1005 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001006 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001007 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001008
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001009 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001010 f = os.path.join(sysroot, d[1:], "db.h")
1011
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001012 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001013 if os.path.exists(f):
1014 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001015 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001016 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001017 db_major = int(m.group(1))
1018 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
1019 db_minor = int(m.group(1))
1020 db_ver = (db_major, db_minor)
1021
Gregory P. Smith1475cd82007-10-06 07:51:59 +00001022 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1023 if db_ver == (4, 6):
1024 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
1025 db_patch = int(m.group(1))
1026 if db_patch < 21:
1027 print "db.h:", db_ver, "patch", db_patch,
1028 print "being ignored (4.6.x must be >= 4.6.21)"
1029 continue
1030
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001031 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +00001032 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001033 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +00001034 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001035 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001036 if db_setup_debug:
1037 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001038 else:
1039 # we already found a header for this library version
1040 if db_setup_debug: print "db.h: ignoring", d
1041 else:
1042 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +00001043 if db_setup_debug:
1044 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001045
1046 db_found_vers = db_ver_inc_map.keys()
1047 db_found_vers.sort()
1048
1049 while db_found_vers:
1050 db_ver = db_found_vers.pop()
1051 db_incdir = db_ver_inc_map[db_ver]
1052
1053 # check lib directories parallel to the location of the header
1054 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +00001055 db_incdir.replace("include", 'lib64'),
1056 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001057 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001058
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001059 if host_platform != 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001060 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
1061
1062 else:
1063 # Same as other branch, but takes OSX SDK into account
1064 tmp = []
1065 for dn in db_dirs_to_check:
1066 if is_macosx_sdk_path(dn):
1067 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1068 tmp.append(dn)
1069 else:
1070 if os.path.isdir(dn):
1071 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +00001072 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001073
Ezio Melotti24b07bc2011-03-15 18:55:01 +02001074 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001075 # XXX should we -ever- look for a dbX name? Do any
1076 # systems really not name their library by version and
1077 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +00001078 for dblib in (('db-%d.%d' % db_ver),
1079 ('db%d%d' % db_ver),
1080 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001081 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001082 db_dirs_to_check + lib_dirs, dblib )
1083 if dblib_file:
1084 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1085 raise db_found
1086 else:
1087 if db_setup_debug: print "db lib: ", dblib, "not found"
1088
1089 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +00001090 if db_setup_debug:
1091 print "bsddb using BerkeleyDB lib:", db_ver, dblib
1092 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001093 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +00001094 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001095 # We add the runtime_library_dirs argument because the
1096 # BerkeleyDB lib we're linking against often isn't in the
1097 # system dynamic library search path. This is usually
1098 # correct and most trouble free, but may cause problems in
1099 # some unusual system configurations (e.g. the directory
1100 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001101 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +00001102 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001103 library_dirs=dblib_dir,
1104 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001105 include_dirs=db_incs,
1106 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +00001107 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001108 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001109 db_incs = None
1110 dblibs = []
1111 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001112 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001113
Anthony Baxterc51ee692006-04-01 00:57:31 +00001114 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001115 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001116
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001117 # We hunt for #define SQLITE_VERSION "n.n.n"
1118 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001119 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001120 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001121 '/usr/include/sqlite',
1122 '/usr/include/sqlite3',
1123 '/usr/local/include',
1124 '/usr/local/include/sqlite',
1125 '/usr/local/include/sqlite3',
1126 ]
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001127 if cross_compiling:
1128 sqlite_inc_paths = []
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001129 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1130 MIN_SQLITE_VERSION = ".".join([str(x)
1131 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001132
1133 # Scan the default include directories before the SQLite specific
1134 # ones. This allows one to override the copy of sqlite on OSX,
1135 # where /usr/include contains an old version of sqlite.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001136 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001137 sysroot = macosx_sdk_root()
1138
Ned Deily67028042012-08-05 14:42:45 -07001139 for d_ in inc_dirs + sqlite_inc_paths:
1140 d = d_
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001141 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily67028042012-08-05 14:42:45 -07001142 d = os.path.join(sysroot, d[1:])
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001143
Ned Deily67028042012-08-05 14:42:45 -07001144 f = os.path.join(d, "sqlite3.h")
Anthony Baxterc51ee692006-04-01 00:57:31 +00001145 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001146 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001147 incf = open(f).read()
1148 m = re.search(
Petri Lehtinenc23178b2013-02-23 17:05:28 +01001149 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001150 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001151 sqlite_version = m.group(1)
1152 sqlite_version_tuple = tuple([int(x)
1153 for x in sqlite_version.split(".")])
1154 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001155 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001156 if sqlite_setup_debug:
1157 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001158 sqlite_incdir = d
1159 break
1160 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001161 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001162 print "%s: version %d is too old, need >= %s"%(d,
1163 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001164 elif sqlite_setup_debug:
1165 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1166
Anthony Baxterc51ee692006-04-01 00:57:31 +00001167 if sqlite_incdir:
1168 sqlite_dirs_to_check = [
1169 os.path.join(sqlite_incdir, '..', 'lib64'),
1170 os.path.join(sqlite_incdir, '..', 'lib'),
1171 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1172 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1173 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001174 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001175 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001176 if sqlite_libfile:
1177 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001178
1179 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001180 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001181 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001182 '_sqlite/cursor.c',
1183 '_sqlite/microprotocols.c',
1184 '_sqlite/module.c',
1185 '_sqlite/prepare_protocol.c',
1186 '_sqlite/row.c',
1187 '_sqlite/statement.c',
1188 '_sqlite/util.c', ]
1189
Anthony Baxterc51ee692006-04-01 00:57:31 +00001190 sqlite_defines = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001191 if host_platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001192 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001193 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001194 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1195
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001196 # Comment this out if you want the sqlite3 module to be able to load extensions.
1197 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001198
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001199 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001200 # In every directory on the search path search for a dynamic
1201 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001202 # for dynamic libraries on the entire path.
1203 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001204 # before the dynamic library in /usr/lib.
1205 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1206 else:
1207 sqlite_extra_link_args = ()
1208
Anthony Baxterc51ee692006-04-01 00:57:31 +00001209 exts.append(Extension('_sqlite3', sqlite_srcs,
1210 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001211 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001212 sqlite_incdir],
1213 library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001214 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001215 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001216 else:
1217 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001218
1219 # Look for Berkeley db 1.85. Note that it is built as a different
1220 # module name so it can be included even when later versions are
1221 # available. A very restrictive search is performed to avoid
1222 # accidentally building this module with a later version of the
1223 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1224 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001225 #
1226 # If the better bsddb library can be built (db_incs is defined)
1227 # we do not build this one. Otherwise this build will pick up
1228 # the more recent berkeleydb's db.h file first in the include path
1229 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001230 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001231
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001232 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001233 if is_macosx_sdk_path(f):
1234 sysroot = macosx_sdk_root()
1235 f = os.path.join(sysroot, f[1:])
1236
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001237 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001238 data = open(f).read()
1239 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1240 if m is not None:
1241 # bingo - old version used hash file format version 2
1242 ### XXX this should be fixed to not be platform-dependent
1243 ### but I don't have direct access to an osf1 platform and
1244 ### seemed to be muffing the search somehow
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001245 libraries = host_platform == "osf1" and ['db'] or None
Skip Montanaro22e00c42003-05-06 20:43:34 +00001246 if libraries is not None:
1247 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1248 libraries=libraries))
1249 else:
1250 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001251 else:
1252 missing.append('bsddb185')
1253 else:
1254 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001255
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001256 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001257 # The standard Unix dbm module:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001258 if host_platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001259 config_args = [arg.strip("'")
1260 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001261 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001262 if arg.startswith('--with-dbmliborder=')]
1263 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001264 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001265 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001266 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001267 dbmext = None
1268 for cand in dbm_order:
1269 if cand == "ndbm":
1270 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001271 # Some systems have -lndbm, others have -lgdbm_compat,
1272 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001273 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001274 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001275 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001276 elif self.compiler.find_library_file(lib_dirs,
1277 'gdbm_compat'):
1278 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001279 else:
1280 ndbm_libs = []
1281 print "building dbm using ndbm"
1282 dbmext = Extension('dbm', ['dbmmodule.c'],
1283 define_macros=[
1284 ('HAVE_NDBM_H',None),
1285 ],
1286 libraries=ndbm_libs)
1287 break
1288
1289 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001290 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001291 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001292 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001293 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001294 gdbm_libs.append('gdbm_compat')
1295 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1296 print "building dbm using gdbm"
1297 dbmext = Extension(
1298 'dbm', ['dbmmodule.c'],
1299 define_macros=[
1300 ('HAVE_GDBM_NDBM_H', None),
1301 ],
1302 libraries = gdbm_libs)
1303 break
1304 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1305 print "building dbm using gdbm"
1306 dbmext = Extension(
1307 'dbm', ['dbmmodule.c'],
1308 define_macros=[
1309 ('HAVE_GDBM_DASH_NDBM_H', None),
1310 ],
1311 libraries = gdbm_libs)
1312 break
1313 elif cand == "bdb":
1314 if db_incs is not None:
1315 print "building dbm using bdb"
1316 dbmext = Extension('dbm', ['dbmmodule.c'],
1317 library_dirs=dblib_dir,
1318 runtime_library_dirs=dblib_dir,
1319 include_dirs=db_incs,
1320 define_macros=[
1321 ('HAVE_BERKDB_H', None),
1322 ('DB_DBM_HSEARCH', None),
1323 ],
1324 libraries=dblibs)
1325 break
1326 if dbmext is not None:
1327 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001328 else:
1329 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001330
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001331 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001332 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001333 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001334 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1335 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001336 else:
1337 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001338
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001339 # Unix-only modules
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001340 if host_platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001341 # Steen Lumholt's termios module
1342 exts.append( Extension('termios', ['termios.c']) )
1343 # Jeremy Hylton's rlimit interface
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001344 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001345 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001346 else:
1347 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001348
Christian Heimes38487a02018-01-27 09:39:39 +01001349 nis = self._detect_nis(inc_dirs, lib_dirs)
1350 if nis is not None:
1351 exts.append(nis)
Skip Montanarod1287322007-03-06 15:41:38 +00001352 else:
1353 missing.append('nis')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001354
Skip Montanaro72092942004-02-07 12:50:19 +00001355 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001356 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001357 panel_library = 'panel'
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001358 curses_incs = None
Stefan Krah449aa862010-06-03 12:39:50 +00001359 if curses_library.startswith('ncurses'):
1360 if curses_library == 'ncursesw':
1361 # Bug 1464056: If _curses.so links with ncursesw,
1362 # _curses_panel.so must link with panelw.
1363 panel_library = 'panelw'
1364 curses_libs = [curses_library]
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001365 curses_incs = find_file('curses.h', inc_dirs,
1366 [os.path.join(d, 'ncursesw') for d in inc_dirs])
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001367 exts.append( Extension('_curses', ['_cursesmodule.c'],
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001368 include_dirs = curses_incs,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001369 libraries = curses_libs) )
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001370 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001371 # OSX has an old Berkeley curses, not good enough for
1372 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001373 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001374 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001375 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001376 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001377 else:
1378 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001379
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001380 exts.append( Extension('_curses', ['_cursesmodule.c'],
1381 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001382 else:
1383 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001384
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001385 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001386 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001387 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001388 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001389 include_dirs = curses_incs,
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001390 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001391 else:
1392 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001393
Barry Warsaw259b1e12002-08-13 20:09:26 +00001394 # Andrew Kuchling's zlib module. Note that some versions of zlib
1395 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1396 # http://www.cert.org/advisories/CA-2002-07.html
1397 #
1398 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1399 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1400 # now, we still accept 1.1.3, because we think it's difficult to
1401 # exploit this in Python, and we'd rather make it RedHat's problem
1402 # than our problem <wink>.
1403 #
1404 # You can upgrade zlib to version 1.1.4 yourself by going to
1405 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001406 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001407 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001408 if zlib_inc is not None:
1409 zlib_h = zlib_inc[0] + '/zlib.h'
1410 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001411 version_req = '"1.1.3"'
Ned Deily6ea3c9b2013-10-18 21:33:57 -07001412 if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
1413 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Guido van Rossume6970912001-04-15 15:16:12 +00001414 fp = open(zlib_h)
1415 while 1:
1416 line = fp.readline()
1417 if not line:
1418 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001419 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001420 version = line.split()[2]
1421 break
1422 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001423 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001424 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001425 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1426 else:
1427 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001428 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001429 libraries = ['z'],
1430 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001431 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001432 else:
1433 missing.append('zlib')
1434 else:
1435 missing.append('zlib')
1436 else:
1437 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001438
Gregory P. Smith440ca772008-03-24 00:08:01 +00001439 # Helper module for various ascii-encoders. Uses zlib for an optimized
1440 # crc32 if we have it. Otherwise binascii uses its own.
1441 if have_zlib:
1442 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1443 libraries = ['z']
1444 extra_link_args = zlib_extra_link_args
1445 else:
1446 extra_compile_args = []
1447 libraries = []
1448 extra_link_args = []
1449 exts.append( Extension('binascii', ['binascii.c'],
1450 extra_compile_args = extra_compile_args,
1451 libraries = libraries,
1452 extra_link_args = extra_link_args) )
1453
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001454 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001455 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001456 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001457 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1458 else:
1459 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001460 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001461 libraries = ['bz2'],
1462 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001463 else:
1464 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001465
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001466 # Interface to the Expat XML parser
1467 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001468 # Expat was written by James Clark and is now maintained by a group of
1469 # developers on SourceForge; see www.libexpat.org for more information.
1470 # The pyexpat module was written by Paul Prescod after a prototype by
1471 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1472 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001473 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001474 #
1475 # More information on Expat can be found at www.libexpat.org.
1476 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001477 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1478 expat_inc = []
1479 define_macros = []
1480 expat_lib = ['expat']
1481 expat_sources = []
Christian Heimes56656b02013-02-09 17:02:06 +01001482 expat_depends = []
Benjamin Peterson2c196742009-12-31 03:17:18 +00001483 else:
1484 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1485 define_macros = [
1486 ('HAVE_EXPAT_CONFIG_H', '1'),
Victor Stinnerec4ab092017-08-19 01:06:45 +02001487 # bpo-30947: Python uses best available entropy sources to
1488 # call XML_SetHashSalt(), expat entropy sources are not needed
1489 ('XML_POOR_ENTROPY', '1'),
Benjamin Peterson2c196742009-12-31 03:17:18 +00001490 ]
1491 expat_lib = []
1492 expat_sources = ['expat/xmlparse.c',
1493 'expat/xmlrole.c',
1494 'expat/xmltok.c']
Christian Heimes56656b02013-02-09 17:02:06 +01001495 expat_depends = ['expat/ascii.h',
1496 'expat/asciitab.h',
1497 'expat/expat.h',
1498 'expat/expat_config.h',
1499 'expat/expat_external.h',
1500 'expat/internal.h',
1501 'expat/latin1tab.h',
1502 'expat/utf8tab.h',
1503 'expat/xmlrole.h',
1504 'expat/xmltok.h',
1505 'expat/xmltok_impl.h'
1506 ]
Ronald Oussoren988117f2006-04-29 11:31:35 +00001507
Fred Drake2d59a492003-10-21 15:41:15 +00001508 exts.append(Extension('pyexpat',
1509 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001510 include_dirs = expat_inc,
1511 libraries = expat_lib,
Christian Heimes56656b02013-02-09 17:02:06 +01001512 sources = ['pyexpat.c'] + expat_sources,
1513 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001514 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001515
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001516 # Fredrik Lundh's cElementTree module. Note that this also
1517 # uses expat (via the CAPI hook in pyexpat).
1518
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001519 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001520 define_macros.append(('USE_PYEXPAT_CAPI', None))
1521 exts.append(Extension('_elementtree',
1522 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001523 include_dirs = expat_inc,
1524 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001525 sources = ['_elementtree.c'],
Christian Heimes56656b02013-02-09 17:02:06 +01001526 depends = ['pyexpat.c'] + expat_sources +
1527 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001528 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001529 else:
1530 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001531
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001532 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001533 if have_unicode:
1534 exts.append(Extension('_multibytecodec',
1535 ['cjkcodecs/multibytecodec.c']))
1536 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001537 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001538 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001539 else:
1540 missing.append('_multibytecodec')
1541 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1542 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001543
Michael W. Hudson5b109102002-01-23 15:04:41 +00001544 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001545 if sys.maxint == 0x7fffffff:
1546 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1547 dl_inc = find_file('dlfcn.h', [], inc_dirs)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001548 if (dl_inc is not None) and (host_platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001549 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001550 else:
1551 missing.append('dl')
1552 else:
1553 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001554
Thomas Hellercf567c12006-03-08 19:51:58 +00001555 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001556 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001557
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001558 # Richard Oudkerk's multiprocessing module
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001559 if host_platform == 'win32': # Windows
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001560 macros = dict()
1561 libraries = ['ws2_32']
1562
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001563 elif host_platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001564 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001565 libraries = []
1566
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001567 elif host_platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001568 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001569 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001570
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001571 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001572 # FreeBSD's P1003.1b semaphore support is very experimental
1573 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001574 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001575 libraries = []
1576
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001577 elif host_platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001578 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001579 libraries = []
1580
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001581 elif host_platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001582 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001583 libraries = []
1584
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001585 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001586 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001587 libraries = ['rt']
1588
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001589 if host_platform == 'win32':
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001590 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1591 '_multiprocessing/semaphore.c',
1592 '_multiprocessing/pipe_connection.c',
1593 '_multiprocessing/socket_connection.c',
1594 '_multiprocessing/win32_functions.c'
1595 ]
1596
1597 else:
1598 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1599 '_multiprocessing/socket_connection.c'
1600 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001601 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001602 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001603 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1604
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001605 if sysconfig.get_config_var('WITH_THREAD'):
1606 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1607 define_macros=macros.items(),
1608 include_dirs=["Modules/_multiprocessing"]))
1609 else:
1610 missing.append('_multiprocessing')
1611
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001612 # End multiprocessing
1613
1614
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001615 # Platform-specific libraries
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001616 if host_platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001617 # Linux-specific modules
1618 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001619 else:
1620 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001621
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001622 if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Matthias Klose8a96d202010-04-21 22:18:52 +00001623 'freebsd7', 'freebsd8')
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001624 or host_platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001625 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001626 else:
1627 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001628
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001629 if host_platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001630 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001631 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001632 else:
1633 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001634
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001635 if host_platform == 'darwin':
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001636 # _scproxy
1637 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1638 extra_link_args= [
1639 '-framework', 'SystemConfiguration',
1640 '-framework', 'CoreFoundation'
1641 ]))
1642
1643
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001644 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001645 sysconfig.get_config_var("CONFIG_ARGS")):
1646
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001647 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001648 # We're on Mac OS X 10.4 or later, the compiler should
1649 # support '-Wno-deprecated-declarations'. This will
Martin Panter99496762016-08-20 08:00:53 +00001650 # suppress deprecation warnings for the Carbon extensions,
Ronald Oussoren090f8152006-03-30 20:18:33 +00001651 # these extensions wrap the Carbon APIs and even those
1652 # parts that are deprecated.
1653 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1654 else:
1655 carbon_extra_compile_args = []
1656
Just van Rossum05ced6a2002-11-24 23:15:57 +00001657 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001658 def macSrcExists(name1, name2=''):
1659 if not name1:
1660 return None
1661 names = (name1,)
1662 if name2:
1663 names = (name1, name2)
1664 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1665 return os.path.exists(path)
1666
1667 def addMacExtension(name, kwds, extra_srcs=[]):
1668 dirname = ''
1669 if name[0] == '_':
1670 dirname = name[1:].lower()
1671 cname = name + '.c'
1672 cmodulename = name + 'module.c'
1673 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1674 if macSrcExists(cname):
1675 srcs = [cname]
1676 elif macSrcExists(cmodulename):
1677 srcs = [cmodulename]
1678 elif macSrcExists(dirname, cname):
1679 # XXX(nnorwitz): If all the names ended with module, we
1680 # wouldn't need this condition. ibcarbon is the only one.
1681 srcs = [os.path.join(dirname, cname)]
1682 elif macSrcExists(dirname, cmodulename):
1683 srcs = [os.path.join(dirname, cmodulename)]
1684 else:
1685 raise RuntimeError("%s not found" % name)
1686
1687 # Here's the whole point: add the extension with sources
1688 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1689
1690 # Core Foundation
1691 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1692 'extra_link_args': ['-framework', 'CoreFoundation'],
1693 }
1694 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1695 addMacExtension('autoGIL', core_kwds)
1696
Ronald Oussoren51f06332009-09-20 10:31:22 +00001697
1698
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001699 # Carbon
1700 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1701 'extra_link_args': ['-framework', 'Carbon'],
1702 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001703 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1704 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001705 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001706 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001707 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001708 '_Help', '_Icn', '_IBCarbon', '_List',
1709 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001710 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001711 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001712 for name in CARBON_EXTS:
1713 addMacExtension(name, carbon_kwds)
1714
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001715 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1716 # The _Win extension should build just like the other Carbon extensions, but
1717 # this actually results in a hard crash of the linker.
1718 #
1719 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1720 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1721 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1722 }
1723 addMacExtension('_Win', win_kwds)
1724 else:
1725 addMacExtension('_Win', carbon_kwds)
1726
1727
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001728 # Application Services & QuickTime
1729 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1730 'extra_link_args': ['-framework','ApplicationServices'],
1731 }
1732 addMacExtension('_Launch', app_kwds)
1733 addMacExtension('_CG', app_kwds)
1734
Just van Rossum05ced6a2002-11-24 23:15:57 +00001735 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001736 extra_compile_args=carbon_extra_compile_args,
1737 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001738 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001739
Michael W. Hudson5b109102002-01-23 15:04:41 +00001740
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001741 self.extensions.extend(exts)
1742
1743 # Call the method for detecting whether _tkinter can be compiled
1744 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001745
Skip Montanarod1287322007-03-06 15:41:38 +00001746 if '_tkinter' not in [e.name for e in self.extensions]:
1747 missing.append('_tkinter')
1748
Georg Brandl28523642013-10-13 23:38:44 +02001749## # Uncomment these lines if you want to play with xxmodule.c
1750## ext = Extension('xx', ['xxmodule.c'])
1751## self.extensions.append(ext)
1752
Skip Montanarod1287322007-03-06 15:41:38 +00001753 return missing
1754
Ned Deilya2a9f572013-10-25 00:30:10 -07001755 def detect_tkinter_explicitly(self):
1756 # Build _tkinter using explicit locations for Tcl/Tk.
1757 #
1758 # This is enabled when both arguments are given to ./configure:
1759 #
1760 # --with-tcltk-includes="-I/path/to/tclincludes \
1761 # -I/path/to/tkincludes"
1762 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1763 # -L/path/to/tklibs -ltkm.n"
1764 #
Martin Panter8d496ad2016-06-02 10:35:44 +00001765 # These values can also be specified or overridden via make:
Ned Deilya2a9f572013-10-25 00:30:10 -07001766 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1767 #
1768 # This can be useful for building and testing tkinter with multiple
1769 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1770 # build of Tcl so you need to specify both arguments and use care when
1771 # overriding.
1772
1773 # The _TCLTK variables are created in the Makefile sharedmods target.
1774 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1775 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1776 if not (tcltk_includes and tcltk_libs):
1777 # Resume default configuration search.
1778 return 0
1779
1780 extra_compile_args = tcltk_includes.split()
1781 extra_link_args = tcltk_libs.split()
1782 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1783 define_macros=[('WITH_APPINIT', 1)],
1784 extra_compile_args = extra_compile_args,
1785 extra_link_args = extra_link_args,
1786 )
1787 self.extensions.append(ext)
1788 return 1
1789
Jack Jansen0b06be72002-06-21 14:48:38 +00001790 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1791 # The _tkinter module, using frameworks. Since frameworks are quite
1792 # different the UNIX search logic is not sharable.
1793 from os.path import join, exists
1794 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001795 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001796 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001797 join(os.getenv('HOME'), '/Library/Frameworks')
1798 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001799
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001800 sysroot = macosx_sdk_root()
1801
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001802 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001803 # bundles.
1804 # XXX distutils should support -F!
1805 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001806 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001807
1808
Jack Jansen0b06be72002-06-21 14:48:38 +00001809 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001810 if is_macosx_sdk_path(F):
1811 if not exists(join(sysroot, F[1:], fw + '.framework')):
1812 break
1813 else:
1814 if not exists(join(F, fw + '.framework')):
1815 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001816 else:
1817 # ok, F is now directory with both frameworks. Continure
1818 # building
1819 break
1820 else:
1821 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1822 # will now resume.
1823 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001824
Jack Jansen0b06be72002-06-21 14:48:38 +00001825 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1826 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001827 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001828 #
1829 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001830 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001831 for fw in 'Tcl', 'Tk'
1832 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1833 ]
1834
Tim Peters2c60f7a2003-01-29 03:49:43 +00001835 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001836 # complicated search, this is a hard-coded path. It could bail out
1837 # if X11 libs are not found...
1838 include_dirs.append('/usr/X11R6/include')
1839 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1840
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001841 # All existing framework builds of Tcl/Tk don't support 64-bit
1842 # architectures.
1843 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1844 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001845
1846 if is_macosx_sdk_path(F):
1847 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1848 else:
1849 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1850
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001851 detected_archs = []
1852 for ln in fp:
1853 a = ln.split()[-1]
1854 if a in archs:
1855 detected_archs.append(ln.split()[-1])
1856 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001857
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001858 for a in detected_archs:
1859 frameworks.append('-arch')
1860 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001861
Jack Jansen0b06be72002-06-21 14:48:38 +00001862 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1863 define_macros=[('WITH_APPINIT', 1)],
1864 include_dirs = include_dirs,
1865 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001866 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001867 extra_link_args = frameworks,
1868 )
1869 self.extensions.append(ext)
1870 return 1
1871
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001872 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001873 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001874
Ned Deilya2a9f572013-10-25 00:30:10 -07001875 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1876 # configured or passed into the make target. If so, use these values
1877 # to build tkinter and bypass the searches for Tcl and TK in standard
1878 # locations.
1879 if self.detect_tkinter_explicitly():
1880 return
1881
Jack Jansen0b06be72002-06-21 14:48:38 +00001882 # Rather than complicate the code below, detecting and building
1883 # AquaTk is a separate method. Only one Tkinter will be built on
1884 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001885 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001886 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001887 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001888
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001889 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001890 # The versions with dots are used on Unix, and the versions without
1891 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001892 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001893 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1894 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001895 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001896 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001897 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001898 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001899 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001900 # Exit the loop when we've found the Tcl/Tk libraries
1901 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001902
Fredrik Lundhade711a2001-01-24 08:00:28 +00001903 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001904 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001905 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001906 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001907 dotversion = version
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001908 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001909 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1910 # but the include subdirs are named like .../include/tcl8.3.
1911 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1912 tcl_include_sub = []
1913 tk_include_sub = []
1914 for dir in inc_dirs:
1915 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1916 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1917 tk_include_sub += tcl_include_sub
1918 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1919 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001920
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001921 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001922 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001923 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001924 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001925
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001926 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001927
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001928 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1929 for dir in tcl_includes + tk_includes:
1930 if dir not in include_dirs:
1931 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001932
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001933 # Check for various platform-specific directories
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001934 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001935 include_dirs.append('/usr/openwin/include')
1936 added_lib_dirs.append('/usr/openwin/lib')
1937 elif os.path.exists('/usr/X11R6/include'):
1938 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001939 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001940 added_lib_dirs.append('/usr/X11R6/lib')
1941 elif os.path.exists('/usr/X11R5/include'):
1942 include_dirs.append('/usr/X11R5/include')
1943 added_lib_dirs.append('/usr/X11R5/lib')
1944 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001945 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001946 include_dirs.append('/usr/X11/include')
1947 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001948
Jason Tishler9181c942003-02-05 15:16:17 +00001949 # If Cygwin, then verify that X is installed before proceeding
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001950 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001951 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1952 if x11_inc is None:
1953 return
1954
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001955 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001956 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001957 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001958 defs.append( ('WITH_BLT', 1) )
1959 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001960 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001961 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001962 defs.append( ('WITH_BLT', 1) )
1963 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001964
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001965 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001966 libs.append('tk'+ version)
1967 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001968
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001969 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001970 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001971
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001972 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001973 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001974 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001975
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001976 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1977 define_macros=[('WITH_APPINIT', 1)] + defs,
1978 include_dirs = include_dirs,
1979 libraries = libs,
1980 library_dirs = added_lib_dirs,
1981 )
1982 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001983
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001984 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001985 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001986 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001987 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001988 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001989 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001990 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001991
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001992 def configure_ctypes_darwin(self, ext):
1993 # Darwin (OS X) uses preconfigured files, in
1994 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001995 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001996 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1997 '_ctypes', 'libffi_osx'))
1998 sources = [os.path.join(ffi_srcdir, p)
1999 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00002000 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002001 'x86/x86-darwin.S',
2002 'x86/x86-ffi_darwin.c',
2003 'x86/x86-ffi64.c',
2004 'powerpc/ppc-darwin.S',
2005 'powerpc/ppc-darwin_closure.S',
2006 'powerpc/ppc-ffi_darwin.c',
2007 'powerpc/ppc64-darwin_closure.S',
2008 ]]
2009
2010 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002011 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002012
2013 include_dirs = [os.path.join(ffi_srcdir, 'include'),
2014 os.path.join(ffi_srcdir, 'powerpc')]
2015 ext.include_dirs.extend(include_dirs)
2016 ext.sources.extend(sources)
2017 return True
2018
Thomas Hellereba43c12006-04-07 19:04:09 +00002019 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002020 if not self.use_system_libffi:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002021 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002022 return self.configure_ctypes_darwin(ext)
2023
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00002024 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002025 ffi_builddir = os.path.join(self.build_temp, 'libffi')
2026 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
2027 '_ctypes', 'libffi'))
2028 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00002029
Thomas Heller5e218b42006-04-27 15:50:42 +00002030 from distutils.dep_util import newer_group
2031
2032 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00002033 for fname in os.listdir(ffi_srcdir)
2034 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00002035 if self.force or newer_group(config_sources,
2036 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002037 from distutils.dir_util import mkpath
2038 mkpath(ffi_builddir)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002039 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
2040 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes6fd32482012-09-06 18:02:49 +02002041 if not self.verbose:
2042 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00002043
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002044 # Pass empty CFLAGS because we'll just append the resulting
2045 # CFLAGS to Python's; -g or -O2 is to be avoided.
2046 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
2047 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00002048
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002049 res = os.system(cmd)
2050 if res or not os.path.exists(ffi_configfile):
2051 print "Failed to configure _ctypes module"
2052 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00002053
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002054 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00002055 with open(ffi_configfile) as f:
2056 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00002057
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002058 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002059 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00002060
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002061 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00002062 ffi_builddir,
2063 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002064 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00002065
Antoine Pitrou8c510e72010-01-13 11:47:49 +00002066 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
2067 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002068 ext.include_dirs.extend(include_dirs)
2069 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00002070 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00002071
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002072 def detect_ctypes(self, inc_dirs, lib_dirs):
2073 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00002074 include_dirs = []
2075 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00002076 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002077 sources = ['_ctypes/_ctypes.c',
2078 '_ctypes/callbacks.c',
2079 '_ctypes/callproc.c',
2080 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00002081 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002082 depends = ['_ctypes/ctypes.h']
2083
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002084 if host_platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00002085 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00002086 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002087 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002088 include_dirs.append('_ctypes/darwin')
2089# XXX Is this still needed?
2090## extra_link_args.extend(['-read_only_relocs', 'warning'])
2091
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002092 elif host_platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00002093 # XXX This shouldn't be necessary; it appears that some
2094 # of the assembler code is non-PIC (i.e. it has relocations
2095 # when it shouldn't. The proper fix would be to rewrite
2096 # the assembler code to be PIC.
2097 # This only works with GCC; the Sun compiler likely refuses
2098 # this option. If you want to compile ctypes with the Sun
2099 # compiler, please research a proper solution, instead of
2100 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00002101 extra_link_args.append('-mimpure-text')
2102
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002103 elif host_platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00002104 extra_link_args.append('-fPIC')
2105
Thomas Hellercf567c12006-03-08 19:51:58 +00002106 ext = Extension('_ctypes',
2107 include_dirs=include_dirs,
2108 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00002109 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002110 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002111 sources=sources,
2112 depends=depends)
2113 ext_test = Extension('_ctypes_test',
2114 sources=['_ctypes/_ctypes_test.c'])
2115 self.extensions.extend([ext, ext_test])
2116
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002117 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
2118 return
2119
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002120 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002121 # OS X 10.5 comes with libffi.dylib; the include files are
2122 # in /usr/include/ffi
2123 inc_dirs.append('/usr/include/ffi')
2124
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002125 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00002126 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002127 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002128 if ffi_inc is not None:
2129 ffi_h = ffi_inc[0] + '/ffi.h'
Christian Heimes37471dc2016-09-18 14:40:15 +02002130 with open(ffi_h) as f:
2131 for line in f:
2132 line = line.strip()
2133 if line.startswith(('#define LIBFFI_H',
2134 '#define ffi_wrapper_h')):
2135 break
2136 else:
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002137 ffi_inc = None
Christian Heimes37471dc2016-09-18 14:40:15 +02002138 print('Header file {} does not define LIBFFI_H or '
2139 'ffi_wrapper_h'.format(ffi_h))
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002140 ffi_lib = None
2141 if ffi_inc is not None:
2142 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002143 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002144 ffi_lib = lib_name
2145 break
2146
2147 if ffi_inc and ffi_lib:
2148 ext.include_dirs.extend(ffi_inc)
2149 ext.libraries.append(ffi_lib)
2150 self.use_system_libffi = True
2151
Christian Heimes4bb9b9a2018-02-25 12:31:17 +01002152 if sysconfig.get_config_var('HAVE_LIBDL'):
2153 # for dlopen, see bpo-32647
2154 ext.libraries.append('dl')
2155
Christian Heimes38487a02018-01-27 09:39:39 +01002156 def _detect_nis(self, inc_dirs, lib_dirs):
2157 if host_platform in {'win32', 'cygwin', 'qnx6'}:
2158 return None
2159
2160 libs = []
2161 library_dirs = []
2162 includes_dirs = []
2163
2164 # bpo-32521: glibc has deprecated Sun RPC for some time. Fedora 28
2165 # moved headers and libraries to libtirpc and libnsl. The headers
2166 # are in tircp and nsl sub directories.
2167 rpcsvc_inc = find_file(
2168 'rpcsvc/yp_prot.h', inc_dirs,
2169 [os.path.join(inc_dir, 'nsl') for inc_dir in inc_dirs]
2170 )
2171 rpc_inc = find_file(
2172 'rpc/rpc.h', inc_dirs,
2173 [os.path.join(inc_dir, 'tirpc') for inc_dir in inc_dirs]
2174 )
2175 if rpcsvc_inc is None or rpc_inc is None:
2176 # not found
2177 return None
2178 includes_dirs.extend(rpcsvc_inc)
2179 includes_dirs.extend(rpc_inc)
2180
2181 if self.compiler.find_library_file(lib_dirs, 'nsl'):
2182 libs.append('nsl')
2183 else:
2184 # libnsl-devel: check for libnsl in nsl/ subdirectory
2185 nsl_dirs = [os.path.join(lib_dir, 'nsl') for lib_dir in lib_dirs]
2186 libnsl = self.compiler.find_library_file(nsl_dirs, 'nsl')
2187 if libnsl is not None:
2188 library_dirs.append(os.path.dirname(libnsl))
2189 libs.append('nsl')
2190
2191 if self.compiler.find_library_file(lib_dirs, 'tirpc'):
2192 libs.append('tirpc')
2193
2194 return Extension(
2195 'nis', ['nismodule.c'],
2196 libraries=libs,
2197 library_dirs=library_dirs,
2198 include_dirs=includes_dirs
2199 )
2200
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002201
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002202class PyBuildInstall(install):
2203 # Suppress the warning about installation into the lib_dynload
2204 # directory, which is not in sys.path when running Python during
2205 # installation:
2206 def initialize_options (self):
2207 install.initialize_options(self)
2208 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002209
Michael W. Hudson529a5052002-12-17 16:47:17 +00002210class PyBuildInstallLib(install_lib):
2211 # Do exactly what install_lib does but make sure correct access modes get
2212 # set on installed directories and files. All installed files with get
2213 # mode 644 unless they are a shared library in which case they will get
2214 # mode 755. All installed directories will get mode 755.
2215
2216 so_ext = sysconfig.get_config_var("SO")
2217
2218 def install(self):
2219 outfiles = install_lib.install(self)
2220 self.set_file_modes(outfiles, 0644, 0755)
2221 self.set_dir_modes(self.install_dir, 0755)
2222 return outfiles
2223
2224 def set_file_modes(self, files, defaultMode, sharedLibMode):
2225 if not self.is_chmod_supported(): return
2226 if not files: return
2227
2228 for filename in files:
2229 if os.path.islink(filename): continue
2230 mode = defaultMode
2231 if filename.endswith(self.so_ext): mode = sharedLibMode
2232 log.info("changing mode of %s to %o", filename, mode)
2233 if not self.dry_run: os.chmod(filename, mode)
2234
2235 def set_dir_modes(self, dirname, mode):
2236 if not self.is_chmod_supported(): return
2237 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2238
2239 def set_dir_modes_visitor(self, mode, dirname, names):
2240 if os.path.islink(dirname): return
2241 log.info("changing mode of %s to %o", dirname, mode)
2242 if not self.dry_run: os.chmod(dirname, mode)
2243
2244 def is_chmod_supported(self):
2245 return hasattr(os, 'chmod')
2246
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002247SUMMARY = """
2248Python is an interpreted, interactive, object-oriented programming
2249language. It is often compared to Tcl, Perl, Scheme or Java.
2250
2251Python combines remarkable power with very clear syntax. It has
2252modules, classes, exceptions, very high level dynamic data types, and
2253dynamic typing. There are interfaces to many system calls and
2254libraries, as well as to various windowing systems (X11, Motif, Tk,
2255Mac, MFC). New built-in modules are easily written in C or C++. Python
2256is also usable as an extension language for applications that need a
2257programmable interface.
2258
2259The Python implementation is portable: it runs on many brands of UNIX,
2260on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2261listed here, it may still be supported, if there's a C compiler for
2262it. Ask around on comp.lang.python -- or just try compiling Python
2263yourself.
2264"""
2265
2266CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002267Development Status :: 6 - Mature
2268License :: OSI Approved :: Python Software Foundation License
2269Natural Language :: English
2270Programming Language :: C
2271Programming Language :: Python
2272Topic :: Software Development
2273"""
2274
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002275def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002276 # turn off warnings when deprecated modules are imported
2277 import warnings
2278 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002279 setup(# PyPI Metadata (PEP 301)
2280 name = "Python",
2281 version = sys.version.split()[0],
2282 url = "http://www.python.org/%s" % sys.version[:3],
2283 maintainer = "Guido van Rossum and the Python community",
2284 maintainer_email = "python-dev@python.org",
2285 description = "A high-level object-oriented programming language",
2286 long_description = SUMMARY.strip(),
2287 license = "PSF license",
2288 classifiers = filter(None, CLASSIFIERS.split("\n")),
2289 platforms = ["Many"],
2290
2291 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002292 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2293 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002294 # The struct module is defined here, because build_ext won't be
2295 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002296 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002297
2298 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002299 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002300 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002301 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002302 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002303
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002304# --install-platlib
2305if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002306 main()