blob: ea8a5f51e963128d8e0487d14c54c5ed36d4c54c [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
2#
Fredrik Lundhade711a2001-01-24 08:00:28 +00003
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00004__version__ = "$Revision$"
5
Brett Cannon84667c02004-12-07 03:25:18 +00006import sys, os, imp, re, optparse
Christian Heimes8608d912008-01-25 15:52:11 +00007from glob import glob
Gregory P. Smith0902cac2008-05-27 08:40:09 +00008from platform import machine as platform_machine
Tarek Ziadé5633a802010-01-23 09:23:15 +00009import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +000010
11from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +000012from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000013from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000014from distutils.core import Extension, setup
15from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000016from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000017from distutils.command.install_lib import install_lib
Stefan Krah4d32c9c2010-06-04 09:49:20 +000018from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000019
doko@python.orgd65e2ba2013-01-31 23:52:03 +010020cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
21
22def get_platform():
23 # cross build
24 if "_PYTHON_HOST_PLATFORM" in os.environ:
25 return os.environ["_PYTHON_HOST_PLATFORM"]
26 # Get value of sys.platform
27 if sys.platform.startswith('osf1'):
28 return 'osf1'
29 return sys.platform
30host_platform = get_platform()
31
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000032# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@python.orgd65e2ba2013-01-31 23:52:03 +010033COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000034
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000035# This global variable is used to hold the list of modules to be disabled.
36disabled_module_list = []
37
Michael W. Hudson39230b32002-01-16 15:26:48 +000038def add_dir_to_list(dirlist, dir):
39 """Add the directory 'dir' to the list 'dirlist' (at the front) if
40 1) 'dir' is not already in 'dirlist'
41 2) 'dir' actually exists, and is a directory."""
Jack Jansen4439b7c2002-06-26 15:44:30 +000042 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
Michael W. Hudson39230b32002-01-16 15:26:48 +000043 dirlist.insert(0, dir)
44
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000045def macosx_sdk_root():
46 """
47 Return the directory of the current OSX SDK,
48 or '/' if no SDK was specified.
49 """
50 cflags = sysconfig.get_config_var('CFLAGS')
51 m = re.search(r'-isysroot\s+(\S+)', cflags)
52 if m is None:
53 sysroot = '/'
54 else:
55 sysroot = m.group(1)
56 return sysroot
57
58def is_macosx_sdk_path(path):
59 """
60 Returns True if 'path' can be located in an OSX SDK
61 """
Ned Deilyd8ec4642012-07-30 04:07:49 -070062 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
63 or path.startswith('/System/')
64 or path.startswith('/Library/') )
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000065
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000066def find_file(filename, std_dirs, paths):
67 """Searches for the directory where a given file is located,
68 and returns a possibly-empty list of additional directories, or None
69 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000070
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000071 'filename' is the name of a file, such as readline.h or libcrypto.a.
72 'std_dirs' is the list of standard system directories; if the
73 file is found in one of them, no additional directives are needed.
74 'paths' is a list of additional locations to check; if the file is
75 found in one of them, the resulting list will contain the directory.
76 """
doko@python.orgd65e2ba2013-01-31 23:52:03 +010077 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000078 # Honor the MacOSX SDK setting when one was specified.
79 # An SDK is a directory with the same structure as a real
80 # system, but with only header files and libraries.
81 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000082
83 # Check the standard locations
84 for dir in std_dirs:
85 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000086
doko@python.orgd65e2ba2013-01-31 23:52:03 +010087 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000088 f = os.path.join(sysroot, dir[1:], filename)
89
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000090 if os.path.exists(f): return []
91
92 # Check the additional directories
93 for dir in paths:
94 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000095
doko@python.orgd65e2ba2013-01-31 23:52:03 +010096 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000097 f = os.path.join(sysroot, dir[1:], filename)
98
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000099 if os.path.exists(f):
100 return [dir]
101
102 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000103 return None
104
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000105def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000106 result = compiler.find_library_file(std_dirs + paths, libname)
107 if result is None:
108 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000109
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100110 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000111 sysroot = macosx_sdk_root()
112
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000113 # Check whether the found file is in one of the standard directories
114 dirname = os.path.dirname(result)
115 for p in std_dirs:
116 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000117 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000118
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100119 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000120 if os.path.join(sysroot, p[1:]) == dirname:
121 return [ ]
122
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000123 if p == dirname:
124 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000125
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000126 # Otherwise, it must have been in one of the additional directories,
127 # so we have to figure out which one.
128 for p in paths:
129 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000130 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000131
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100132 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000133 if os.path.join(sysroot, p[1:]) == dirname:
134 return [ p ]
135
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000136 if p == dirname:
137 return [p]
138 else:
139 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000140
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000141def module_enabled(extlist, modname):
142 """Returns whether the module 'modname' is present in the list
143 of extensions 'extlist'."""
144 extlist = [ext for ext in extlist if ext.name == modname]
145 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000146
Jack Jansen144ebcc2001-08-05 22:31:19 +0000147def find_module_file(module, dirlist):
148 """Find a module in a set of possible folders. If it is not found
149 return the unadorned filename"""
150 list = find_file(module, [], dirlist)
151 if not list:
152 return module
153 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000154 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000155 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000156
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000157class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000158
Skip Montanarod1287322007-03-06 15:41:38 +0000159 def __init__(self, dist):
160 build_ext.__init__(self, dist)
161 self.failed = []
162
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000163 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000164
165 # Detect which modules should be compiled
Skip Montanarod1287322007-03-06 15:41:38 +0000166 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000167
168 # Remove modules that are present on the disabled list
Christian Heimesb222bbc2008-01-18 09:51:43 +0000169 extensions = [ext for ext in self.extensions
170 if ext.name not in disabled_module_list]
171 # move ctypes to the end, it depends on other modules
172 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
173 if "_ctypes" in ext_map:
174 ctypes = extensions.pop(ext_map["_ctypes"])
175 extensions.append(ctypes)
176 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000177
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000178 # Fix up the autodetected modules, prefixing all the source files
179 # with Modules/ and adding Python's include directory to the path.
180 (srcdir,) = sysconfig.get_config_vars('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000181 if not srcdir:
182 # Maybe running on Windows but not using CYGWIN?
183 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer0189ddc2009-02-06 00:21:55 +0000184 srcdir = os.path.abspath(srcdir)
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000185 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000186
Jack Jansen144ebcc2001-08-05 22:31:19 +0000187 # Platform-dependent module source and include directories
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000188 incdirlist = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100189
190 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07 +0000191 sysconfig.get_config_var("CONFIG_ARGS")):
Jack Jansen144ebcc2001-08-05 22:31:19 +0000192 # Mac OS X also includes some mac-specific modules
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000193 macmoddir = os.path.join(srcdir, 'Mac/Modules')
Jack Jansen144ebcc2001-08-05 22:31:19 +0000194 moddirlist.append(macmoddir)
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000195 incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000196
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000197 # Fix up the paths for scripts, too
198 self.distribution.scripts = [os.path.join(srcdir, filename)
199 for filename in self.distribution.scripts]
200
Christian Heimes8608d912008-01-25 15:52:11 +0000201 # Python header files
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000202 headers = [sysconfig.get_config_h_filename()]
Stefan Krah4666ebd2012-02-29 14:17:18 +0100203 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
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 Schemenauerc59c5f32009-02-05 16:32:29 +0000208 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000209 for filename in ext.depends]
Christian Heimes8608d912008-01-25 15:52:11 +0000210 else:
211 ext.depends = []
212 # re-compile extensions if a header file has been changed
213 ext.depends.extend(headers)
214
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000215 # platform specific include directories
216 ext.include_dirs.extend(incdirlist)
217
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000218 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000219 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000220 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000221 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000222
Ronald Oussoren9545a232010-05-05 19:09:31 +0000223 # Parse Modules/Setup and Modules/Setup.local to figure out which
224 # modules are turned on in the file.
225 remove_modules = []
226 for filename in ('Modules/Setup', 'Modules/Setup.local'):
227 input = text_file.TextFile(filename, join_lines=1)
228 while 1:
229 line = input.readline()
230 if not line: break
231 line = line.split()
232 remove_modules.append(line[0])
233 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000234
Ronald Oussoren9545a232010-05-05 19:09:31 +0000235 for ext in self.extensions[:]:
236 if ext.name in remove_modules:
237 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000238
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000239 # When you run "make CC=altcc" or something similar, you really want
240 # those environment variables passed into the setup.py phase. Here's
241 # a small set of useful ones.
242 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000243 args = {}
244 # unfortunately, distutils doesn't let us provide separate C and C++
245 # compilers
246 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000247 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
248 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000249 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000250
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000251 build_ext.build_extensions(self)
252
Skip Montanarod1287322007-03-06 15:41:38 +0000253 longest = max([len(e.name) for e in self.extensions])
254 if self.failed:
255 longest = max(longest, max([len(name) for name in self.failed]))
256
257 def print_three_column(lst):
Georg Brandle95cf1c2007-03-06 17:49:14 +0000258 lst.sort(key=str.lower)
Skip Montanarod1287322007-03-06 15:41:38 +0000259 # guarantee zip() doesn't drop anything
260 while len(lst) % 3:
261 lst.append("")
262 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
263 print "%-*s %-*s %-*s" % (longest, e, longest, f,
264 longest, g)
Skip Montanarod1287322007-03-06 15:41:38 +0000265
266 if missing:
267 print
Georg Brandl40f982f2008-12-28 11:58:49 +0000268 print ("Python build finished, but the necessary bits to build "
269 "these modules were not found:")
Skip Montanarod1287322007-03-06 15:41:38 +0000270 print_three_column(missing)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000271 print ("To find the necessary bits, look in setup.py in"
272 " detect_modules() for the module's name.")
273 print
Skip Montanarod1287322007-03-06 15:41:38 +0000274
275 if self.failed:
276 failed = self.failed[:]
277 print
278 print "Failed to build these modules:"
279 print_three_column(failed)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000280 print
Skip Montanarod1287322007-03-06 15:41:38 +0000281
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000282 def build_extension(self, ext):
283
Thomas Hellereba43c12006-04-07 19:04:09 +0000284 if ext.name == '_ctypes':
Thomas Heller795246c2006-04-07 19:27:56 +0000285 if not self.configure_ctypes(ext):
286 return
Thomas Hellereba43c12006-04-07 19:04:09 +0000287
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000288 try:
289 build_ext.build_extension(self, ext)
290 except (CCompilerError, DistutilsError), why:
291 self.announce('WARNING: building of extension "%s" failed: %s' %
292 (ext.name, sys.exc_info()[1]))
Skip Montanarod1287322007-03-06 15:41:38 +0000293 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000294 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000295 # Workaround for Mac OS X: The Carbon-based modules cannot be
296 # reliably imported into a command-line Python
297 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000298 self.announce(
299 'WARNING: skipping import check for Carbon-based "%s"' %
300 ext.name)
301 return
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000302
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100303 if host_platform == 'darwin' and (
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000304 sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
305 # Don't bother doing an import check when an extension was
306 # build with an explicit '-arch' flag on OSX. That's currently
307 # only used to build 32-bit only extensions in a 4-way
308 # universal build and loading 32-bit code into a 64-bit
309 # process will fail.
310 self.announce(
311 'WARNING: skipping import check for "%s"' %
312 ext.name)
313 return
314
Jason Tishler24cf7762002-05-22 16:46:15 +0000315 # Workaround for Cygwin: Cygwin currently has fork issues when many
316 # modules have been imported
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100317 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000318 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
319 % ext.name)
320 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000321 ext_filename = os.path.join(
322 self.build_lib,
323 self.get_ext_filename(self.get_ext_fullname(ext.name)))
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100324
325 # Don't try to load extensions for cross builds
326 if cross_compiling:
327 return
328
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000329 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000330 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000331 except ImportError, why:
Skip Montanarod1287322007-03-06 15:41:38 +0000332 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000333 self.announce('*** WARNING: renaming "%s" since importing it'
334 ' failed: %s' % (ext.name, why), level=3)
335 assert not self.inplace
336 basename, tail = os.path.splitext(ext_filename)
337 newname = basename + "_failed" + tail
338 if os.path.exists(newname):
339 os.remove(newname)
340 os.rename(ext_filename, newname)
341
342 # XXX -- This relies on a Vile HACK in
343 # distutils.command.build_ext.build_extension(). The
344 # _built_objects attribute is stored there strictly for
345 # use here.
346 # If there is a failure, _built_objects may not be there,
347 # so catch the AttributeError and move on.
348 try:
349 for filename in self._built_objects:
350 os.remove(filename)
351 except AttributeError:
352 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000353 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000354 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000355 self.announce('*** WARNING: importing extension "%s" '
356 'failed with %s: %s' % (ext.name, exc_type, why),
357 level=3)
Skip Montanarod1287322007-03-06 15:41:38 +0000358 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000359
Barry Warsawffc9caf2011-04-07 11:28:11 -0400360 def add_multiarch_paths(self):
361 # Debian/Ubuntu multiarch support.
362 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3d2fc152012-09-21 13:51:40 +0200363 cc = sysconfig.get_config_var('CC')
364 tmpfile = os.path.join(self.build_temp, 'multiarch')
365 if not os.path.exists(self.build_temp):
366 os.makedirs(self.build_temp)
367 ret = os.system(
368 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
369 multiarch_path_component = ''
370 try:
371 if ret >> 8 == 0:
372 with open(tmpfile) as fp:
373 multiarch_path_component = fp.readline().strip()
374 finally:
375 os.unlink(tmpfile)
376
377 if multiarch_path_component != '':
378 add_dir_to_list(self.compiler.library_dirs,
379 '/usr/lib/' + multiarch_path_component)
380 add_dir_to_list(self.compiler.include_dirs,
381 '/usr/include/' + multiarch_path_component)
382 return
383
Barry Warsawffc9caf2011-04-07 11:28:11 -0400384 if not find_executable('dpkg-architecture'):
385 return
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100386 opt = ''
387 if cross_compiling:
388 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400389 tmpfile = os.path.join(self.build_temp, 'multiarch')
390 if not os.path.exists(self.build_temp):
391 os.makedirs(self.build_temp)
392 ret = os.system(
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100393 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
394 (opt, tmpfile))
Barry Warsawffc9caf2011-04-07 11:28:11 -0400395 try:
396 if ret >> 8 == 0:
397 with open(tmpfile) as fp:
398 multiarch_path_component = fp.readline().strip()
399 add_dir_to_list(self.compiler.library_dirs,
400 '/usr/lib/' + multiarch_path_component)
401 add_dir_to_list(self.compiler.include_dirs,
402 '/usr/include/' + multiarch_path_component)
403 finally:
404 os.unlink(tmpfile)
405
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100406 def add_gcc_paths(self):
407 gcc = sysconfig.get_config_var('CC')
408 tmpfile = os.path.join(self.build_temp, 'gccpaths')
409 if not os.path.exists(self.build_temp):
410 os.makedirs(self.build_temp)
411 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
412 is_gcc = False
413 in_incdirs = False
414 inc_dirs = []
415 lib_dirs = []
416 try:
417 if ret >> 8 == 0:
418 with open(tmpfile) as fp:
419 for line in fp.readlines():
420 if line.startswith("gcc version"):
421 is_gcc = True
422 elif line.startswith("#include <...>"):
423 in_incdirs = True
424 elif line.startswith("End of search list"):
425 in_incdirs = False
426 elif is_gcc and line.startswith("LIBRARY_PATH"):
427 for d in line.strip().split("=")[1].split(":"):
428 d = os.path.normpath(d)
429 if '/gcc/' not in d:
430 add_dir_to_list(self.compiler.library_dirs,
431 d)
432 elif is_gcc and in_incdirs and '/gcc/' not in line:
433 add_dir_to_list(self.compiler.include_dirs,
434 line.strip())
435 finally:
436 os.unlink(tmpfile)
437
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000438 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000439 # Ensure that /usr/local is always used
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000440 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
441 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400442 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000443
Brett Cannon516592f2004-12-07 00:42:59 +0000444 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000445 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000446 # We must get the values from the Makefile and not the environment
447 # directly since an inconsistently reproducible issue comes up where
448 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000449 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000450 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000451 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
452 ('LDFLAGS', '-L', self.compiler.library_dirs),
453 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000454 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000455 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000456 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000457 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000458 # all double dashes and any dashes followed by a character
459 # that is not for the option we are dealing with.
460 #
461 # Please note that order of the regex is important! We must
462 # strip out double-dashes first so that we don't end up with
463 # substituting "--Long" to "-Long" and thus lead to "ong" being
464 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000465 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
466 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000467 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000468 # Make sure that allowing args interspersed with options is
469 # allowed
470 parser.allow_interspersed_args = True
471 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000472 parser.add_option(arg_name, dest="dirs", action="append")
473 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000474 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000475 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000476 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000477
Ronald Oussoren24215252010-10-20 13:11:46 +0000478 if os.path.normpath(sys.prefix) != '/usr' \
479 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
480 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
481 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
482 # building a framework with different architectures than
483 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000484 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000485 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000486 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000487 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000488
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000489 try:
490 have_unicode = unicode
491 except NameError:
492 have_unicode = 0
493
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000494 # lib_dirs and inc_dirs are used to search for files;
495 # if a file is found in one of those directories, it can
496 # be assumed that no additional -I,-L directives are needed.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100497 inc_dirs = self.compiler.include_dirs[:]
498 lib_dirs = self.compiler.library_dirs[:]
499 if not cross_compiling:
500 for d in (
501 '/usr/include',
502 ):
503 add_dir_to_list(inc_dirs, d)
504 for d in (
505 '/lib64', '/usr/lib64',
506 '/lib', '/usr/lib',
507 ):
508 add_dir_to_list(lib_dirs, d)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000509 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000510 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000511
Brett Cannon4454a1f2005-04-15 20:32:39 +0000512 config_h = sysconfig.get_config_h_filename()
513 config_h_vars = sysconfig.parse_config_h(open(config_h))
514
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000515 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000516
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000517 # Check for AtheOS which has libraries in non-standard locations
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100518 if host_platform == 'atheos':
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000519 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
520 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
521 inc_dirs += ['/system/include', '/atheos/autolnk/include']
522 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
523
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000524 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100525 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000526 lib_dirs += ['/usr/ccs/lib']
527
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200528 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100529 if host_platform == 'hp-ux11':
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200530 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
531
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100532 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000533 # This should work on any unixy platform ;-)
534 # If the user has bothered specifying additional -I and -L flags
535 # in OPT and LDFLAGS we might as well use them here.
536 # NOTE: using shlex.split would technically be more correct, but
537 # also gives a bootstrap problem. Let's hope nobody uses directories
538 # with whitespace in the name to store libraries.
539 cflags, ldflags = sysconfig.get_config_vars(
540 'CFLAGS', 'LDFLAGS')
541 for item in cflags.split():
542 if item.startswith('-I'):
543 inc_dirs.append(item[2:])
544
545 for item in ldflags.split():
546 if item.startswith('-L'):
547 lib_dirs.append(item[2:])
548
Fredrik Lundhade711a2001-01-24 08:00:28 +0000549 # Check for MacOS X, which doesn't need libm.a at all
550 math_libs = ['m']
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100551 if host_platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000552 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000553
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000554 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
555
556 #
557 # The following modules are all pretty straightforward, and compile
558 # on pretty much any POSIXish platform.
559 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000560
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000561 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000562 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000563
564 # array objects
565 exts.append( Extension('array', ['arraymodule.c']) )
566 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000567 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
568 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000569 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000570 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000571 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000572 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000573 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000574 # fast string operations implemented in C
575 exts.append( Extension('strop', ['stropmodule.c']) )
576 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000577 exts.append( Extension('time', ['timemodule.c'],
578 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000579 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000580 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000581 # fast iterator tools implemented in C
582 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000583 # code that will be builtins in the future, but conflict with the
584 # current builtins
585 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000586 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000587 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000588 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000589 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000590 # bisect
591 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000592 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000593 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000594 # operator.add() and similar goodies
595 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000596 # Python 3.1 _io library
597 exts.append( Extension("_io",
598 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
599 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
600 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000601 # _functools
602 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000603 # _json speedups
604 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000605 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000606 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
607 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000608 # profilers (_lsprof is for cProfile.py)
609 exts.append( Extension('_hotshot', ['_hotshot.c']) )
610 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000611 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000612 if have_unicode:
613 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000614 else:
615 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000616 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000617 data = open('pyconfig.h').read()
618 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
619 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000620 locale_libs = ['intl']
621 else:
622 locale_libs = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100623 if host_platform == 'darwin':
Jack Jansen84b74472004-07-15 19:56:25 +0000624 locale_extra_link_args = ['-framework', 'CoreFoundation']
625 else:
626 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000627
Jack Jansen84b74472004-07-15 19:56:25 +0000628
Jason Tishlerd28216b2002-08-14 11:13:52 +0000629 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000630 libraries=locale_libs,
631 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000632
633 # Modules with some UNIX dependencies -- on by default:
634 # (If you have a really backward UNIX, select and socket may not be
635 # supported...)
636
637 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000638 libs = []
639 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
640 # May be necessary on AIX for flock function
641 libs = ['bsd']
642 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000643 # pwd(3)
644 exts.append( Extension('pwd', ['pwdmodule.c']) )
645 # grp(3)
646 exts.append( Extension('grp', ['grpmodule.c']) )
647 # spwd, shadow passwords
648 if (config_h_vars.get('HAVE_GETSPNAM', False) or
649 config_h_vars.get('HAVE_GETSPENT', False)):
650 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000651 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000652 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000653
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000654 # select(2); not on ancient System V
655 exts.append( Extension('select', ['selectmodule.c']) )
656
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000657 # Fred Drake's interface to the Python parser
658 exts.append( Extension('parser', ['parsermodule.c']) )
659
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000660 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000661 exts.append( Extension('cStringIO', ['cStringIO.c']) )
662 exts.append( Extension('cPickle', ['cPickle.c']) )
663
664 # Memory-mapped files (also works on Win32).
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100665 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000666 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000667 else:
668 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000669
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000670 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000671 # syslog daemon interface
672 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000673
674 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000675 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
676 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
677 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000678
679 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000680 # Here ends the simple stuff. From here on, modules need certain
681 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000682 #
683
684 # Multimedia modules
685 # These don't work for 64-bit platforms!!!
686 # These represent audio samples or images as strings:
687
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000688 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000689 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000690 # 64-bit platforms.
691 exts.append( Extension('audioop', ['audioop.c']) )
692
Fredrik Lundhade711a2001-01-24 08:00:28 +0000693 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000694 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000695 # Operations on images
696 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000697 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000698 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000699
700 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000701 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000702 readline_termcap_library = ""
703 curses_library = ""
704 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000705 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000706 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000707 ldd_output = fp.readlines()
708 ret = fp.close()
709 if ret is None or ret >> 8 == 0:
710 for ln in ldd_output:
711 if 'curses' in ln:
712 readline_termcap_library = re.sub(
713 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
714 ).rstrip()
715 break
716 if 'tinfo' in ln: # termcap interface split out from ncurses
717 readline_termcap_library = 'tinfo'
718 break
Stefan Krah449aa862010-06-03 12:39:50 +0000719 # Issue 7384: If readline is already linked against curses,
720 # use the same library for the readline and curses modules.
721 if 'curses' in readline_termcap_library:
722 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000723 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000724 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000725 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000726 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000727 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000728 curses_library = 'curses'
729
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100730 if host_platform == 'darwin':
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000731 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000732 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
733 if dep_target and dep_target.split('.') < ['10', '5']:
734 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000735 if os_release < 9:
736 # MacOSX 10.4 has a broken readline. Don't try to build
737 # the readline module unless the user has installed a fixed
738 # readline package
739 if find_file('readline/rlconf.h', inc_dirs, []) is None:
740 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000741 if do_readline:
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100742 if host_platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000743 # In every directory on the search path search for a dynamic
744 # library and then a static library, instead of first looking
745 # for dynamic libraries on the entiry path.
746 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000747 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000748 readline_extra_link_args = ('-Wl,-search_paths_first',)
749 else:
750 readline_extra_link_args = ()
751
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000752 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000753 if readline_termcap_library:
754 pass # Issue 7384: Already linked against curses or tinfo.
755 elif curses_library:
756 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000757 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000758 ['/usr/lib/termcap'],
759 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000760 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000761 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000762 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000763 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000764 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000765 else:
766 missing.append('readline')
767
Ronald Oussoren9545a232010-05-05 19:09:31 +0000768 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000769
Ronald Oussoren9545a232010-05-05 19:09:31 +0000770 if self.compiler.find_library_file(lib_dirs, 'crypt'):
771 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000772 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000773 libs = []
774 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000775
Skip Montanaroba9e9782003-03-20 23:34:22 +0000776 # CSV files
777 exts.append( Extension('_csv', ['_csv.c']) )
778
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000779 # socket(2)
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700780 exts.append( Extension('_socket', ['socketmodule.c', 'timemodule.c'],
781 depends=['socketmodule.h'],
782 libraries=math_libs) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000783 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000784 search_for_ssl_incs_in = [
785 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000786 '/usr/contrib/ssl/include/'
787 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000788 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
789 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000790 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000791 if ssl_incs is not None:
792 krb5_h = find_file('krb5.h', inc_dirs,
793 ['/usr/kerberos/include'])
794 if krb5_h:
795 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000796 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000797 ['/usr/local/ssl/lib',
798 '/usr/contrib/ssl/lib/'
799 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000800
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000801 if (ssl_incs is not None and
802 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000803 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000804 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000805 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000806 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000807 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000808 else:
809 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000810
Gregory P. Smithade97332005-08-23 21:19:40 +0000811 # find out which version of OpenSSL we have
812 openssl_ver = 0
813 openssl_ver_re = re.compile(
814 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000815
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000816 # look for the openssl version header on the compiler search path.
817 opensslv_h = find_file('openssl/opensslv.h', [],
818 inc_dirs + search_for_ssl_incs_in)
819 if opensslv_h:
820 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100821 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000822 name = os.path.join(macosx_sdk_root(), name[1:])
823 try:
824 incfile = open(name, 'r')
825 for line in incfile:
826 m = openssl_ver_re.match(line)
827 if m:
828 openssl_ver = eval(m.group(1))
829 except IOError, msg:
830 print "IOError while reading opensshv.h:", msg
831 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000832
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000833 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000834 have_any_openssl = ssl_incs is not None and ssl_libs is not None
835 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000836 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000837
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000838 if have_any_openssl:
839 if have_usable_openssl:
840 # The _hashlib module wraps optimized implementations
841 # of hash functions from the OpenSSL library.
842 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
843 include_dirs = ssl_incs,
844 library_dirs = ssl_libs,
845 libraries = ['ssl', 'crypto']) )
846 else:
847 print ("warning: openssl 0x%08x is too old for _hashlib" %
848 openssl_ver)
849 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000850 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000851 # The _sha module implements the SHA1 hash algorithm.
852 exts.append( Extension('_sha', ['shamodule.c']) )
853 # The _md5 module implements the RSA Data Security, Inc. MD5
854 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000855 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000856 exts.append( Extension('_md5',
857 sources = ['md5module.c', 'md5.c'],
858 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000859
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000860 min_sha2_openssl_ver = 0x00908000
861 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000862 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
863 exts.append( Extension('_sha256', ['sha256module.c']) )
864 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000865
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000866 # Modules that provide persistent dictionary-like semantics. You will
867 # probably want to arrange for at least one of them to be available on
868 # your machine, though none are defined by default because of library
869 # dependencies. The Python module anydbm.py provides an
870 # implementation independent wrapper for these; dumbdbm.py provides
871 # similar functionality (but slower of course) implemented in Python.
872
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000873 # Sleepycat^WOracle Berkeley DB interface.
874 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000875 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000876 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000877 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000878 # a release. Most open source OSes come with one or more
879 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000880
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700881 max_db_ver = (5, 3)
882 min_db_ver = (4, 3)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000883 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000884
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000885 def allow_db_ver(db_ver):
886 """Returns a boolean if the given BerkeleyDB version is acceptable.
887
888 Args:
889 db_ver: A tuple of the version to verify.
890 """
891 if not (min_db_ver <= db_ver <= max_db_ver):
892 return False
893 # Use this function to filter out known bad configurations.
894 if (4, 6) == db_ver[:2]:
895 # BerkeleyDB 4.6.x is not stable on many architectures.
896 arch = platform_machine()
897 if arch not in ('i386', 'i486', 'i586', 'i686',
898 'x86_64', 'ia64'):
899 return False
900 return True
901
902 def gen_db_minor_ver_nums(major):
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700903 if major == 5:
904 for x in range(max_db_ver[1]+1):
905 if allow_db_ver((5, x)):
906 yield x
907 elif major == 4:
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000908 for x in range(max_db_ver[1]+1):
909 if allow_db_ver((4, x)):
910 yield x
911 elif major == 3:
912 for x in (3,):
913 if allow_db_ver((3, x)):
914 yield x
915 else:
916 raise ValueError("unknown major BerkeleyDB version", major)
917
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000918 # construct a list of paths to look for the header file in on
919 # top of the normal inc_dirs.
920 db_inc_paths = [
921 '/usr/include/db4',
922 '/usr/local/include/db4',
923 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000924 '/usr/include/db3',
925 '/usr/local/include/db3',
926 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000927 # Fink defaults (http://fink.sourceforge.net/)
928 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000929 '/sw/include/db3',
930 ]
931 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000932 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000933 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000934 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000935 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
936 db_inc_paths.append('/usr/local/include/db4%d' % x)
937 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000938 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000939 # MacPorts default (http://www.macports.org/)
940 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000941 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000942 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000943 db_inc_paths.append('/usr/include/db3%d' % x)
944 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
945 db_inc_paths.append('/usr/local/include/db3%d' % x)
946 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000947 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000948
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100949 if cross_compiling:
950 db_inc_paths = []
951
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000952 # Add some common subdirectories for Sleepycat DB to the list,
953 # based on the standard include directories. This way DB3/4 gets
954 # picked up when it is installed in a non-standard prefix and
955 # the user has added that prefix into inc_dirs.
956 std_variants = []
957 for dn in inc_dirs:
958 std_variants.append(os.path.join(dn, 'db3'))
959 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000960 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000961 std_variants.append(os.path.join(dn, "db4%d"%x))
962 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000963 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000964 std_variants.append(os.path.join(dn, "db3%d"%x))
965 std_variants.append(os.path.join(dn, "db3.%d"%x))
966
Tim Peters38ff36c2006-06-30 06:18:39 +0000967 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000968 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000969
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000970 db_ver_inc_map = {}
971
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100972 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000973 sysroot = macosx_sdk_root()
974
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000975 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000976 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000977 # See whether there is a Sleepycat header in the standard
978 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000979 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000980 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000981
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100982 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000983 f = os.path.join(sysroot, d[1:], "db.h")
984
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000985 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000986 if os.path.exists(f):
987 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000988 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000989 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000990 db_major = int(m.group(1))
991 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
992 db_minor = int(m.group(1))
993 db_ver = (db_major, db_minor)
994
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000995 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
996 if db_ver == (4, 6):
997 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
998 db_patch = int(m.group(1))
999 if db_patch < 21:
1000 print "db.h:", db_ver, "patch", db_patch,
1001 print "being ignored (4.6.x must be >= 4.6.21)"
1002 continue
1003
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001004 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +00001005 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001006 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +00001007 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001008 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001009 if db_setup_debug:
1010 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001011 else:
1012 # we already found a header for this library version
1013 if db_setup_debug: print "db.h: ignoring", d
1014 else:
1015 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +00001016 if db_setup_debug:
1017 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001018
1019 db_found_vers = db_ver_inc_map.keys()
1020 db_found_vers.sort()
1021
1022 while db_found_vers:
1023 db_ver = db_found_vers.pop()
1024 db_incdir = db_ver_inc_map[db_ver]
1025
1026 # check lib directories parallel to the location of the header
1027 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +00001028 db_incdir.replace("include", 'lib64'),
1029 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001030 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001031
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001032 if host_platform != 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001033 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
1034
1035 else:
1036 # Same as other branch, but takes OSX SDK into account
1037 tmp = []
1038 for dn in db_dirs_to_check:
1039 if is_macosx_sdk_path(dn):
1040 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1041 tmp.append(dn)
1042 else:
1043 if os.path.isdir(dn):
1044 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +00001045 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001046
Ezio Melotti24b07bc2011-03-15 18:55:01 +02001047 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001048 # XXX should we -ever- look for a dbX name? Do any
1049 # systems really not name their library by version and
1050 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +00001051 for dblib in (('db-%d.%d' % db_ver),
1052 ('db%d%d' % db_ver),
1053 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001054 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001055 db_dirs_to_check + lib_dirs, dblib )
1056 if dblib_file:
1057 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1058 raise db_found
1059 else:
1060 if db_setup_debug: print "db lib: ", dblib, "not found"
1061
1062 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +00001063 if db_setup_debug:
1064 print "bsddb using BerkeleyDB lib:", db_ver, dblib
1065 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001066 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +00001067 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001068 # We add the runtime_library_dirs argument because the
1069 # BerkeleyDB lib we're linking against often isn't in the
1070 # system dynamic library search path. This is usually
1071 # correct and most trouble free, but may cause problems in
1072 # some unusual system configurations (e.g. the directory
1073 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001074 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +00001075 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001076 library_dirs=dblib_dir,
1077 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001078 include_dirs=db_incs,
1079 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +00001080 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001081 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001082 db_incs = None
1083 dblibs = []
1084 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001085 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001086
Anthony Baxterc51ee692006-04-01 00:57:31 +00001087 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001088 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001089
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001090 # We hunt for #define SQLITE_VERSION "n.n.n"
1091 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001092 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001093 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001094 '/usr/include/sqlite',
1095 '/usr/include/sqlite3',
1096 '/usr/local/include',
1097 '/usr/local/include/sqlite',
1098 '/usr/local/include/sqlite3',
1099 ]
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001100 if cross_compiling:
1101 sqlite_inc_paths = []
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001102 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1103 MIN_SQLITE_VERSION = ".".join([str(x)
1104 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001105
1106 # Scan the default include directories before the SQLite specific
1107 # ones. This allows one to override the copy of sqlite on OSX,
1108 # where /usr/include contains an old version of sqlite.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001109 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001110 sysroot = macosx_sdk_root()
1111
Ned Deily67028042012-08-05 14:42:45 -07001112 for d_ in inc_dirs + sqlite_inc_paths:
1113 d = d_
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001114 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily67028042012-08-05 14:42:45 -07001115 d = os.path.join(sysroot, d[1:])
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001116
Ned Deily67028042012-08-05 14:42:45 -07001117 f = os.path.join(d, "sqlite3.h")
Anthony Baxterc51ee692006-04-01 00:57:31 +00001118 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001119 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001120 incf = open(f).read()
1121 m = re.search(
Petri Lehtinenc23178b2013-02-23 17:05:28 +01001122 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001123 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001124 sqlite_version = m.group(1)
1125 sqlite_version_tuple = tuple([int(x)
1126 for x in sqlite_version.split(".")])
1127 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001128 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001129 if sqlite_setup_debug:
1130 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001131 sqlite_incdir = d
1132 break
1133 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001134 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001135 print "%s: version %d is too old, need >= %s"%(d,
1136 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001137 elif sqlite_setup_debug:
1138 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1139
Anthony Baxterc51ee692006-04-01 00:57:31 +00001140 if sqlite_incdir:
1141 sqlite_dirs_to_check = [
1142 os.path.join(sqlite_incdir, '..', 'lib64'),
1143 os.path.join(sqlite_incdir, '..', 'lib'),
1144 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1145 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1146 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001147 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001148 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001149 if sqlite_libfile:
1150 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001151
1152 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001153 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001154 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001155 '_sqlite/cursor.c',
1156 '_sqlite/microprotocols.c',
1157 '_sqlite/module.c',
1158 '_sqlite/prepare_protocol.c',
1159 '_sqlite/row.c',
1160 '_sqlite/statement.c',
1161 '_sqlite/util.c', ]
1162
Anthony Baxterc51ee692006-04-01 00:57:31 +00001163 sqlite_defines = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001164 if host_platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001165 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001166 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001167 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1168
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001169 # Comment this out if you want the sqlite3 module to be able to load extensions.
1170 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001171
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001172 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001173 # In every directory on the search path search for a dynamic
1174 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001175 # for dynamic libraries on the entire path.
1176 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001177 # before the dynamic library in /usr/lib.
1178 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1179 else:
1180 sqlite_extra_link_args = ()
1181
Anthony Baxterc51ee692006-04-01 00:57:31 +00001182 exts.append(Extension('_sqlite3', sqlite_srcs,
1183 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001184 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001185 sqlite_incdir],
1186 library_dirs=sqlite_libdir,
1187 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001188 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001189 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001190 else:
1191 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001192
1193 # Look for Berkeley db 1.85. Note that it is built as a different
1194 # module name so it can be included even when later versions are
1195 # available. A very restrictive search is performed to avoid
1196 # accidentally building this module with a later version of the
1197 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1198 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001199 #
1200 # If the better bsddb library can be built (db_incs is defined)
1201 # we do not build this one. Otherwise this build will pick up
1202 # the more recent berkeleydb's db.h file first in the include path
1203 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001204 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001205
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001206 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001207 if is_macosx_sdk_path(f):
1208 sysroot = macosx_sdk_root()
1209 f = os.path.join(sysroot, f[1:])
1210
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001211 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001212 data = open(f).read()
1213 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1214 if m is not None:
1215 # bingo - old version used hash file format version 2
1216 ### XXX this should be fixed to not be platform-dependent
1217 ### but I don't have direct access to an osf1 platform and
1218 ### seemed to be muffing the search somehow
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001219 libraries = host_platform == "osf1" and ['db'] or None
Skip Montanaro22e00c42003-05-06 20:43:34 +00001220 if libraries is not None:
1221 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1222 libraries=libraries))
1223 else:
1224 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001225 else:
1226 missing.append('bsddb185')
1227 else:
1228 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001229
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001230 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001231 # The standard Unix dbm module:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001232 if host_platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001233 config_args = [arg.strip("'")
1234 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001235 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001236 if arg.startswith('--with-dbmliborder=')]
1237 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001238 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001239 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001240 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001241 dbmext = None
1242 for cand in dbm_order:
1243 if cand == "ndbm":
1244 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001245 # Some systems have -lndbm, others have -lgdbm_compat,
1246 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001247 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001248 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001249 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001250 elif self.compiler.find_library_file(lib_dirs,
1251 'gdbm_compat'):
1252 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001253 else:
1254 ndbm_libs = []
1255 print "building dbm using ndbm"
1256 dbmext = Extension('dbm', ['dbmmodule.c'],
1257 define_macros=[
1258 ('HAVE_NDBM_H',None),
1259 ],
1260 libraries=ndbm_libs)
1261 break
1262
1263 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001264 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001265 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001266 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001267 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001268 gdbm_libs.append('gdbm_compat')
1269 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1270 print "building dbm using gdbm"
1271 dbmext = Extension(
1272 'dbm', ['dbmmodule.c'],
1273 define_macros=[
1274 ('HAVE_GDBM_NDBM_H', None),
1275 ],
1276 libraries = gdbm_libs)
1277 break
1278 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1279 print "building dbm using gdbm"
1280 dbmext = Extension(
1281 'dbm', ['dbmmodule.c'],
1282 define_macros=[
1283 ('HAVE_GDBM_DASH_NDBM_H', None),
1284 ],
1285 libraries = gdbm_libs)
1286 break
1287 elif cand == "bdb":
1288 if db_incs is not None:
1289 print "building dbm using bdb"
1290 dbmext = Extension('dbm', ['dbmmodule.c'],
1291 library_dirs=dblib_dir,
1292 runtime_library_dirs=dblib_dir,
1293 include_dirs=db_incs,
1294 define_macros=[
1295 ('HAVE_BERKDB_H', None),
1296 ('DB_DBM_HSEARCH', None),
1297 ],
1298 libraries=dblibs)
1299 break
1300 if dbmext is not None:
1301 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001302 else:
1303 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001304
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001305 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001306 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001307 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001308 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1309 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001310 else:
1311 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001312
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001313 # Unix-only modules
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001314 if host_platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001315 # Steen Lumholt's termios module
1316 exts.append( Extension('termios', ['termios.c']) )
1317 # Jeremy Hylton's rlimit interface
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001318 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001319 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001320 else:
1321 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001322
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001323 # Sun yellow pages. Some systems have the functions in libc.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001324 if (host_platform not in ['cygwin', 'atheos', 'qnx6'] and
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001325 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001326 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001327 libs = ['nsl']
1328 else:
1329 libs = []
1330 exts.append( Extension('nis', ['nismodule.c'],
1331 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001332 else:
1333 missing.append('nis')
1334 else:
1335 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001336
Skip Montanaro72092942004-02-07 12:50:19 +00001337 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001338 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001339 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001340 if curses_library.startswith('ncurses'):
1341 if curses_library == 'ncursesw':
1342 # Bug 1464056: If _curses.so links with ncursesw,
1343 # _curses_panel.so must link with panelw.
1344 panel_library = 'panelw'
1345 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001346 exts.append( Extension('_curses', ['_cursesmodule.c'],
1347 libraries = curses_libs) )
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001348 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001349 # OSX has an old Berkeley curses, not good enough for
1350 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001351 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001352 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001353 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001354 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001355 else:
1356 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001357
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001358 exts.append( Extension('_curses', ['_cursesmodule.c'],
1359 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001360 else:
1361 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001362
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001363 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001364 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001365 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001366 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001367 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001368 else:
1369 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001370
Barry Warsaw259b1e12002-08-13 20:09:26 +00001371 # Andrew Kuchling's zlib module. Note that some versions of zlib
1372 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1373 # http://www.cert.org/advisories/CA-2002-07.html
1374 #
1375 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1376 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1377 # now, we still accept 1.1.3, because we think it's difficult to
1378 # exploit this in Python, and we'd rather make it RedHat's problem
1379 # than our problem <wink>.
1380 #
1381 # You can upgrade zlib to version 1.1.4 yourself by going to
1382 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001383 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001384 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001385 if zlib_inc is not None:
1386 zlib_h = zlib_inc[0] + '/zlib.h'
1387 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001388 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001389 fp = open(zlib_h)
1390 while 1:
1391 line = fp.readline()
1392 if not line:
1393 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001394 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001395 version = line.split()[2]
1396 break
1397 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001398 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001399 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001400 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1401 else:
1402 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001403 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001404 libraries = ['z'],
1405 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001406 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001407 else:
1408 missing.append('zlib')
1409 else:
1410 missing.append('zlib')
1411 else:
1412 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001413
Gregory P. Smith440ca772008-03-24 00:08:01 +00001414 # Helper module for various ascii-encoders. Uses zlib for an optimized
1415 # crc32 if we have it. Otherwise binascii uses its own.
1416 if have_zlib:
1417 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1418 libraries = ['z']
1419 extra_link_args = zlib_extra_link_args
1420 else:
1421 extra_compile_args = []
1422 libraries = []
1423 extra_link_args = []
1424 exts.append( Extension('binascii', ['binascii.c'],
1425 extra_compile_args = extra_compile_args,
1426 libraries = libraries,
1427 extra_link_args = extra_link_args) )
1428
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001429 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001430 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001431 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001432 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1433 else:
1434 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001435 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001436 libraries = ['bz2'],
1437 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001438 else:
1439 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001440
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001441 # Interface to the Expat XML parser
1442 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001443 # Expat was written by James Clark and is now maintained by a group of
1444 # developers on SourceForge; see www.libexpat.org for more information.
1445 # The pyexpat module was written by Paul Prescod after a prototype by
1446 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1447 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001448 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001449 #
1450 # More information on Expat can be found at www.libexpat.org.
1451 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001452 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1453 expat_inc = []
1454 define_macros = []
1455 expat_lib = ['expat']
1456 expat_sources = []
Christian Heimes56656b02013-02-09 17:02:06 +01001457 expat_depends = []
Benjamin Peterson2c196742009-12-31 03:17:18 +00001458 else:
1459 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1460 define_macros = [
1461 ('HAVE_EXPAT_CONFIG_H', '1'),
1462 ]
1463 expat_lib = []
1464 expat_sources = ['expat/xmlparse.c',
1465 'expat/xmlrole.c',
1466 'expat/xmltok.c']
Christian Heimes56656b02013-02-09 17:02:06 +01001467 expat_depends = ['expat/ascii.h',
1468 'expat/asciitab.h',
1469 'expat/expat.h',
1470 'expat/expat_config.h',
1471 'expat/expat_external.h',
1472 'expat/internal.h',
1473 'expat/latin1tab.h',
1474 'expat/utf8tab.h',
1475 'expat/xmlrole.h',
1476 'expat/xmltok.h',
1477 'expat/xmltok_impl.h'
1478 ]
Ronald Oussoren988117f2006-04-29 11:31:35 +00001479
Fred Drake2d59a492003-10-21 15:41:15 +00001480 exts.append(Extension('pyexpat',
1481 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001482 include_dirs = expat_inc,
1483 libraries = expat_lib,
Christian Heimes56656b02013-02-09 17:02:06 +01001484 sources = ['pyexpat.c'] + expat_sources,
1485 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001486 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001487
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001488 # Fredrik Lundh's cElementTree module. Note that this also
1489 # uses expat (via the CAPI hook in pyexpat).
1490
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001491 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001492 define_macros.append(('USE_PYEXPAT_CAPI', None))
1493 exts.append(Extension('_elementtree',
1494 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001495 include_dirs = expat_inc,
1496 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001497 sources = ['_elementtree.c'],
Christian Heimes56656b02013-02-09 17:02:06 +01001498 depends = ['pyexpat.c'] + expat_sources +
1499 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001500 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001501 else:
1502 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001503
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001504 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001505 if have_unicode:
1506 exts.append(Extension('_multibytecodec',
1507 ['cjkcodecs/multibytecodec.c']))
1508 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001509 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001510 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001511 else:
1512 missing.append('_multibytecodec')
1513 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1514 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001515
Michael W. Hudson5b109102002-01-23 15:04:41 +00001516 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001517 if sys.maxint == 0x7fffffff:
1518 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1519 dl_inc = find_file('dlfcn.h', [], inc_dirs)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001520 if (dl_inc is not None) and (host_platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001521 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001522 else:
1523 missing.append('dl')
1524 else:
1525 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001526
Thomas Hellercf567c12006-03-08 19:51:58 +00001527 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001528 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001529
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001530 # Richard Oudkerk's multiprocessing module
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001531 if host_platform == 'win32': # Windows
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001532 macros = dict()
1533 libraries = ['ws2_32']
1534
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001535 elif host_platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001536 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001537 libraries = []
1538
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001539 elif host_platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001540 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001541 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001542
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001543 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001544 # FreeBSD's P1003.1b semaphore support is very experimental
1545 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001546 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001547 libraries = []
1548
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001549 elif host_platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001550 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001551 libraries = []
1552
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001553 elif host_platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001554 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001555 libraries = []
1556
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001557 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001558 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001559 libraries = ['rt']
1560
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001561 if host_platform == 'win32':
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001562 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1563 '_multiprocessing/semaphore.c',
1564 '_multiprocessing/pipe_connection.c',
1565 '_multiprocessing/socket_connection.c',
1566 '_multiprocessing/win32_functions.c'
1567 ]
1568
1569 else:
1570 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1571 '_multiprocessing/socket_connection.c'
1572 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001573 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001574 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001575 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1576
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001577 if sysconfig.get_config_var('WITH_THREAD'):
1578 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1579 define_macros=macros.items(),
1580 include_dirs=["Modules/_multiprocessing"]))
1581 else:
1582 missing.append('_multiprocessing')
1583
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001584 # End multiprocessing
1585
1586
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001587 # Platform-specific libraries
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001588 if host_platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001589 # Linux-specific modules
1590 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001591 else:
1592 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001593
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001594 if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Matthias Klose8a96d202010-04-21 22:18:52 +00001595 'freebsd7', 'freebsd8')
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001596 or host_platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001597 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001598 else:
1599 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001600
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001601 if host_platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001602 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001603 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001604 else:
1605 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001606
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001607 if host_platform == 'darwin':
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001608 # _scproxy
1609 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1610 extra_link_args= [
1611 '-framework', 'SystemConfiguration',
1612 '-framework', 'CoreFoundation'
1613 ]))
1614
1615
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001616 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001617 sysconfig.get_config_var("CONFIG_ARGS")):
1618
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001619 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001620 # We're on Mac OS X 10.4 or later, the compiler should
1621 # support '-Wno-deprecated-declarations'. This will
1622 # surpress deprecation warnings for the Carbon extensions,
1623 # these extensions wrap the Carbon APIs and even those
1624 # parts that are deprecated.
1625 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1626 else:
1627 carbon_extra_compile_args = []
1628
Just van Rossum05ced6a2002-11-24 23:15:57 +00001629 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001630 def macSrcExists(name1, name2=''):
1631 if not name1:
1632 return None
1633 names = (name1,)
1634 if name2:
1635 names = (name1, name2)
1636 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1637 return os.path.exists(path)
1638
1639 def addMacExtension(name, kwds, extra_srcs=[]):
1640 dirname = ''
1641 if name[0] == '_':
1642 dirname = name[1:].lower()
1643 cname = name + '.c'
1644 cmodulename = name + 'module.c'
1645 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1646 if macSrcExists(cname):
1647 srcs = [cname]
1648 elif macSrcExists(cmodulename):
1649 srcs = [cmodulename]
1650 elif macSrcExists(dirname, cname):
1651 # XXX(nnorwitz): If all the names ended with module, we
1652 # wouldn't need this condition. ibcarbon is the only one.
1653 srcs = [os.path.join(dirname, cname)]
1654 elif macSrcExists(dirname, cmodulename):
1655 srcs = [os.path.join(dirname, cmodulename)]
1656 else:
1657 raise RuntimeError("%s not found" % name)
1658
1659 # Here's the whole point: add the extension with sources
1660 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1661
1662 # Core Foundation
1663 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1664 'extra_link_args': ['-framework', 'CoreFoundation'],
1665 }
1666 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1667 addMacExtension('autoGIL', core_kwds)
1668
Ronald Oussoren51f06332009-09-20 10:31:22 +00001669
1670
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001671 # Carbon
1672 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1673 'extra_link_args': ['-framework', 'Carbon'],
1674 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001675 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1676 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001677 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001678 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001679 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001680 '_Help', '_Icn', '_IBCarbon', '_List',
1681 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001682 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001683 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001684 for name in CARBON_EXTS:
1685 addMacExtension(name, carbon_kwds)
1686
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001687 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1688 # The _Win extension should build just like the other Carbon extensions, but
1689 # this actually results in a hard crash of the linker.
1690 #
1691 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1692 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1693 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1694 }
1695 addMacExtension('_Win', win_kwds)
1696 else:
1697 addMacExtension('_Win', carbon_kwds)
1698
1699
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001700 # Application Services & QuickTime
1701 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1702 'extra_link_args': ['-framework','ApplicationServices'],
1703 }
1704 addMacExtension('_Launch', app_kwds)
1705 addMacExtension('_CG', app_kwds)
1706
Just van Rossum05ced6a2002-11-24 23:15:57 +00001707 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001708 extra_compile_args=carbon_extra_compile_args,
1709 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001710 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001711
Michael W. Hudson5b109102002-01-23 15:04:41 +00001712
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001713 self.extensions.extend(exts)
1714
1715 # Call the method for detecting whether _tkinter can be compiled
1716 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001717
Skip Montanarod1287322007-03-06 15:41:38 +00001718 if '_tkinter' not in [e.name for e in self.extensions]:
1719 missing.append('_tkinter')
1720
1721 return missing
1722
Jack Jansen0b06be72002-06-21 14:48:38 +00001723 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1724 # The _tkinter module, using frameworks. Since frameworks are quite
1725 # different the UNIX search logic is not sharable.
1726 from os.path import join, exists
1727 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001728 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001729 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001730 join(os.getenv('HOME'), '/Library/Frameworks')
1731 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001732
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001733 sysroot = macosx_sdk_root()
1734
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001735 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001736 # bundles.
1737 # XXX distutils should support -F!
1738 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001739 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001740
1741
Jack Jansen0b06be72002-06-21 14:48:38 +00001742 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001743 if is_macosx_sdk_path(F):
1744 if not exists(join(sysroot, F[1:], fw + '.framework')):
1745 break
1746 else:
1747 if not exists(join(F, fw + '.framework')):
1748 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001749 else:
1750 # ok, F is now directory with both frameworks. Continure
1751 # building
1752 break
1753 else:
1754 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1755 # will now resume.
1756 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001757
Jack Jansen0b06be72002-06-21 14:48:38 +00001758 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1759 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001760 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001761 #
1762 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001763 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001764 for fw in 'Tcl', 'Tk'
1765 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1766 ]
1767
Tim Peters2c60f7a2003-01-29 03:49:43 +00001768 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001769 # complicated search, this is a hard-coded path. It could bail out
1770 # if X11 libs are not found...
1771 include_dirs.append('/usr/X11R6/include')
1772 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1773
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001774 # All existing framework builds of Tcl/Tk don't support 64-bit
1775 # architectures.
1776 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1777 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001778
1779 if is_macosx_sdk_path(F):
1780 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1781 else:
1782 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1783
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001784 detected_archs = []
1785 for ln in fp:
1786 a = ln.split()[-1]
1787 if a in archs:
1788 detected_archs.append(ln.split()[-1])
1789 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001790
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001791 for a in detected_archs:
1792 frameworks.append('-arch')
1793 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001794
Jack Jansen0b06be72002-06-21 14:48:38 +00001795 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1796 define_macros=[('WITH_APPINIT', 1)],
1797 include_dirs = include_dirs,
1798 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001799 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001800 extra_link_args = frameworks,
1801 )
1802 self.extensions.append(ext)
1803 return 1
1804
Tim Peters2c60f7a2003-01-29 03:49:43 +00001805
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001806 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001807 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001808
Jack Jansen0b06be72002-06-21 14:48:38 +00001809 # Rather than complicate the code below, detecting and building
1810 # AquaTk is a separate method. Only one Tkinter will be built on
1811 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001812 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001813 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001814 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001815
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001816 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001817 # The versions with dots are used on Unix, and the versions without
1818 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001819 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001820 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1821 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001822 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001823 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001824 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001825 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001826 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001827 # Exit the loop when we've found the Tcl/Tk libraries
1828 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001829
Fredrik Lundhade711a2001-01-24 08:00:28 +00001830 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001831 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001832 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001833 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001834 dotversion = version
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001835 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001836 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1837 # but the include subdirs are named like .../include/tcl8.3.
1838 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1839 tcl_include_sub = []
1840 tk_include_sub = []
1841 for dir in inc_dirs:
1842 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1843 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1844 tk_include_sub += tcl_include_sub
1845 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1846 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001847
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001848 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001849 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001850 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001851 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001852
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001853 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001854
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001855 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1856 for dir in tcl_includes + tk_includes:
1857 if dir not in include_dirs:
1858 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001859
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001860 # Check for various platform-specific directories
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001861 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001862 include_dirs.append('/usr/openwin/include')
1863 added_lib_dirs.append('/usr/openwin/lib')
1864 elif os.path.exists('/usr/X11R6/include'):
1865 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001866 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001867 added_lib_dirs.append('/usr/X11R6/lib')
1868 elif os.path.exists('/usr/X11R5/include'):
1869 include_dirs.append('/usr/X11R5/include')
1870 added_lib_dirs.append('/usr/X11R5/lib')
1871 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001872 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001873 include_dirs.append('/usr/X11/include')
1874 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001875
Jason Tishler9181c942003-02-05 15:16:17 +00001876 # If Cygwin, then verify that X is installed before proceeding
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001877 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001878 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1879 if x11_inc is None:
1880 return
1881
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001882 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001883 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001884 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001885 defs.append( ('WITH_BLT', 1) )
1886 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001887 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001888 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001889 defs.append( ('WITH_BLT', 1) )
1890 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001891
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001892 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001893 libs.append('tk'+ version)
1894 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001895
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001896 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001897 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001898
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001899 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001900 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001901 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001902
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001903 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1904 define_macros=[('WITH_APPINIT', 1)] + defs,
1905 include_dirs = include_dirs,
1906 libraries = libs,
1907 library_dirs = added_lib_dirs,
1908 )
1909 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001910
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001911## # Uncomment these lines if you want to play with xxmodule.c
1912## ext = Extension('xx', ['xxmodule.c'])
1913## self.extensions.append(ext)
1914
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001915 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001916 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001917 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001918 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001919 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001920 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001921 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001922
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001923 def configure_ctypes_darwin(self, ext):
1924 # Darwin (OS X) uses preconfigured files, in
1925 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001926 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001927 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1928 '_ctypes', 'libffi_osx'))
1929 sources = [os.path.join(ffi_srcdir, p)
1930 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001931 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001932 'x86/x86-darwin.S',
1933 'x86/x86-ffi_darwin.c',
1934 'x86/x86-ffi64.c',
1935 'powerpc/ppc-darwin.S',
1936 'powerpc/ppc-darwin_closure.S',
1937 'powerpc/ppc-ffi_darwin.c',
1938 'powerpc/ppc64-darwin_closure.S',
1939 ]]
1940
1941 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001942 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001943
1944 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1945 os.path.join(ffi_srcdir, 'powerpc')]
1946 ext.include_dirs.extend(include_dirs)
1947 ext.sources.extend(sources)
1948 return True
1949
Thomas Hellereba43c12006-04-07 19:04:09 +00001950 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001951 if not self.use_system_libffi:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001952 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001953 return self.configure_ctypes_darwin(ext)
1954
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001955 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001956 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1957 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1958 '_ctypes', 'libffi'))
1959 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001960
Thomas Heller5e218b42006-04-27 15:50:42 +00001961 from distutils.dep_util import newer_group
1962
1963 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001964 for fname in os.listdir(ffi_srcdir)
1965 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001966 if self.force or newer_group(config_sources,
1967 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001968 from distutils.dir_util import mkpath
1969 mkpath(ffi_builddir)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001970 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
1971 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes6fd32482012-09-06 18:02:49 +02001972 if not self.verbose:
1973 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00001974
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001975 # Pass empty CFLAGS because we'll just append the resulting
1976 # CFLAGS to Python's; -g or -O2 is to be avoided.
1977 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1978 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001979
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001980 res = os.system(cmd)
1981 if res or not os.path.exists(ffi_configfile):
1982 print "Failed to configure _ctypes module"
1983 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001984
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001985 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001986 with open(ffi_configfile) as f:
1987 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001988
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001989 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001990 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001991
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001992 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001993 ffi_builddir,
1994 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001995 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001996
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001997 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1998 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001999 ext.include_dirs.extend(include_dirs)
2000 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00002001 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00002002
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002003 def detect_ctypes(self, inc_dirs, lib_dirs):
2004 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00002005 include_dirs = []
2006 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00002007 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002008 sources = ['_ctypes/_ctypes.c',
2009 '_ctypes/callbacks.c',
2010 '_ctypes/callproc.c',
2011 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00002012 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002013 depends = ['_ctypes/ctypes.h']
2014
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002015 if host_platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00002016 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00002017 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002018 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002019 include_dirs.append('_ctypes/darwin')
2020# XXX Is this still needed?
2021## extra_link_args.extend(['-read_only_relocs', 'warning'])
2022
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002023 elif host_platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00002024 # XXX This shouldn't be necessary; it appears that some
2025 # of the assembler code is non-PIC (i.e. it has relocations
2026 # when it shouldn't. The proper fix would be to rewrite
2027 # the assembler code to be PIC.
2028 # This only works with GCC; the Sun compiler likely refuses
2029 # this option. If you want to compile ctypes with the Sun
2030 # compiler, please research a proper solution, instead of
2031 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00002032 extra_link_args.append('-mimpure-text')
2033
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002034 elif host_platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00002035 extra_link_args.append('-fPIC')
2036
Thomas Hellercf567c12006-03-08 19:51:58 +00002037 ext = Extension('_ctypes',
2038 include_dirs=include_dirs,
2039 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00002040 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002041 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002042 sources=sources,
2043 depends=depends)
2044 ext_test = Extension('_ctypes_test',
2045 sources=['_ctypes/_ctypes_test.c'])
2046 self.extensions.extend([ext, ext_test])
2047
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002048 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
2049 return
2050
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002051 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002052 # OS X 10.5 comes with libffi.dylib; the include files are
2053 # in /usr/include/ffi
2054 inc_dirs.append('/usr/include/ffi')
2055
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002056 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00002057 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002058 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002059 if ffi_inc is not None:
2060 ffi_h = ffi_inc[0] + '/ffi.h'
2061 fp = open(ffi_h)
2062 while 1:
2063 line = fp.readline()
2064 if not line:
2065 ffi_inc = None
2066 break
2067 if line.startswith('#define LIBFFI_H'):
2068 break
2069 ffi_lib = None
2070 if ffi_inc is not None:
2071 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002072 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002073 ffi_lib = lib_name
2074 break
2075
2076 if ffi_inc and ffi_lib:
2077 ext.include_dirs.extend(ffi_inc)
2078 ext.libraries.append(ffi_lib)
2079 self.use_system_libffi = True
2080
2081
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002082class PyBuildInstall(install):
2083 # Suppress the warning about installation into the lib_dynload
2084 # directory, which is not in sys.path when running Python during
2085 # installation:
2086 def initialize_options (self):
2087 install.initialize_options(self)
2088 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002089
Michael W. Hudson529a5052002-12-17 16:47:17 +00002090class PyBuildInstallLib(install_lib):
2091 # Do exactly what install_lib does but make sure correct access modes get
2092 # set on installed directories and files. All installed files with get
2093 # mode 644 unless they are a shared library in which case they will get
2094 # mode 755. All installed directories will get mode 755.
2095
2096 so_ext = sysconfig.get_config_var("SO")
2097
2098 def install(self):
2099 outfiles = install_lib.install(self)
2100 self.set_file_modes(outfiles, 0644, 0755)
2101 self.set_dir_modes(self.install_dir, 0755)
2102 return outfiles
2103
2104 def set_file_modes(self, files, defaultMode, sharedLibMode):
2105 if not self.is_chmod_supported(): return
2106 if not files: return
2107
2108 for filename in files:
2109 if os.path.islink(filename): continue
2110 mode = defaultMode
2111 if filename.endswith(self.so_ext): mode = sharedLibMode
2112 log.info("changing mode of %s to %o", filename, mode)
2113 if not self.dry_run: os.chmod(filename, mode)
2114
2115 def set_dir_modes(self, dirname, mode):
2116 if not self.is_chmod_supported(): return
2117 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2118
2119 def set_dir_modes_visitor(self, mode, dirname, names):
2120 if os.path.islink(dirname): return
2121 log.info("changing mode of %s to %o", dirname, mode)
2122 if not self.dry_run: os.chmod(dirname, mode)
2123
2124 def is_chmod_supported(self):
2125 return hasattr(os, 'chmod')
2126
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002127SUMMARY = """
2128Python is an interpreted, interactive, object-oriented programming
2129language. It is often compared to Tcl, Perl, Scheme or Java.
2130
2131Python combines remarkable power with very clear syntax. It has
2132modules, classes, exceptions, very high level dynamic data types, and
2133dynamic typing. There are interfaces to many system calls and
2134libraries, as well as to various windowing systems (X11, Motif, Tk,
2135Mac, MFC). New built-in modules are easily written in C or C++. Python
2136is also usable as an extension language for applications that need a
2137programmable interface.
2138
2139The Python implementation is portable: it runs on many brands of UNIX,
2140on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2141listed here, it may still be supported, if there's a C compiler for
2142it. Ask around on comp.lang.python -- or just try compiling Python
2143yourself.
2144"""
2145
2146CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002147Development Status :: 6 - Mature
2148License :: OSI Approved :: Python Software Foundation License
2149Natural Language :: English
2150Programming Language :: C
2151Programming Language :: Python
2152Topic :: Software Development
2153"""
2154
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002155def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002156 # turn off warnings when deprecated modules are imported
2157 import warnings
2158 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002159 setup(# PyPI Metadata (PEP 301)
2160 name = "Python",
2161 version = sys.version.split()[0],
2162 url = "http://www.python.org/%s" % sys.version[:3],
2163 maintainer = "Guido van Rossum and the Python community",
2164 maintainer_email = "python-dev@python.org",
2165 description = "A high-level object-oriented programming language",
2166 long_description = SUMMARY.strip(),
2167 license = "PSF license",
2168 classifiers = filter(None, CLASSIFIERS.split("\n")),
2169 platforms = ["Many"],
2170
2171 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002172 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2173 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002174 # The struct module is defined here, because build_ext won't be
2175 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002176 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002177
2178 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002179 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002180 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002181 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002182 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002183
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002184# --install-platlib
2185if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002186 main()