blob: 998fd3b2db95801137afbbc3c539579bd2c59b1b [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
Brett Cannon84667c02004-12-07 03:25:18 +00004import sys, os, imp, re, optparse
Christian Heimesaf98da12008-01-27 15:18:18 +00005from glob import glob
Tarek Ziadéedacea32010-01-29 11:41:03 +00006import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +00007
8from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +00009from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000010from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000011from distutils.core import Extension, setup
12from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000013from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000014from distutils.command.install_lib import install_lib
Georg Brandlff52f762010-12-28 09:51:43 +000015from distutils.command.build_scripts import build_scripts
Stefan Krah095b2732010-06-08 13:41:44 +000016from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000017
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020018def get_platform():
19 # Get value of sys.platform
20 if sys.platform.startswith('osf1'):
21 return 'osf1'
22 return sys.platform
23host_platform = get_platform()
24
Gregory P. Smithb04ded42010-01-03 00:38:10 +000025# Were we compiled --with-pydebug or with #define Py_DEBUG?
26COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
27
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000028# This global variable is used to hold the list of modules to be disabled.
29disabled_module_list = []
30
Antoine Pitroue9b428f2010-08-13 22:25:01 +000031# File which contains the directory for shared mods (for sys.path fixup
32# when running from the build dir, see Modules/getpath.c)
33_BUILDDIR_COOKIE = "pybuilddir.txt"
34
Michael W. Hudson39230b32002-01-16 15:26:48 +000035def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000036 """Add the directory 'dir' to the list 'dirlist' (after any relative
37 directories) if:
38
Michael W. Hudson39230b32002-01-16 15:26:48 +000039 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000040 2) 'dir' actually exists, and is a directory.
41 """
42 if dir is None or not os.path.isdir(dir) or dir in dirlist:
43 return
44 for i, path in enumerate(dirlist):
45 if not os.path.isabs(path):
46 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000047 return
48 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +000049
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000050def macosx_sdk_root():
51 """
52 Return the directory of the current OSX SDK,
53 or '/' if no SDK was specified.
54 """
55 cflags = sysconfig.get_config_var('CFLAGS')
56 m = re.search(r'-isysroot\s+(\S+)', cflags)
57 if m is None:
58 sysroot = '/'
59 else:
60 sysroot = m.group(1)
61 return sysroot
62
63def is_macosx_sdk_path(path):
64 """
65 Returns True if 'path' can be located in an OSX SDK
66 """
Ronald Oussorendc969e52010-06-27 12:37:46 +000067 return (path.startswith('/usr/') and not path.startswith('/usr/local')) or path.startswith('/System/')
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000068
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000069def find_file(filename, std_dirs, paths):
70 """Searches for the directory where a given file is located,
71 and returns a possibly-empty list of additional directories, or None
72 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000073
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000074 'filename' is the name of a file, such as readline.h or libcrypto.a.
75 'std_dirs' is the list of standard system directories; if the
76 file is found in one of them, no additional directives are needed.
77 'paths' is a list of additional locations to check; if the file is
78 found in one of them, the resulting list will contain the directory.
79 """
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020080 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000081 # Honor the MacOSX SDK setting when one was specified.
82 # An SDK is a directory with the same structure as a real
83 # system, but with only header files and libraries.
84 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000085
86 # Check the standard locations
87 for dir in std_dirs:
88 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000089
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020090 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000091 f = os.path.join(sysroot, dir[1:], filename)
92
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000093 if os.path.exists(f): return []
94
95 # Check the additional directories
96 for dir in paths:
97 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000098
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020099 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000100 f = os.path.join(sysroot, dir[1:], filename)
101
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000102 if os.path.exists(f):
103 return [dir]
104
105 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000106 return None
107
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000108def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000109 result = compiler.find_library_file(std_dirs + paths, libname)
110 if result is None:
111 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000112
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200113 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000114 sysroot = macosx_sdk_root()
115
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000116 # Check whether the found file is in one of the standard directories
117 dirname = os.path.dirname(result)
118 for p in std_dirs:
119 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000120 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000121
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200122 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000123 if os.path.join(sysroot, p[1:]) == dirname:
124 return [ ]
125
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000126 if p == dirname:
127 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000128
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000129 # Otherwise, it must have been in one of the additional directories,
130 # so we have to figure out which one.
131 for p in paths:
132 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000133 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000134
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200135 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000136 if os.path.join(sysroot, p[1:]) == dirname:
137 return [ p ]
138
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000139 if p == dirname:
140 return [p]
141 else:
142 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000143
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000144def module_enabled(extlist, modname):
145 """Returns whether the module 'modname' is present in the list
146 of extensions 'extlist'."""
147 extlist = [ext for ext in extlist if ext.name == modname]
148 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000149
Jack Jansen144ebcc2001-08-05 22:31:19 +0000150def find_module_file(module, dirlist):
151 """Find a module in a set of possible folders. If it is not found
152 return the unadorned filename"""
153 list = find_file(module, [], dirlist)
154 if not list:
155 return module
156 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000157 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000158 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000159
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000160class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000161
Guido van Rossumd8faa362007-04-27 19:54:29 +0000162 def __init__(self, dist):
163 build_ext.__init__(self, dist)
164 self.failed = []
165
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000166 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000167
168 # Detect which modules should be compiled
Antoine Pitrou327fd402010-09-04 16:28:00 +0000169 old_so = self.compiler.shared_lib_extension
170 # Workaround PEP 3149 stuff
171 self.compiler.shared_lib_extension = os.environ.get("SO", ".so")
172 try:
173 missing = self.detect_modules()
174 finally:
175 self.compiler.shared_lib_extension = old_so
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000176
177 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000178 extensions = [ext for ext in self.extensions
179 if ext.name not in disabled_module_list]
180 # move ctypes to the end, it depends on other modules
181 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
182 if "_ctypes" in ext_map:
183 ctypes = extensions.pop(ext_map["_ctypes"])
184 extensions.append(ctypes)
185 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000186
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000187 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000188 # with Modules/.
189 srcdir = sysconfig.get_config_var('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000190 if not srcdir:
191 # Maybe running on Windows but not using CYGWIN?
192 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer4d491a52009-02-06 00:27:50 +0000193 srcdir = os.path.abspath(srcdir)
Neil Schemenauer014bf282009-02-05 16:35:45 +0000194 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000195
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000196 # Fix up the paths for scripts, too
197 self.distribution.scripts = [os.path.join(srcdir, filename)
198 for filename in self.distribution.scripts]
199
Christian Heimesaf98da12008-01-27 15:18:18 +0000200 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000201 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100202 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000203
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000204 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000205 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000206 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000207 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000208 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000209 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000210 else:
211 ext.depends = []
212 # re-compile extensions if a header file has been changed
213 ext.depends.extend(headers)
214
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000215 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000216 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000217 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000218 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000219
Ronald Oussoren94f25282010-05-05 19:11:21 +0000220 # Parse Modules/Setup and Modules/Setup.local to figure out which
221 # modules are turned on in the file.
222 remove_modules = []
223 for filename in ('Modules/Setup', 'Modules/Setup.local'):
224 input = text_file.TextFile(filename, join_lines=1)
225 while 1:
226 line = input.readline()
227 if not line: break
228 line = line.split()
229 remove_modules.append(line[0])
230 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000231
Ronald Oussoren94f25282010-05-05 19:11:21 +0000232 for ext in self.extensions[:]:
233 if ext.name in remove_modules:
234 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000235
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000236 # When you run "make CC=altcc" or something similar, you really want
237 # those environment variables passed into the setup.py phase. Here's
238 # a small set of useful ones.
239 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000240 args = {}
241 # unfortunately, distutils doesn't let us provide separate C and C++
242 # compilers
243 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000244 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
245 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000246 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000247
Antoine Pitroue9b428f2010-08-13 22:25:01 +0000248 # Not only do we write the builddir cookie, but we manually install
249 # the shared modules directory if it isn't already in sys.path.
250 # Otherwise trying to import the extensions after building them
251 # will fail.
252 with open(_BUILDDIR_COOKIE, "wb") as f:
253 f.write(self.build_lib.encode('utf-8', 'surrogateescape'))
Matthias Klose73117292010-08-23 16:47:09 +0000254 abs_build_lib = os.path.join(os.getcwd(), self.build_lib)
Antoine Pitroue9b428f2010-08-13 22:25:01 +0000255 if abs_build_lib not in sys.path:
256 sys.path.append(abs_build_lib)
257
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000258 build_ext.build_extensions(self)
259
Guido van Rossumd8faa362007-04-27 19:54:29 +0000260 longest = max([len(e.name) for e in self.extensions])
261 if self.failed:
262 longest = max(longest, max([len(name) for name in self.failed]))
263
264 def print_three_column(lst):
265 lst.sort(key=str.lower)
266 # guarantee zip() doesn't drop anything
267 while len(lst) % 3:
268 lst.append("")
269 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
270 print("%-*s %-*s %-*s" % (longest, e, longest, f,
271 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000272
273 if missing:
274 print()
Benjamin Petersonda10d3b2009-01-01 00:23:30 +0000275 print("Python build finished, but the necessary bits to build "
276 "these modules were not found:")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277 print_three_column(missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000278 print("To find the necessary bits, look in setup.py in"
279 " detect_modules() for the module's name.")
280 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000281
282 if self.failed:
283 failed = self.failed[:]
284 print()
285 print("Failed to build these modules:")
286 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000287 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000288
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000289 def build_extension(self, ext):
290
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000291 if ext.name == '_ctypes':
292 if not self.configure_ctypes(ext):
293 return
294
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000295 try:
296 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000297 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000298 self.announce('WARNING: building of extension "%s" failed: %s' %
299 (ext.name, sys.exc_info()[1]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000300 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000301 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000302 # Workaround for Mac OS X: The Carbon-based modules cannot be
303 # reliably imported into a command-line Python
304 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000305 self.announce(
306 'WARNING: skipping import check for Carbon-based "%s"' %
307 ext.name)
308 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000309
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200310 if host_platform == 'darwin' and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000311 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000312 # Don't bother doing an import check when an extension was
313 # build with an explicit '-arch' flag on OSX. That's currently
314 # only used to build 32-bit only extensions in a 4-way
315 # universal build and loading 32-bit code into a 64-bit
316 # process will fail.
317 self.announce(
318 'WARNING: skipping import check for "%s"' %
319 ext.name)
320 return
321
Jason Tishler24cf7762002-05-22 16:46:15 +0000322 # Workaround for Cygwin: Cygwin currently has fork issues when many
323 # modules have been imported
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200324 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000325 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
326 % ext.name)
327 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000328 ext_filename = os.path.join(
329 self.build_lib,
330 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000331
332 # If the build directory didn't exist when setup.py was
333 # started, sys.path_importer_cache has a negative result
334 # cached. Clear that cache before trying to import.
335 sys.path_importer_cache.clear()
336
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000337 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000338 imp.load_dynamic(ext.name, ext_filename)
Guido van Rossumb940e112007-01-10 16:19:56 +0000339 except ImportError as why:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000340 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000341 self.announce('*** WARNING: renaming "%s" since importing it'
342 ' failed: %s' % (ext.name, why), level=3)
343 assert not self.inplace
344 basename, tail = os.path.splitext(ext_filename)
345 newname = basename + "_failed" + tail
346 if os.path.exists(newname):
347 os.remove(newname)
348 os.rename(ext_filename, newname)
349
350 # XXX -- This relies on a Vile HACK in
351 # distutils.command.build_ext.build_extension(). The
352 # _built_objects attribute is stored there strictly for
353 # use here.
354 # If there is a failure, _built_objects may not be there,
355 # so catch the AttributeError and move on.
356 try:
357 for filename in self._built_objects:
358 os.remove(filename)
359 except AttributeError:
360 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000361 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000362 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000363 self.announce('*** WARNING: importing extension "%s" '
364 'failed with %s: %s' % (ext.name, exc_type, why),
365 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000366 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000367
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400368 def add_multiarch_paths(self):
369 # Debian/Ubuntu multiarch support.
370 # https://wiki.ubuntu.com/MultiarchSpec
Barry Warsaw88e19452011-04-07 10:40:36 -0400371 if not find_executable('dpkg-architecture'):
372 return
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400373 tmpfile = os.path.join(self.build_temp, 'multiarch')
374 if not os.path.exists(self.build_temp):
375 os.makedirs(self.build_temp)
376 ret = os.system(
377 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
378 tmpfile)
379 try:
380 if ret >> 8 == 0:
381 with open(tmpfile) as fp:
382 multiarch_path_component = fp.readline().strip()
383 add_dir_to_list(self.compiler.library_dirs,
384 '/usr/lib/' + multiarch_path_component)
385 add_dir_to_list(self.compiler.include_dirs,
386 '/usr/include/' + multiarch_path_component)
387 finally:
388 os.unlink(tmpfile)
389
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000390 def detect_modules(self):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000391 # Ensure that /usr/local is always used, but the local build
392 # directories (i.e. '.' and 'Include') must be first. See issue
393 # 10520.
Tarek Ziadé36797272010-07-22 12:50:05 +0000394 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
395 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400396 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000397
Brett Cannon516592f2004-12-07 00:42:59 +0000398 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000399 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000400 # We must get the values from the Makefile and not the environment
401 # directly since an inconsistently reproducible issue comes up where
402 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000403 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000404 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000405 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
406 ('LDFLAGS', '-L', self.compiler.library_dirs),
407 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000408 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000409 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000410 # To prevent optparse from raising an exception about any
Skip Montanaroa5c2a512008-10-07 02:51:48 +0000411 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000412 # all double dashes and any dashes followed by a character
413 # that is not for the option we are dealing with.
414 #
415 # Please note that order of the regex is important! We must
416 # strip out double-dashes first so that we don't end up with
417 # substituting "--Long" to "-Long" and thus lead to "ong" being
418 # used for a library directory.
Guido van Rossum04110fb2007-08-24 16:32:05 +0000419 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
420 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000421 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000422 # Make sure that allowing args interspersed with options is
423 # allowed
424 parser.allow_interspersed_args = True
425 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000426 parser.add_option(arg_name, dest="dirs", action="append")
427 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000428 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000429 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000430 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000431
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100432 if os.path.normpath(sys.base_prefix) != '/usr' \
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000433 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
434 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
435 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
436 # building a framework with different architectures than
437 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000438 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000439 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000440 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000441 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000442
443 # lib_dirs and inc_dirs are used to search for files;
444 # if a file is found in one of those directories, it can
445 # be assumed that no additional -I,-L directives are needed.
Tarek Ziadé36797272010-07-22 12:50:05 +0000446 lib_dirs = self.compiler.library_dirs + [
Martin v. Löwisfba73692004-11-13 11:13:35 +0000447 '/lib64', '/usr/lib64',
448 '/lib', '/usr/lib',
449 ]
Tarek Ziadé36797272010-07-22 12:50:05 +0000450 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000451 exts = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000452 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000453
Brett Cannon4454a1f2005-04-15 20:32:39 +0000454 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000455 with open(config_h) as file:
456 config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000457
Neil Schemenauer014bf282009-02-05 16:35:45 +0000458 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000459
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000460 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200461 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000462 lib_dirs += ['/usr/ccs/lib']
463
Charles-François Natali5739e102012-04-12 19:07:25 +0200464 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200465 if host_platform == 'hp-ux11':
Charles-François Natali5739e102012-04-12 19:07:25 +0200466 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
467
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200468 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +0000469 # This should work on any unixy platform ;-)
470 # If the user has bothered specifying additional -I and -L flags
471 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000472 #
473 # NOTE: using shlex.split would technically be more correct, but
474 # also gives a bootstrap problem. Let's hope nobody uses
475 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000476 cflags, ldflags = sysconfig.get_config_vars(
477 'CFLAGS', 'LDFLAGS')
478 for item in cflags.split():
479 if item.startswith('-I'):
480 inc_dirs.append(item[2:])
481
482 for item in ldflags.split():
483 if item.startswith('-L'):
484 lib_dirs.append(item[2:])
485
Fredrik Lundhade711a2001-01-24 08:00:28 +0000486 # Check for MacOS X, which doesn't need libm.a at all
487 math_libs = ['m']
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200488 if host_platform == 'darwin':
Fredrik Lundhade711a2001-01-24 08:00:28 +0000489 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000490
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000491 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
492
493 #
494 # The following modules are all pretty straightforward, and compile
495 # on pretty much any POSIXish platform.
496 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000497
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000498 # array objects
499 exts.append( Extension('array', ['arraymodule.c']) )
500 # complex math library functions
Mark Dickinsonf3718592009-12-21 15:27:41 +0000501 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
502 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000503 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000504 # math library functions, e.g. sin()
Mark Dickinson664b5112009-12-16 20:23:42 +0000505 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson8a591132009-12-17 08:35:56 +0000506 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000507 libraries=math_libs) )
Victor Stinnere0be4232011-10-25 13:06:09 +0200508
509 # time libraries: librt may be needed for clock_gettime()
510 time_libs = []
511 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
512 if lib:
513 time_libs.append(lib)
514
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000515 # time operations and variables
Victor Stinner5d272cc2012-03-13 13:35:55 +0100516 exts.append( Extension('time', ['timemodule.c'],
Victor Stinnere0be4232011-10-25 13:06:09 +0200517 libraries=time_libs) )
Victor Stinner5d272cc2012-03-13 13:35:55 +0100518 exts.append( Extension('_datetime', ['_datetimemodule.c']) )
Christian Heimesfe337bf2008-03-23 21:54:12 +0000519 # random number generator implemented in C
520 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000521 # bisect
522 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000523 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000524 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000525 # C-optimized pickle replacement
526 exts.append( Extension("_pickle", ["_pickle.c"]) )
Collin Winter670e6922007-03-21 02:57:17 +0000527 # atexit
528 exts.append( Extension("atexit", ["atexitmodule.c"]) )
Christian Heimes90540002008-05-08 14:29:10 +0000529 # _json speedups
530 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000531 # Python C API test module
Mark Dickinsona06f44b2009-02-10 16:18:22 +0000532 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
533 depends=['testcapi_long.h']) )
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100534 # Python PEP-3118 (buffer protocol) test module
535 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
Fred Drake0e474a82007-10-11 18:01:43 +0000536 # profiler (_lsprof is for cProfile.py)
Armin Rigoa871ef22006-02-08 12:53:56 +0000537 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000538 # static Unicode character database
Walter Dörwalde9eaab42007-05-22 16:02:13 +0000539 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000540
541 # Modules with some UNIX dependencies -- on by default:
542 # (If you have a really backward UNIX, select and socket may not be
543 # supported...)
544
545 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000546 libs = []
547 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
548 # May be necessary on AIX for flock function
549 libs = ['bsd']
550 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren94f25282010-05-05 19:11:21 +0000551 # pwd(3)
552 exts.append( Extension('pwd', ['pwdmodule.c']) )
553 # grp(3)
554 exts.append( Extension('grp', ['grpmodule.c']) )
555 # spwd, shadow passwords
556 if (config_h_vars.get('HAVE_GETSPNAM', False) or
557 config_h_vars.get('HAVE_GETSPENT', False)):
558 exts.append( Extension('spwd', ['spwdmodule.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000559 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000560 missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000561
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000562 # select(2); not on ancient System V
563 exts.append( Extension('select', ['selectmodule.c']) )
564
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000565 # Fred Drake's interface to the Python parser
566 exts.append( Extension('parser', ['parsermodule.c']) )
567
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000568 # Memory-mapped files (also works on Win32).
Ronald Oussoren94f25282010-05-05 19:11:21 +0000569 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000570
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000571 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000572 # syslog daemon interface
573 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000574
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000575 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000576 # Here ends the simple stuff. From here on, modules need certain
577 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000578 #
579
580 # Multimedia modules
581 # These don't work for 64-bit platforms!!!
582 # These represent audio samples or images as strings:
583
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000584 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000585 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000586 # 64-bit platforms.
587 exts.append( Extension('audioop', ['audioop.c']) )
588
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000589 # readline
Tarek Ziadé36797272010-07-22 12:50:05 +0000590 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000591 readline_termcap_library = ""
592 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200593 # Cannot use os.popen here in py3k.
594 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
595 if not os.path.exists(self.build_temp):
596 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000597 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200598 if do_readline:
Matthias Klosee344eca2012-06-30 18:32:06 +0200599 # FIXME: needs patch from issue #14330
600 cross_compiling = False
doko@ubuntu.com58844492012-06-30 18:25:32 +0200601 if cross_compiling:
602 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
603 % (sysconfig.get_config_var('READELF'),
604 do_readline, tmpfile))
605 elif find_executable('ldd'):
606 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
607 else:
608 ret = 256
Stefan Krahf4e7a352010-07-17 11:46:52 +0000609 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000610 with open(tmpfile) as fp:
611 for ln in fp:
612 if 'curses' in ln:
613 readline_termcap_library = re.sub(
614 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
615 ).rstrip()
616 break
617 # termcap interface split out from ncurses
618 if 'tinfo' in ln:
619 readline_termcap_library = 'tinfo'
620 break
Stefan Krah095b2732010-06-08 13:41:44 +0000621 os.unlink(tmpfile)
622 # Issue 7384: If readline is already linked against curses,
623 # use the same library for the readline and curses modules.
624 if 'curses' in readline_termcap_library:
625 curses_library = readline_termcap_library
Tarek Ziadé36797272010-07-22 12:50:05 +0000626 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000627 curses_library = 'ncursesw'
Tarek Ziadé36797272010-07-22 12:50:05 +0000628 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000629 curses_library = 'ncurses'
Tarek Ziadé36797272010-07-22 12:50:05 +0000630 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000631 curses_library = 'curses'
632
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200633 if host_platform == 'darwin':
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000634 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000635 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
636 if dep_target and dep_target.split('.') < ['10', '5']:
637 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000638 if os_release < 9:
639 # MacOSX 10.4 has a broken readline. Don't try to build
640 # the readline module unless the user has installed a fixed
641 # readline package
642 if find_file('readline/rlconf.h', inc_dirs, []) is None:
643 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000644 if do_readline:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200645 if host_platform == 'darwin' and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000646 # In every directory on the search path search for a dynamic
647 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000648 # for dynamic libraries on the entire path.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000649 # This way a staticly linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000650 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000651 readline_extra_link_args = ('-Wl,-search_paths_first',)
652 else:
653 readline_extra_link_args = ()
654
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000655 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000656 if readline_termcap_library:
657 pass # Issue 7384: Already linked against curses or tinfo.
658 elif curses_library:
659 readline_libs.append(curses_library)
Tarek Ziadé36797272010-07-22 12:50:05 +0000660 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000661 ['/usr/lib/termcap'],
662 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000663 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000664 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000665 library_dirs=['/usr/lib/termcap'],
Thomas Wouters477c8d52006-05-27 19:21:47 +0000666 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000667 libraries=readline_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000668 else:
669 missing.append('readline')
670
Ronald Oussoren94f25282010-05-05 19:11:21 +0000671 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000672
Tarek Ziadé36797272010-07-22 12:50:05 +0000673 if self.compiler.find_library_file(lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000674 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000675 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000676 libs = []
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000677 exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000678
Skip Montanaroba9e9782003-03-20 23:34:22 +0000679 # CSV files
680 exts.append( Extension('_csv', ['_csv.c']) )
681
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000682 # POSIX subprocess module helper.
683 exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
684
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000685 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000686 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000687 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000688 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000689 search_for_ssl_incs_in = [
690 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000691 '/usr/contrib/ssl/include/'
692 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000693 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
694 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000695 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000696 if ssl_incs is not None:
697 krb5_h = find_file('krb5.h', inc_dirs,
698 ['/usr/kerberos/include'])
699 if krb5_h:
700 ssl_incs += krb5_h
Tarek Ziadé36797272010-07-22 12:50:05 +0000701 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000702 ['/usr/local/ssl/lib',
703 '/usr/contrib/ssl/lib/'
704 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000705
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000706 if (ssl_incs is not None and
707 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000708 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000709 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000710 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000711 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000712 depends = ['socketmodule.h']), )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000713 else:
714 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000715
Gregory P. Smithade97332005-08-23 21:19:40 +0000716 # find out which version of OpenSSL we have
717 openssl_ver = 0
718 openssl_ver_re = re.compile(
719 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000720
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000721 # look for the openssl version header on the compiler search path.
722 opensslv_h = find_file('openssl/opensslv.h', [],
723 inc_dirs + search_for_ssl_incs_in)
724 if opensslv_h:
725 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200726 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000727 name = os.path.join(macosx_sdk_root(), name[1:])
728 try:
Brett Cannon9f5db072010-10-29 20:19:27 +0000729 with open(name, 'r') as incfile:
730 for line in incfile:
731 m = openssl_ver_re.match(line)
732 if m:
733 openssl_ver = eval(m.group(1))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000734 except IOError as msg:
735 print("IOError while reading opensshv.h:", msg)
736 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000737
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000738 #print('openssl_ver = 0x%08x' % openssl_ver)
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000739 min_openssl_ver = 0x00907000
740 have_any_openssl = ssl_incs is not None and ssl_libs is not None
741 have_usable_openssl = (have_any_openssl and
742 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000743
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000744 if have_any_openssl:
745 if have_usable_openssl:
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000746 # The _hashlib module wraps optimized implementations
747 # of hash functions from the OpenSSL library.
748 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
Gregory P. Smith5af7fba2010-01-03 14:51:13 +0000749 depends = ['hashlib.h'],
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000750 include_dirs = ssl_incs,
751 library_dirs = ssl_libs,
752 libraries = ['ssl', 'crypto']) )
753 else:
754 print("warning: openssl 0x%08x is too old for _hashlib" %
755 openssl_ver)
756 missing.append('_hashlib')
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000757
Antoine Pitrou019ff192012-05-16 16:41:26 +0200758 # We always compile these even when OpenSSL is available (issue #14693).
759 # It's harmless and the object code is tiny (40-50 KB per module,
760 # only loaded when actually used).
761 exts.append( Extension('_sha256', ['sha256module.c'],
762 depends=['hashlib.h']) )
763 exts.append( Extension('_sha512', ['sha512module.c'],
764 depends=['hashlib.h']) )
765 exts.append( Extension('_md5', ['md5module.c'],
766 depends=['hashlib.h']) )
767 exts.append( Extension('_sha1', ['sha1module.c'],
768 depends=['hashlib.h']) )
Gregory P. Smith2f21eb32007-09-09 06:44:34 +0000769
Georg Brandl489cb4f2009-07-11 10:08:49 +0000770 # Modules that provide persistent dictionary-like semantics. You will
771 # probably want to arrange for at least one of them to be available on
772 # your machine, though none are defined by default because of library
773 # dependencies. The Python module dbm/__init__.py provides an
774 # implementation independent wrapper for these; dbm/dumb.py provides
775 # similar functionality (but slower of course) implemented in Python.
776
777 # Sleepycat^WOracle Berkeley DB interface.
778 # http://www.oracle.com/database/berkeley-db/db/index.html
779 #
780 # This requires the Sleepycat^WOracle DB code. The supported versions
781 # are set below. Visit the URL above to download
782 # a release. Most open source OSes come with one or more
783 # versions of BerkeleyDB already installed.
784
Matthias Klose8690ae52010-10-17 13:22:33 +0000785 max_db_ver = (5, 1)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000786 min_db_ver = (3, 3)
787 db_setup_debug = False # verbose debug prints from this script?
788
789 def allow_db_ver(db_ver):
790 """Returns a boolean if the given BerkeleyDB version is acceptable.
791
792 Args:
793 db_ver: A tuple of the version to verify.
794 """
795 if not (min_db_ver <= db_ver <= max_db_ver):
796 return False
797 return True
798
799 def gen_db_minor_ver_nums(major):
800 if major == 4:
801 for x in range(max_db_ver[1]+1):
802 if allow_db_ver((4, x)):
803 yield x
804 elif major == 3:
805 for x in (3,):
806 if allow_db_ver((3, x)):
807 yield x
808 else:
809 raise ValueError("unknown major BerkeleyDB version", major)
810
811 # construct a list of paths to look for the header file in on
812 # top of the normal inc_dirs.
813 db_inc_paths = [
814 '/usr/include/db4',
815 '/usr/local/include/db4',
816 '/opt/sfw/include/db4',
817 '/usr/include/db3',
818 '/usr/local/include/db3',
819 '/opt/sfw/include/db3',
820 # Fink defaults (http://fink.sourceforge.net/)
821 '/sw/include/db4',
822 '/sw/include/db3',
823 ]
824 # 4.x minor number specific paths
825 for x in gen_db_minor_ver_nums(4):
826 db_inc_paths.append('/usr/include/db4%d' % x)
827 db_inc_paths.append('/usr/include/db4.%d' % x)
828 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
829 db_inc_paths.append('/usr/local/include/db4%d' % x)
830 db_inc_paths.append('/pkg/db-4.%d/include' % x)
831 db_inc_paths.append('/opt/db-4.%d/include' % x)
832 # MacPorts default (http://www.macports.org/)
833 db_inc_paths.append('/opt/local/include/db4%d' % x)
834 # 3.x minor number specific paths
835 for x in gen_db_minor_ver_nums(3):
836 db_inc_paths.append('/usr/include/db3%d' % x)
837 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
838 db_inc_paths.append('/usr/local/include/db3%d' % x)
839 db_inc_paths.append('/pkg/db-3.%d/include' % x)
840 db_inc_paths.append('/opt/db-3.%d/include' % x)
841
842 # Add some common subdirectories for Sleepycat DB to the list,
843 # based on the standard include directories. This way DB3/4 gets
844 # picked up when it is installed in a non-standard prefix and
845 # the user has added that prefix into inc_dirs.
846 std_variants = []
847 for dn in inc_dirs:
848 std_variants.append(os.path.join(dn, 'db3'))
849 std_variants.append(os.path.join(dn, 'db4'))
850 for x in gen_db_minor_ver_nums(4):
851 std_variants.append(os.path.join(dn, "db4%d"%x))
852 std_variants.append(os.path.join(dn, "db4.%d"%x))
853 for x in gen_db_minor_ver_nums(3):
854 std_variants.append(os.path.join(dn, "db3%d"%x))
855 std_variants.append(os.path.join(dn, "db3.%d"%x))
856
857 db_inc_paths = std_variants + db_inc_paths
858 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
859
860 db_ver_inc_map = {}
861
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200862 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000863 sysroot = macosx_sdk_root()
864
Georg Brandl489cb4f2009-07-11 10:08:49 +0000865 class db_found(Exception): pass
866 try:
867 # See whether there is a Sleepycat header in the standard
868 # search path.
869 for d in inc_dirs + db_inc_paths:
870 f = os.path.join(d, "db.h")
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200871 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000872 f = os.path.join(sysroot, d[1:], "db.h")
873
Georg Brandl489cb4f2009-07-11 10:08:49 +0000874 if db_setup_debug: print("db: looking for db.h in", f)
875 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +0000876 with open(f, 'rb') as file:
877 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +0000878 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000879 if m:
880 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +0000881 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000882 db_minor = int(m.group(1))
883 db_ver = (db_major, db_minor)
884
885 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
886 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +0000887 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000888 db_patch = int(m.group(1))
889 if db_patch < 21:
890 print("db.h:", db_ver, "patch", db_patch,
891 "being ignored (4.6.x must be >= 4.6.21)")
892 continue
893
894 if ( (db_ver not in db_ver_inc_map) and
895 allow_db_ver(db_ver) ):
896 # save the include directory with the db.h version
897 # (first occurrence only)
898 db_ver_inc_map[db_ver] = d
899 if db_setup_debug:
900 print("db.h: found", db_ver, "in", d)
901 else:
902 # we already found a header for this library version
903 if db_setup_debug: print("db.h: ignoring", d)
904 else:
905 # ignore this header, it didn't contain a version number
906 if db_setup_debug:
907 print("db.h: no version number version in", d)
908
909 db_found_vers = list(db_ver_inc_map.keys())
910 db_found_vers.sort()
911
912 while db_found_vers:
913 db_ver = db_found_vers.pop()
914 db_incdir = db_ver_inc_map[db_ver]
915
916 # check lib directories parallel to the location of the header
917 db_dirs_to_check = [
918 db_incdir.replace("include", 'lib64'),
919 db_incdir.replace("include", 'lib'),
920 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000921
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200922 if host_platform != 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000923 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
924
925 else:
926 # Same as other branch, but takes OSX SDK into account
927 tmp = []
928 for dn in db_dirs_to_check:
929 if is_macosx_sdk_path(dn):
930 if os.path.isdir(os.path.join(sysroot, dn[1:])):
931 tmp.append(dn)
932 else:
933 if os.path.isdir(dn):
934 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +0000935 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000936
937 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +0000938
Ezio Melotti42da6632011-03-15 05:18:48 +0200939 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +0000940 # XXX should we -ever- look for a dbX name? Do any
941 # systems really not name their library by version and
942 # symlink to more general names?
943 for dblib in (('db-%d.%d' % db_ver),
944 ('db%d%d' % db_ver),
945 ('db%d' % db_ver[0])):
946 dblib_file = self.compiler.find_library_file(
947 db_dirs_to_check + lib_dirs, dblib )
948 if dblib_file:
949 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
950 raise db_found
951 else:
952 if db_setup_debug: print("db lib: ", dblib, "not found")
953
954 except db_found:
955 if db_setup_debug:
956 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
957 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
958 db_incs = [db_incdir]
959 dblibs = [dblib]
960 else:
961 if db_setup_debug: print("db: no appropriate library found")
962 db_incs = None
963 dblibs = []
964 dblib_dir = None
965
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000966 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +0000967 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000968
969 # We hunt for #define SQLITE_VERSION "n.n.n"
970 # We need to find >= sqlite version 3.0.8
971 sqlite_incdir = sqlite_libdir = None
972 sqlite_inc_paths = [ '/usr/include',
973 '/usr/include/sqlite',
974 '/usr/include/sqlite3',
975 '/usr/local/include',
976 '/usr/local/include/sqlite',
977 '/usr/local/include/sqlite3',
978 ]
979 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
980 MIN_SQLITE_VERSION = ".".join([str(x)
981 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +0000982
983 # Scan the default include directories before the SQLite specific
984 # ones. This allows one to override the copy of sqlite on OSX,
985 # where /usr/include contains an old version of sqlite.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200986 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000987 sysroot = macosx_sdk_root()
988
Thomas Wouters477c8d52006-05-27 19:21:47 +0000989 for d in inc_dirs + sqlite_inc_paths:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000990 f = os.path.join(d, "sqlite3.h")
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000991
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200992 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000993 f = os.path.join(sysroot, d[1:], "sqlite3.h")
994
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000995 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +0000996 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +0000997 with open(f) as file:
998 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000999 m = re.search(
1000 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
1001 if m:
1002 sqlite_version = m.group(1)
1003 sqlite_version_tuple = tuple([int(x)
1004 for x in sqlite_version.split(".")])
1005 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1006 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001007 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001008 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001009 sqlite_incdir = d
1010 break
1011 else:
1012 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001013 print("%s: version %d is too old, need >= %s"%(d,
1014 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001015 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001016 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001017
1018 if sqlite_incdir:
1019 sqlite_dirs_to_check = [
1020 os.path.join(sqlite_incdir, '..', 'lib64'),
1021 os.path.join(sqlite_incdir, '..', 'lib'),
1022 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1023 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1024 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001025 sqlite_libfile = self.compiler.find_library_file(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001026 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001027 if sqlite_libfile:
1028 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001029
1030 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001031 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001032 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001033 '_sqlite/cursor.c',
1034 '_sqlite/microprotocols.c',
1035 '_sqlite/module.c',
1036 '_sqlite/prepare_protocol.c',
1037 '_sqlite/row.c',
1038 '_sqlite/statement.c',
1039 '_sqlite/util.c', ]
1040
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001041 sqlite_defines = []
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001042 if host_platform != "win32":
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001043 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1044 else:
1045 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1046
Benjamin Peterson076ed002010-10-31 17:11:02 +00001047 # Enable support for loadable extensions in the sqlite3 module
1048 # if --enable-loadable-sqlite-extensions configure option is used.
1049 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1050 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001051
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001052 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +00001053 # In every directory on the search path search for a dynamic
1054 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001055 # for dynamic libraries on the entire path.
1056 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001057 # before the dynamic library in /usr/lib.
1058 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1059 else:
1060 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001061
Brett Cannonc5011fe2011-06-06 20:09:10 -07001062 include_dirs = ["Modules/_sqlite"]
1063 # Only include the directory where sqlite was found if it does
1064 # not already exist in set include directories, otherwise you
1065 # can end up with a bad search path order.
1066 if sqlite_incdir not in self.compiler.include_dirs:
1067 include_dirs.append(sqlite_incdir)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001068 exts.append(Extension('_sqlite3', sqlite_srcs,
1069 define_macros=sqlite_defines,
Brett Cannonc5011fe2011-06-06 20:09:10 -07001070 include_dirs=include_dirs,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001071 library_dirs=sqlite_libdir,
1072 runtime_library_dirs=sqlite_libdir,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001073 extra_link_args=sqlite_extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001074 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001075 else:
1076 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001077
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001078 dbm_setup_debug = False # verbose debug prints from this script?
Benjamin Petersond78735d2010-01-01 16:04:23 +00001079 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001080 # The standard Unix dbm module:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001081 if host_platform not in ['cygwin']:
Matthias Klose55708cc2009-04-30 08:06:49 +00001082 config_args = [arg.strip("'")
1083 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersond78735d2010-01-01 16:04:23 +00001084 dbm_args = [arg for arg in config_args
Matthias Klose55708cc2009-04-30 08:06:49 +00001085 if arg.startswith('--with-dbmliborder=')]
1086 if dbm_args:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001087 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001088 else:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001089 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001090 dbmext = None
1091 for cand in dbm_order:
1092 if cand == "ndbm":
1093 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan50f147a2012-06-17 18:27:11 +10001094 # Some systems have -lndbm, others have -lgdbm_compat,
1095 # others don't have either
Tarek Ziadé36797272010-07-22 12:50:05 +00001096 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001097 'ndbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001098 ndbm_libs = ['ndbm']
Nick Coghlan50f147a2012-06-17 18:27:11 +10001099 elif self.compiler.find_library_file(lib_dirs,
1100 'gdbm_compat'):
1101 ndbm_libs = ['gdbm_compat']
Matthias Klose55708cc2009-04-30 08:06:49 +00001102 else:
1103 ndbm_libs = []
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001104 if dbm_setup_debug: print("building dbm using ndbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001105 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1106 define_macros=[
1107 ('HAVE_NDBM_H',None),
1108 ],
1109 libraries=ndbm_libs)
1110 break
1111
1112 elif cand == "gdbm":
Tarek Ziadé36797272010-07-22 12:50:05 +00001113 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001114 gdbm_libs = ['gdbm']
Tarek Ziadé36797272010-07-22 12:50:05 +00001115 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001116 'gdbm_compat'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001117 gdbm_libs.append('gdbm_compat')
1118 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001119 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001120 dbmext = Extension(
1121 '_dbm', ['_dbmmodule.c'],
1122 define_macros=[
1123 ('HAVE_GDBM_NDBM_H', None),
1124 ],
1125 libraries = gdbm_libs)
1126 break
1127 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001128 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001129 dbmext = Extension(
1130 '_dbm', ['_dbmmodule.c'],
1131 define_macros=[
1132 ('HAVE_GDBM_DASH_NDBM_H', None),
1133 ],
1134 libraries = gdbm_libs)
1135 break
Georg Brandl489cb4f2009-07-11 10:08:49 +00001136 elif cand == "bdb":
1137 if db_incs is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001138 if dbm_setup_debug: print("building dbm using bdb")
Georg Brandl489cb4f2009-07-11 10:08:49 +00001139 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1140 library_dirs=dblib_dir,
1141 runtime_library_dirs=dblib_dir,
1142 include_dirs=db_incs,
1143 define_macros=[
1144 ('HAVE_BERKDB_H', None),
1145 ('DB_DBM_HSEARCH', None),
1146 ],
1147 libraries=dblibs)
Matthias Klose55708cc2009-04-30 08:06:49 +00001148 break
1149 if dbmext is not None:
1150 exts.append(dbmext)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001151 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001152 missing.append('_dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001153
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001154 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001155 if ('gdbm' in dbm_order and
Tarek Ziadé36797272010-07-22 12:50:05 +00001156 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001157 exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001158 libraries = ['gdbm'] ) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001159 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001160 missing.append('_gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001161
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001162 # Unix-only modules
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001163 if host_platform != 'win32':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001164 # Steen Lumholt's termios module
1165 exts.append( Extension('termios', ['termios.c']) )
1166 # Jeremy Hylton's rlimit interface
Antoine Pitrou6103ab12009-10-24 20:11:21 +00001167 exts.append( Extension('resource', ['resource.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001168
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001169 # Sun yellow pages. Some systems have the functions in libc.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001170 if (host_platform not in ['cygwin', 'qnx6'] and
Benjamin Peterson588009e2009-12-30 03:03:54 +00001171 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé36797272010-07-22 12:50:05 +00001172 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001173 libs = ['nsl']
1174 else:
1175 libs = []
1176 exts.append( Extension('nis', ['nismodule.c'],
1177 libraries = libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001178 else:
1179 missing.append('nis')
1180 else:
1181 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001182
Skip Montanaro72092942004-02-07 12:50:19 +00001183 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001184 # provided by the ncurses library.
Victor Stinneraa35b002011-11-29 00:08:12 +01001185 curses_defines = []
Victor Stinner756c6ec2011-11-27 00:19:53 +01001186 curses_includes = []
Victor Stinneraa35b002011-11-29 00:08:12 +01001187 panel_library = 'panel'
1188 if curses_library == 'ncursesw':
1189 curses_defines.append(('HAVE_NCURSESW', '1'))
1190 curses_includes.append('/usr/include/ncursesw')
1191 # Bug 1464056: If _curses.so links with ncursesw,
1192 # _curses_panel.so must link with panelw.
1193 panel_library = 'panelw'
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001194 if host_platform == 'darwin':
Ned Deily69192232012-06-20 23:47:14 -07001195 # On OS X, there is no separate /usr/lib/libncursesw nor
1196 # libpanelw. If we are here, we found a locally-supplied
1197 # version of libncursesw. There should be also be a
1198 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1199 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1200 # ncurses wide char support
1201 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001202 elif host_platform == 'darwin' and curses_library == 'ncurses':
Ned Deily69192232012-06-20 23:47:14 -07001203 # Building with the system-suppied combined libncurses/libpanel
1204 curses_defines.append(('HAVE_NCURSESW', '1'))
1205 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Victor Stinneraa35b002011-11-29 00:08:12 +01001206
Stefan Krah095b2732010-06-08 13:41:44 +00001207 if curses_library.startswith('ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001208 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001209 exts.append( Extension('_curses', ['_cursesmodule.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001210 include_dirs=curses_includes,
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001211 define_macros=curses_defines,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001212 libraries = curses_libs) )
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001213 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001214 # OSX has an old Berkeley curses, not good enough for
1215 # the _curses module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001216 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001217 curses_libs = ['curses', 'terminfo']
Tarek Ziadé36797272010-07-22 12:50:05 +00001218 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001219 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001220 else:
1221 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001222
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001223 exts.append( Extension('_curses', ['_cursesmodule.c'],
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001224 define_macros=curses_defines,
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001225 libraries = curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001226 else:
1227 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001228
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001229 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001230 if (module_enabled(exts, '_curses') and
Tarek Ziadé36797272010-07-22 12:50:05 +00001231 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001232 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001233 include_dirs=curses_includes,
Ned Deily69192232012-06-20 23:47:14 -07001234 define_macros=curses_defines,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001235 libraries = [panel_library] + curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001236 else:
1237 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001238
Barry Warsaw259b1e12002-08-13 20:09:26 +00001239 # Andrew Kuchling's zlib module. Note that some versions of zlib
1240 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1241 # http://www.cert.org/advisories/CA-2002-07.html
1242 #
1243 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1244 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1245 # now, we still accept 1.1.3, because we think it's difficult to
1246 # exploit this in Python, and we'd rather make it RedHat's problem
1247 # than our problem <wink>.
1248 #
1249 # You can upgrade zlib to version 1.1.4 yourself by going to
1250 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001251 zlib_inc = find_file('zlib.h', [], inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001252 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001253 if zlib_inc is not None:
1254 zlib_h = zlib_inc[0] + '/zlib.h'
1255 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001256 version_req = '"1.1.3"'
Brett Cannon9f5db072010-10-29 20:19:27 +00001257 with open(zlib_h) as fp:
1258 while 1:
1259 line = fp.readline()
1260 if not line:
1261 break
1262 if line.startswith('#define ZLIB_VERSION'):
1263 version = line.split()[2]
1264 break
Guido van Rossume6970912001-04-15 15:16:12 +00001265 if version >= version_req:
Tarek Ziadé36797272010-07-22 12:50:05 +00001266 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001267 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001268 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1269 else:
1270 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001271 exts.append( Extension('zlib', ['zlibmodule.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001272 libraries = ['z'],
1273 extra_link_args = zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001274 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001275 else:
1276 missing.append('zlib')
1277 else:
1278 missing.append('zlib')
1279 else:
1280 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001281
Christian Heimes1dc54002008-03-24 02:19:29 +00001282 # Helper module for various ascii-encoders. Uses zlib for an optimized
1283 # crc32 if we have it. Otherwise binascii uses its own.
1284 if have_zlib:
1285 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1286 libraries = ['z']
1287 extra_link_args = zlib_extra_link_args
1288 else:
1289 extra_compile_args = []
1290 libraries = []
1291 extra_link_args = []
1292 exts.append( Extension('binascii', ['binascii.c'],
1293 extra_compile_args = extra_compile_args,
1294 libraries = libraries,
1295 extra_link_args = extra_link_args) )
1296
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001297 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001298 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001299 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001300 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1301 else:
1302 bz2_extra_link_args = ()
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001303 exts.append( Extension('_bz2', ['_bz2module.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001304 libraries = ['bz2'],
1305 extra_link_args = bz2_extra_link_args) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001306 else:
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001307 missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001308
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001309 # LZMA compression support.
1310 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1311 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1312 libraries = ['lzma']) )
1313 else:
1314 missing.append('_lzma')
1315
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001316 # Interface to the Expat XML parser
1317 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001318 # Expat was written by James Clark and is now maintained by a group of
1319 # developers on SourceForge; see www.libexpat.org for more information.
1320 # The pyexpat module was written by Paul Prescod after a prototype by
1321 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1322 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001323 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001324 #
1325 # More information on Expat can be found at www.libexpat.org.
1326 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001327 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1328 expat_inc = []
1329 define_macros = []
1330 expat_lib = ['expat']
1331 expat_sources = []
1332 else:
1333 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1334 define_macros = [
1335 ('HAVE_EXPAT_CONFIG_H', '1'),
1336 ]
1337 expat_lib = []
1338 expat_sources = ['expat/xmlparse.c',
1339 'expat/xmlrole.c',
1340 'expat/xmltok.c']
Thomas Wouters477c8d52006-05-27 19:21:47 +00001341
Fred Drake2d59a492003-10-21 15:41:15 +00001342 exts.append(Extension('pyexpat',
1343 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001344 include_dirs = expat_inc,
1345 libraries = expat_lib,
1346 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001347 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001348
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001349 # Fredrik Lundh's cElementTree module. Note that this also
1350 # uses expat (via the CAPI hook in pyexpat).
1351
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001352 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001353 define_macros.append(('USE_PYEXPAT_CAPI', None))
1354 exts.append(Extension('_elementtree',
1355 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001356 include_dirs = expat_inc,
1357 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001358 sources = ['_elementtree.c'],
1359 ))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001360 else:
1361 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001362
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001363 # Hye-Shik Chang's CJKCodecs modules.
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001364 exts.append(Extension('_multibytecodec',
1365 ['cjkcodecs/multibytecodec.c']))
1366 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1367 exts.append(Extension('_codecs_%s' % loc,
1368 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001369
Stefan Krah1919b7e2012-03-21 18:25:23 +01001370 # Stefan Krah's _decimal module
1371 exts.append(self._decimal_ext())
1372
Thomas Hellercf567c12006-03-08 19:51:58 +00001373 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001374 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001375
Benjamin Petersone711caf2008-06-11 16:44:04 +00001376 # Richard Oudkerk's multiprocessing module
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001377 if host_platform == 'win32': # Windows
Benjamin Petersone711caf2008-06-11 16:44:04 +00001378 macros = dict()
1379 libraries = ['ws2_32']
1380
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001381 elif host_platform == 'darwin': # Mac OSX
Benjamin Peterson965ce872009-04-05 21:24:58 +00001382 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001383 libraries = []
1384
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001385 elif host_platform == 'cygwin': # Cygwin
Benjamin Peterson965ce872009-04-05 21:24:58 +00001386 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001387 libraries = []
Benjamin Peterson41181742008-07-02 20:22:54 +00001388
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001389 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Benjamin Peterson41181742008-07-02 20:22:54 +00001390 # FreeBSD's P1003.1b semaphore support is very experimental
1391 # and has many known problems. (as of June 2008)
Benjamin Peterson965ce872009-04-05 21:24:58 +00001392 macros = dict()
Benjamin Peterson41181742008-07-02 20:22:54 +00001393 libraries = []
1394
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001395 elif host_platform.startswith('openbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001396 macros = dict()
Benjamin Petersone5384b02008-10-04 22:00:42 +00001397 libraries = []
1398
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001399 elif host_platform.startswith('netbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001400 macros = dict()
Jesse Noller32d68c22009-03-31 18:48:42 +00001401 libraries = []
1402
Benjamin Petersone711caf2008-06-11 16:44:04 +00001403 else: # Linux and other unices
Benjamin Peterson965ce872009-04-05 21:24:58 +00001404 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001405 libraries = ['rt']
1406
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001407 if host_platform == 'win32':
Benjamin Petersone711caf2008-06-11 16:44:04 +00001408 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1409 '_multiprocessing/semaphore.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001410 ]
1411
1412 else:
1413 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001414 ]
Mark Dickinsona614f042009-11-28 12:48:43 +00001415 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1416 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001417 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1418
Jesse Noller6fd47e22009-01-23 14:09:08 +00001419 if sysconfig.get_config_var('WITH_THREAD'):
1420 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1421 define_macros=list(macros.items()),
1422 include_dirs=["Modules/_multiprocessing"]))
1423 else:
1424 missing.append('_multiprocessing')
Benjamin Petersone711caf2008-06-11 16:44:04 +00001425 # End multiprocessing
Guido van Rossuma9e20242007-03-08 00:43:48 +00001426
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001427 # Platform-specific libraries
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001428 if host_platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001429 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001430 else:
1431 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001432
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001433 if host_platform == 'darwin':
Benjamin Petersonebacd262008-05-29 21:09:51 +00001434 exts.append(
1435 Extension('_gestalt', ['_gestalt.c'],
1436 extra_link_args=['-framework', 'Carbon'])
1437 )
Ronald Oussoren84151202010-04-18 20:46:11 +00001438 exts.append(
1439 Extension('_scproxy', ['_scproxy.c'],
1440 extra_link_args=[
1441 '-framework', 'SystemConfiguration',
1442 '-framework', 'CoreFoundation',
1443 ]))
Benjamin Petersonebacd262008-05-29 21:09:51 +00001444
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001445 self.extensions.extend(exts)
1446
1447 # Call the method for detecting whether _tkinter can be compiled
1448 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001449
Guido van Rossumd8faa362007-04-27 19:54:29 +00001450 if '_tkinter' not in [e.name for e in self.extensions]:
1451 missing.append('_tkinter')
1452
1453 return missing
1454
Jack Jansen0b06be72002-06-21 14:48:38 +00001455 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1456 # The _tkinter module, using frameworks. Since frameworks are quite
1457 # different the UNIX search logic is not sharable.
1458 from os.path import join, exists
1459 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001460 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001461 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001462 join(os.getenv('HOME'), '/Library/Frameworks')
1463 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001464
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001465 sysroot = macosx_sdk_root()
1466
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001467 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001468 # bundles.
1469 # XXX distutils should support -F!
1470 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001471 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001472
1473
Jack Jansen0b06be72002-06-21 14:48:38 +00001474 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001475 if is_macosx_sdk_path(F):
1476 if not exists(join(sysroot, F[1:], fw + '.framework')):
1477 break
1478 else:
1479 if not exists(join(F, fw + '.framework')):
1480 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001481 else:
1482 # ok, F is now directory with both frameworks. Continure
1483 # building
1484 break
1485 else:
1486 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1487 # will now resume.
1488 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001489
Jack Jansen0b06be72002-06-21 14:48:38 +00001490 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1491 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001492 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001493 #
1494 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001495 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001496 for fw in ('Tcl', 'Tk')
1497 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001498 ]
1499
Tim Peters2c60f7a2003-01-29 03:49:43 +00001500 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001501 # complicated search, this is a hard-coded path. It could bail out
1502 # if X11 libs are not found...
1503 include_dirs.append('/usr/X11R6/include')
1504 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1505
Georg Brandlfcaf9102008-07-16 02:17:56 +00001506 # All existing framework builds of Tcl/Tk don't support 64-bit
1507 # architectures.
1508 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1509 archs = re.findall('-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001510
Ronald Oussorend097efe2009-09-15 19:07:58 +00001511 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1512 if not os.path.exists(self.build_temp):
1513 os.makedirs(self.build_temp)
1514
1515 # Note: cannot use os.popen or subprocess here, that
1516 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001517 if is_macosx_sdk_path(F):
1518 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1519 else:
1520 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001521
Brett Cannon9f5db072010-10-29 20:19:27 +00001522 with open(tmpfile) as fp:
1523 detected_archs = []
1524 for ln in fp:
1525 a = ln.split()[-1]
1526 if a in archs:
1527 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001528 os.unlink(tmpfile)
1529
1530 for a in detected_archs:
1531 frameworks.append('-arch')
1532 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001533
Jack Jansen0b06be72002-06-21 14:48:38 +00001534 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1535 define_macros=[('WITH_APPINIT', 1)],
1536 include_dirs = include_dirs,
1537 libraries = [],
Georg Brandlfcaf9102008-07-16 02:17:56 +00001538 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001539 extra_link_args = frameworks,
1540 )
1541 self.extensions.append(ext)
1542 return 1
1543
Tim Peters2c60f7a2003-01-29 03:49:43 +00001544
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001545 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001546 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001547
Jack Jansen0b06be72002-06-21 14:48:38 +00001548 # Rather than complicate the code below, detecting and building
1549 # AquaTk is a separate method. Only one Tkinter will be built on
1550 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001551 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001552 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001553 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001554
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001555 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001556 # The versions with dots are used on Unix, and the versions without
1557 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001558 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001559 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1560 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé36797272010-07-22 12:50:05 +00001561 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001562 'tk' + version)
Tarek Ziadé36797272010-07-22 12:50:05 +00001563 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001564 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001565 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001566 # Exit the loop when we've found the Tcl/Tk libraries
1567 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001568
Fredrik Lundhade711a2001-01-24 08:00:28 +00001569 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001570 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001571 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001572 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001573 dotversion = version
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001574 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001575 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1576 # but the include subdirs are named like .../include/tcl8.3.
1577 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1578 tcl_include_sub = []
1579 tk_include_sub = []
1580 for dir in inc_dirs:
1581 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1582 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1583 tk_include_sub += tcl_include_sub
1584 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1585 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001586
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001587 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001588 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001589 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001590 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001591
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001592 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001593
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001594 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1595 for dir in tcl_includes + tk_includes:
1596 if dir not in include_dirs:
1597 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001598
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001599 # Check for various platform-specific directories
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001600 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001601 include_dirs.append('/usr/openwin/include')
1602 added_lib_dirs.append('/usr/openwin/lib')
1603 elif os.path.exists('/usr/X11R6/include'):
1604 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001605 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001606 added_lib_dirs.append('/usr/X11R6/lib')
1607 elif os.path.exists('/usr/X11R5/include'):
1608 include_dirs.append('/usr/X11R5/include')
1609 added_lib_dirs.append('/usr/X11R5/lib')
1610 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001611 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001612 include_dirs.append('/usr/X11/include')
1613 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001614
Jason Tishler9181c942003-02-05 15:16:17 +00001615 # If Cygwin, then verify that X is installed before proceeding
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001616 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001617 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1618 if x11_inc is None:
1619 return
1620
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001621 # Check for BLT extension
Tarek Ziadé36797272010-07-22 12:50:05 +00001622 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001623 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001624 defs.append( ('WITH_BLT', 1) )
1625 libs.append('BLT8.0')
Tarek Ziadé36797272010-07-22 12:50:05 +00001626 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001627 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001628 defs.append( ('WITH_BLT', 1) )
1629 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001630
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001631 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001632 libs.append('tk'+ version)
1633 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001634
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001635 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001636 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001637
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001638 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001639 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001640 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001641
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001642 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1643 define_macros=[('WITH_APPINIT', 1)] + defs,
1644 include_dirs = include_dirs,
1645 libraries = libs,
1646 library_dirs = added_lib_dirs,
1647 )
1648 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001649
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001650## # Uncomment these lines if you want to play with xxmodule.c
1651## ext = Extension('xx', ['xxmodule.c'])
1652## self.extensions.append(ext)
Antoine Pitrou8c30a712010-12-04 18:36:03 +00001653 if 'd' not in sys.abiflags:
1654 ext = Extension('xxlimited', ['xxlimited.c'],
1655 define_macros=[('Py_LIMITED_API', 1)])
1656 self.extensions.append(ext)
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001657
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001658 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001659 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001660 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001661 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001662 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001663 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001664 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001665
Christian Heimes78644762008-03-04 23:39:23 +00001666 def configure_ctypes_darwin(self, ext):
1667 # Darwin (OS X) uses preconfigured files, in
1668 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauer014bf282009-02-05 16:35:45 +00001669 srcdir = sysconfig.get_config_var('srcdir')
Christian Heimes78644762008-03-04 23:39:23 +00001670 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1671 '_ctypes', 'libffi_osx'))
1672 sources = [os.path.join(ffi_srcdir, p)
1673 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001674 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001675 'x86/x86-darwin.S',
1676 'x86/x86-ffi_darwin.c',
1677 'x86/x86-ffi64.c',
1678 'powerpc/ppc-darwin.S',
1679 'powerpc/ppc-darwin_closure.S',
1680 'powerpc/ppc-ffi_darwin.c',
1681 'powerpc/ppc64-darwin_closure.S',
1682 ]]
1683
1684 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001685 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001686
1687 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1688 os.path.join(ffi_srcdir, 'powerpc')]
1689 ext.include_dirs.extend(include_dirs)
1690 ext.sources.extend(sources)
1691 return True
1692
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001693 def configure_ctypes(self, ext):
1694 if not self.use_system_libffi:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001695 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001696 return self.configure_ctypes_darwin(ext)
1697
Neil Schemenauer014bf282009-02-05 16:35:45 +00001698 srcdir = sysconfig.get_config_var('srcdir')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001699 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1700 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1701 '_ctypes', 'libffi'))
1702 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001703
Thomas Wouters477c8d52006-05-27 19:21:47 +00001704 from distutils.dep_util import newer_group
1705
1706 config_sources = [os.path.join(ffi_srcdir, fname)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001707 for fname in os.listdir(ffi_srcdir)
1708 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001709 if self.force or newer_group(config_sources,
1710 ffi_configfile):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001711 from distutils.dir_util import mkpath
1712 mkpath(ffi_builddir)
1713 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001714
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001715 # Pass empty CFLAGS because we'll just append the resulting
1716 # CFLAGS to Python's; -g or -O2 is to be avoided.
1717 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1718 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001719
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001720 res = os.system(cmd)
1721 if res or not os.path.exists(ffi_configfile):
Guido van Rossum452bf512007-02-09 05:32:43 +00001722 print("Failed to configure _ctypes module")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001723 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001724
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001725 fficonfig = {}
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001726 with open(ffi_configfile) as f:
1727 exec(f.read(), globals(), fficonfig)
Thomas Hellercf567c12006-03-08 19:51:58 +00001728
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001729 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001730 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001731
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001732 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001733 ffi_builddir,
1734 os.path.join(ffi_srcdir, 'src')]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001735 extra_compile_args = fficonfig['ffi_cflags'].split()
1736
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001737 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1738 fficonfig['ffi_sources'])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001739 ext.include_dirs.extend(include_dirs)
1740 ext.extra_compile_args.extend(extra_compile_args)
1741 return True
1742
1743 def detect_ctypes(self, inc_dirs, lib_dirs):
1744 self.use_system_libffi = False
1745 include_dirs = []
1746 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001747 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001748 sources = ['_ctypes/_ctypes.c',
1749 '_ctypes/callbacks.c',
1750 '_ctypes/callproc.c',
1751 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001752 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001753 depends = ['_ctypes/ctypes.h']
1754
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001755 if host_platform == 'darwin':
Ronald Oussoren2decf222010-09-05 18:25:59 +00001756 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001757 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001758 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001759 include_dirs.append('_ctypes/darwin')
1760# XXX Is this still needed?
1761## extra_link_args.extend(['-read_only_relocs', 'warning'])
1762
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001763 elif host_platform == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001764 # XXX This shouldn't be necessary; it appears that some
1765 # of the assembler code is non-PIC (i.e. it has relocations
1766 # when it shouldn't. The proper fix would be to rewrite
1767 # the assembler code to be PIC.
1768 # This only works with GCC; the Sun compiler likely refuses
1769 # this option. If you want to compile ctypes with the Sun
1770 # compiler, please research a proper solution, instead of
1771 # finding some -z option for the Sun compiler.
1772 extra_link_args.append('-mimpure-text')
1773
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001774 elif host_platform.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001775 extra_link_args.append('-fPIC')
1776
Thomas Hellercf567c12006-03-08 19:51:58 +00001777 ext = Extension('_ctypes',
1778 include_dirs=include_dirs,
1779 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001780 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001781 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001782 sources=sources,
1783 depends=depends)
1784 ext_test = Extension('_ctypes_test',
1785 sources=['_ctypes/_ctypes_test.c'])
1786 self.extensions.extend([ext, ext_test])
1787
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001788 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1789 return
1790
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001791 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001792 # OS X 10.5 comes with libffi.dylib; the include files are
1793 # in /usr/include/ffi
1794 inc_dirs.append('/usr/include/ffi')
1795
Benjamin Petersond78735d2010-01-01 16:04:23 +00001796 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001797 if not ffi_inc or ffi_inc[0] == '':
Benjamin Petersond78735d2010-01-01 16:04:23 +00001798 ffi_inc = find_file('ffi.h', [], inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001799 if ffi_inc is not None:
1800 ffi_h = ffi_inc[0] + '/ffi.h'
Brett Cannon9f5db072010-10-29 20:19:27 +00001801 with open(ffi_h) as fp:
1802 while 1:
1803 line = fp.readline()
1804 if not line:
1805 ffi_inc = None
1806 break
1807 if line.startswith('#define LIBFFI_H'):
1808 break
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001809 ffi_lib = None
1810 if ffi_inc is not None:
1811 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé36797272010-07-22 12:50:05 +00001812 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001813 ffi_lib = lib_name
1814 break
1815
1816 if ffi_inc and ffi_lib:
1817 ext.include_dirs.extend(ffi_inc)
1818 ext.libraries.append(ffi_lib)
1819 self.use_system_libffi = True
1820
Stefan Krah1919b7e2012-03-21 18:25:23 +01001821 def _decimal_ext(self):
Stefan Krah60187b52012-03-23 19:06:27 +01001822 extra_compile_args = []
Stefan Krah3746aee2012-06-30 18:20:33 +02001823 undef_macros = ['NDEBUG']
Stefan Krah60187b52012-03-23 19:06:27 +01001824 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
1825 include_dirs = []
1826 libraries = ['mpdec']
1827 sources = ['_decimal/_decimal.c']
1828 depends = ['_decimal/docstrings.h']
1829 else:
Ned Deily458a6fb2012-04-01 02:30:46 -07001830 srcdir = sysconfig.get_config_var('srcdir')
1831 include_dirs = [os.path.abspath(os.path.join(srcdir,
1832 'Modules',
1833 '_decimal',
1834 'libmpdec'))]
Stefan Krah60187b52012-03-23 19:06:27 +01001835 libraries = []
1836 sources = [
1837 '_decimal/_decimal.c',
1838 '_decimal/libmpdec/basearith.c',
1839 '_decimal/libmpdec/constants.c',
1840 '_decimal/libmpdec/context.c',
1841 '_decimal/libmpdec/convolute.c',
1842 '_decimal/libmpdec/crt.c',
1843 '_decimal/libmpdec/difradix2.c',
1844 '_decimal/libmpdec/fnt.c',
1845 '_decimal/libmpdec/fourstep.c',
1846 '_decimal/libmpdec/io.c',
1847 '_decimal/libmpdec/memory.c',
1848 '_decimal/libmpdec/mpdecimal.c',
1849 '_decimal/libmpdec/numbertheory.c',
1850 '_decimal/libmpdec/sixstep.c',
1851 '_decimal/libmpdec/transpose.c',
1852 ]
1853 depends = [
1854 '_decimal/docstrings.h',
1855 '_decimal/libmpdec/basearith.h',
1856 '_decimal/libmpdec/bits.h',
1857 '_decimal/libmpdec/constants.h',
1858 '_decimal/libmpdec/convolute.h',
1859 '_decimal/libmpdec/crt.h',
1860 '_decimal/libmpdec/difradix2.h',
1861 '_decimal/libmpdec/fnt.h',
1862 '_decimal/libmpdec/fourstep.h',
1863 '_decimal/libmpdec/io.h',
1864 '_decimal/libmpdec/memory.h',
1865 '_decimal/libmpdec/mpdecimal.h',
1866 '_decimal/libmpdec/numbertheory.h',
1867 '_decimal/libmpdec/sixstep.h',
1868 '_decimal/libmpdec/transpose.h',
1869 '_decimal/libmpdec/typearith.h',
1870 '_decimal/libmpdec/umodarith.h',
1871 ]
1872
Stefan Krah1919b7e2012-03-21 18:25:23 +01001873 config = {
1874 'x64': [('CONFIG_64','1'), ('ASM','1')],
1875 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
1876 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
1877 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
1878 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
1879 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
1880 ('LEGACY_COMPILER','1')],
1881 'universal': [('UNIVERSAL','1')]
1882 }
1883
Stefan Krah1919b7e2012-03-21 18:25:23 +01001884 cc = sysconfig.get_config_var('CC')
1885 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
1886 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
1887
1888 if machine:
1889 # Override automatic configuration to facilitate testing.
1890 define_macros = config[machine]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001891 elif host_platform == 'darwin':
Stefan Krah1919b7e2012-03-21 18:25:23 +01001892 # Universal here means: build with the same options Python
1893 # was built with.
1894 define_macros = config['universal']
1895 elif sizeof_size_t == 8:
1896 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
1897 define_macros = config['x64']
1898 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
1899 define_macros = config['uint128']
1900 else:
1901 define_macros = config['ansi64']
1902 elif sizeof_size_t == 4:
1903 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
1904 if ppro and ('gcc' in cc or 'clang' in cc) and \
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001905 not 'sunos' in host_platform:
Stefan Krah1919b7e2012-03-21 18:25:23 +01001906 # solaris: problems with register allocation.
1907 # icc >= 11.0 works as well.
1908 define_macros = config['ppro']
1909 else:
1910 define_macros = config['ansi32']
1911 else:
1912 raise DistutilsError("_decimal: unsupported architecture")
1913
1914 # Workarounds for toolchain bugs:
1915 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
1916 # Some versions of gcc miscompile inline asm:
1917 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
1918 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
1919 extra_compile_args.append('-fno-ipa-pure-const')
1920 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
1921 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
1922 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
1923 undef_macros.append('_FORTIFY_SOURCE')
1924
1925 # Faster version without thread local contexts:
1926 if not sysconfig.get_config_var('WITH_THREAD'):
1927 define_macros.append(('WITHOUT_THREADS', 1))
1928
1929 # Uncomment for extra functionality:
1930 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
1931 ext = Extension (
1932 '_decimal',
1933 include_dirs=include_dirs,
Stefan Krah60187b52012-03-23 19:06:27 +01001934 libraries=libraries,
Stefan Krah1919b7e2012-03-21 18:25:23 +01001935 define_macros=define_macros,
1936 undef_macros=undef_macros,
1937 extra_compile_args=extra_compile_args,
1938 sources=sources,
1939 depends=depends
1940 )
1941 return ext
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001942
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001943class PyBuildInstall(install):
1944 # Suppress the warning about installation into the lib_dynload
1945 # directory, which is not in sys.path when running Python during
1946 # installation:
1947 def initialize_options (self):
1948 install.initialize_options(self)
1949 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001950
Éric Araujoe6792c12011-06-09 14:07:02 +02001951 # Customize subcommands to not install an egg-info file for Python
1952 sub_commands = [('install_lib', install.has_lib),
1953 ('install_headers', install.has_headers),
1954 ('install_scripts', install.has_scripts),
1955 ('install_data', install.has_data)]
1956
1957
Michael W. Hudson529a5052002-12-17 16:47:17 +00001958class PyBuildInstallLib(install_lib):
1959 # Do exactly what install_lib does but make sure correct access modes get
1960 # set on installed directories and files. All installed files with get
1961 # mode 644 unless they are a shared library in which case they will get
1962 # mode 755. All installed directories will get mode 755.
1963
1964 so_ext = sysconfig.get_config_var("SO")
1965
1966 def install(self):
1967 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001968 self.set_file_modes(outfiles, 0o644, 0o755)
1969 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00001970 return outfiles
1971
1972 def set_file_modes(self, files, defaultMode, sharedLibMode):
1973 if not self.is_chmod_supported(): return
1974 if not files: return
1975
1976 for filename in files:
1977 if os.path.islink(filename): continue
1978 mode = defaultMode
1979 if filename.endswith(self.so_ext): mode = sharedLibMode
1980 log.info("changing mode of %s to %o", filename, mode)
1981 if not self.dry_run: os.chmod(filename, mode)
1982
1983 def set_dir_modes(self, dirname, mode):
1984 if not self.is_chmod_supported(): return
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00001985 for dirpath, dirnames, fnames in os.walk(dirname):
1986 if os.path.islink(dirpath):
1987 continue
1988 log.info("changing mode of %s to %o", dirpath, mode)
1989 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00001990
1991 def is_chmod_supported(self):
1992 return hasattr(os, 'chmod')
1993
Georg Brandlff52f762010-12-28 09:51:43 +00001994class PyBuildScripts(build_scripts):
1995 def copy_scripts(self):
1996 outfiles, updated_files = build_scripts.copy_scripts(self)
1997 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
1998 minoronly = '.{0[1]}'.format(sys.version_info)
1999 newoutfiles = []
2000 newupdated_files = []
2001 for filename in outfiles:
Vinay Sajip7ded1f02012-05-26 03:45:29 +01002002 if filename.endswith(('2to3', 'pyvenv')):
Georg Brandlff52f762010-12-28 09:51:43 +00002003 newfilename = filename + fullversion
2004 else:
2005 newfilename = filename + minoronly
2006 log.info('renaming {} to {}'.format(filename, newfilename))
2007 os.rename(filename, newfilename)
2008 newoutfiles.append(newfilename)
2009 if filename in updated_files:
2010 newupdated_files.append(newfilename)
2011 return newoutfiles, newupdated_files
2012
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002013SUMMARY = """
2014Python is an interpreted, interactive, object-oriented programming
2015language. It is often compared to Tcl, Perl, Scheme or Java.
2016
2017Python combines remarkable power with very clear syntax. It has
2018modules, classes, exceptions, very high level dynamic data types, and
2019dynamic typing. There are interfaces to many system calls and
2020libraries, as well as to various windowing systems (X11, Motif, Tk,
2021Mac, MFC). New built-in modules are easily written in C or C++. Python
2022is also usable as an extension language for applications that need a
2023programmable interface.
2024
2025The Python implementation is portable: it runs on many brands of UNIX,
2026on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2027listed here, it may still be supported, if there's a C compiler for
2028it. Ask around on comp.lang.python -- or just try compiling Python
2029yourself.
2030"""
2031
2032CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002033Development Status :: 6 - Mature
2034License :: OSI Approved :: Python Software Foundation License
2035Natural Language :: English
2036Programming Language :: C
2037Programming Language :: Python
2038Topic :: Software Development
2039"""
2040
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002041def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002042 # turn off warnings when deprecated modules are imported
2043 import warnings
2044 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002045 setup(# PyPI Metadata (PEP 301)
2046 name = "Python",
2047 version = sys.version.split()[0],
2048 url = "http://www.python.org/%s" % sys.version[:3],
2049 maintainer = "Guido van Rossum and the Python community",
2050 maintainer_email = "python-dev@python.org",
2051 description = "A high-level object-oriented programming language",
2052 long_description = SUMMARY.strip(),
2053 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002054 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002055 platforms = ["Many"],
2056
2057 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002058 cmdclass = {'build_ext': PyBuildExt,
2059 'build_scripts': PyBuildScripts,
2060 'install': PyBuildInstall,
2061 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002062 # The struct module is defined here, because build_ext won't be
2063 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002064 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002065
Georg Brandlff52f762010-12-28 09:51:43 +00002066 # If you change the scripts installed here, you also need to
2067 # check the PyBuildScripts command above, and change the links
2068 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002069 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Éric Araujo859aad62012-06-24 00:07:41 -04002070 "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002071 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002072
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002073# --install-platlib
2074if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002075 main()