blob: 716f08e21123764ad5d3886b8935f05998e181a4 [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')
doko@ubuntu.com77d8dbc2013-04-11 00:19:55 +0200442 self.add_gcc_paths()
Barry Warsawffc9caf2011-04-07 11:28:11 -0400443 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000444
Brett Cannon516592f2004-12-07 00:42:59 +0000445 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000446 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000447 # We must get the values from the Makefile and not the environment
448 # directly since an inconsistently reproducible issue comes up where
449 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000450 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000451 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000452 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
453 ('LDFLAGS', '-L', self.compiler.library_dirs),
454 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000455 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000456 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000457 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000458 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000459 # all double dashes and any dashes followed by a character
460 # that is not for the option we are dealing with.
461 #
462 # Please note that order of the regex is important! We must
463 # strip out double-dashes first so that we don't end up with
464 # substituting "--Long" to "-Long" and thus lead to "ong" being
465 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000466 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
467 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000468 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000469 # Make sure that allowing args interspersed with options is
470 # allowed
471 parser.allow_interspersed_args = True
472 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000473 parser.add_option(arg_name, dest="dirs", action="append")
474 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000475 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000476 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000477 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000478
Ronald Oussoren24215252010-10-20 13:11:46 +0000479 if os.path.normpath(sys.prefix) != '/usr' \
480 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
481 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
482 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
483 # building a framework with different architectures than
484 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000485 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000486 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000487 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000488 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000489
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000490 try:
491 have_unicode = unicode
492 except NameError:
493 have_unicode = 0
494
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000495 # lib_dirs and inc_dirs are used to search for files;
496 # if a file is found in one of those directories, it can
497 # be assumed that no additional -I,-L directives are needed.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100498 inc_dirs = self.compiler.include_dirs[:]
499 lib_dirs = self.compiler.library_dirs[:]
500 if not cross_compiling:
501 for d in (
502 '/usr/include',
503 ):
504 add_dir_to_list(inc_dirs, d)
505 for d in (
506 '/lib64', '/usr/lib64',
507 '/lib', '/usr/lib',
508 ):
509 add_dir_to_list(lib_dirs, d)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000510 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000511 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000512
Brett Cannon4454a1f2005-04-15 20:32:39 +0000513 config_h = sysconfig.get_config_h_filename()
514 config_h_vars = sysconfig.parse_config_h(open(config_h))
515
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000516 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000517
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000518 # Check for AtheOS which has libraries in non-standard locations
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100519 if host_platform == 'atheos':
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000520 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
521 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
522 inc_dirs += ['/system/include', '/atheos/autolnk/include']
523 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
524
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000525 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100526 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000527 lib_dirs += ['/usr/ccs/lib']
528
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200529 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100530 if host_platform == 'hp-ux11':
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200531 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
532
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100533 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000534 # This should work on any unixy platform ;-)
535 # If the user has bothered specifying additional -I and -L flags
536 # in OPT and LDFLAGS we might as well use them here.
537 # NOTE: using shlex.split would technically be more correct, but
538 # also gives a bootstrap problem. Let's hope nobody uses directories
539 # with whitespace in the name to store libraries.
540 cflags, ldflags = sysconfig.get_config_vars(
541 'CFLAGS', 'LDFLAGS')
542 for item in cflags.split():
543 if item.startswith('-I'):
544 inc_dirs.append(item[2:])
545
546 for item in ldflags.split():
547 if item.startswith('-L'):
548 lib_dirs.append(item[2:])
549
Fredrik Lundhade711a2001-01-24 08:00:28 +0000550 # Check for MacOS X, which doesn't need libm.a at all
551 math_libs = ['m']
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100552 if host_platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000553 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000554
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000555 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
556
557 #
558 # The following modules are all pretty straightforward, and compile
559 # on pretty much any POSIXish platform.
560 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000561
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000562 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000563 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000564
565 # array objects
566 exts.append( Extension('array', ['arraymodule.c']) )
567 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000568 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
569 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000570 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000571 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000572 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000573 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000574 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000575 # fast string operations implemented in C
576 exts.append( Extension('strop', ['stropmodule.c']) )
577 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000578 exts.append( Extension('time', ['timemodule.c'],
579 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000580 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000581 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000582 # fast iterator tools implemented in C
583 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000584 # code that will be builtins in the future, but conflict with the
585 # current builtins
586 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000587 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000588 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000589 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000590 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000591 # bisect
592 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000593 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000594 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000595 # operator.add() and similar goodies
596 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000597 # Python 3.1 _io library
598 exts.append( Extension("_io",
599 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
600 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
601 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000602 # _functools
603 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000604 # _json speedups
605 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000606 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000607 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
608 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000609 # profilers (_lsprof is for cProfile.py)
610 exts.append( Extension('_hotshot', ['_hotshot.c']) )
611 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000612 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000613 if have_unicode:
614 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000615 else:
616 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000617 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000618 data = open('pyconfig.h').read()
619 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
620 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000621 locale_libs = ['intl']
622 else:
623 locale_libs = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100624 if host_platform == 'darwin':
Jack Jansen84b74472004-07-15 19:56:25 +0000625 locale_extra_link_args = ['-framework', 'CoreFoundation']
626 else:
627 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000628
Jack Jansen84b74472004-07-15 19:56:25 +0000629
Jason Tishlerd28216b2002-08-14 11:13:52 +0000630 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000631 libraries=locale_libs,
632 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000633
634 # Modules with some UNIX dependencies -- on by default:
635 # (If you have a really backward UNIX, select and socket may not be
636 # supported...)
637
638 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000639 libs = []
640 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
641 # May be necessary on AIX for flock function
642 libs = ['bsd']
643 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000644 # pwd(3)
645 exts.append( Extension('pwd', ['pwdmodule.c']) )
646 # grp(3)
647 exts.append( Extension('grp', ['grpmodule.c']) )
648 # spwd, shadow passwords
649 if (config_h_vars.get('HAVE_GETSPNAM', False) or
650 config_h_vars.get('HAVE_GETSPENT', False)):
651 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000652 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000653 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000654
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000655 # select(2); not on ancient System V
656 exts.append( Extension('select', ['selectmodule.c']) )
657
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000658 # Fred Drake's interface to the Python parser
659 exts.append( Extension('parser', ['parsermodule.c']) )
660
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000661 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000662 exts.append( Extension('cStringIO', ['cStringIO.c']) )
663 exts.append( Extension('cPickle', ['cPickle.c']) )
664
665 # Memory-mapped files (also works on Win32).
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100666 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000667 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000668 else:
669 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000670
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000671 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000672 # syslog daemon interface
673 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000674
675 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000676 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
677 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
678 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000679
680 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000681 # Here ends the simple stuff. From here on, modules need certain
682 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000683 #
684
685 # Multimedia modules
686 # These don't work for 64-bit platforms!!!
687 # These represent audio samples or images as strings:
688
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000689 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000690 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000691 # 64-bit platforms.
692 exts.append( Extension('audioop', ['audioop.c']) )
693
Fredrik Lundhade711a2001-01-24 08:00:28 +0000694 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000695 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000696 # Operations on images
697 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000698 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000699 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000700
701 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000702 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000703 readline_termcap_library = ""
704 curses_library = ""
705 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000706 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000707 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000708 ldd_output = fp.readlines()
709 ret = fp.close()
710 if ret is None or ret >> 8 == 0:
711 for ln in ldd_output:
712 if 'curses' in ln:
713 readline_termcap_library = re.sub(
714 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
715 ).rstrip()
716 break
717 if 'tinfo' in ln: # termcap interface split out from ncurses
718 readline_termcap_library = 'tinfo'
719 break
Stefan Krah449aa862010-06-03 12:39:50 +0000720 # Issue 7384: If readline is already linked against curses,
721 # use the same library for the readline and curses modules.
722 if 'curses' in readline_termcap_library:
723 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000724 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000725 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000726 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000727 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000728 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000729 curses_library = 'curses'
730
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100731 if host_platform == 'darwin':
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000732 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000733 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
734 if dep_target and dep_target.split('.') < ['10', '5']:
735 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000736 if os_release < 9:
737 # MacOSX 10.4 has a broken readline. Don't try to build
738 # the readline module unless the user has installed a fixed
739 # readline package
740 if find_file('readline/rlconf.h', inc_dirs, []) is None:
741 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000742 if do_readline:
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100743 if host_platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000744 # In every directory on the search path search for a dynamic
745 # library and then a static library, instead of first looking
746 # for dynamic libraries on the entiry path.
747 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000748 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000749 readline_extra_link_args = ('-Wl,-search_paths_first',)
750 else:
751 readline_extra_link_args = ()
752
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000753 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000754 if readline_termcap_library:
755 pass # Issue 7384: Already linked against curses or tinfo.
756 elif curses_library:
757 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000758 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000759 ['/usr/lib/termcap'],
760 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000761 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000762 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000763 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000764 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000765 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000766 else:
767 missing.append('readline')
768
Ronald Oussoren9545a232010-05-05 19:09:31 +0000769 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000770
Ronald Oussoren9545a232010-05-05 19:09:31 +0000771 if self.compiler.find_library_file(lib_dirs, 'crypt'):
772 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000773 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000774 libs = []
775 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000776
Skip Montanaroba9e9782003-03-20 23:34:22 +0000777 # CSV files
778 exts.append( Extension('_csv', ['_csv.c']) )
779
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000780 # socket(2)
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700781 exts.append( Extension('_socket', ['socketmodule.c', 'timemodule.c'],
782 depends=['socketmodule.h'],
783 libraries=math_libs) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000784 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000785 search_for_ssl_incs_in = [
786 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000787 '/usr/contrib/ssl/include/'
788 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000789 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
790 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000791 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000792 if ssl_incs is not None:
793 krb5_h = find_file('krb5.h', inc_dirs,
794 ['/usr/kerberos/include'])
795 if krb5_h:
796 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000797 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000798 ['/usr/local/ssl/lib',
799 '/usr/contrib/ssl/lib/'
800 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000801
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000802 if (ssl_incs is not None and
803 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000804 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000805 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000806 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000807 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000808 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000809 else:
810 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000811
Gregory P. Smithade97332005-08-23 21:19:40 +0000812 # find out which version of OpenSSL we have
813 openssl_ver = 0
814 openssl_ver_re = re.compile(
815 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000816
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000817 # look for the openssl version header on the compiler search path.
818 opensslv_h = find_file('openssl/opensslv.h', [],
819 inc_dirs + search_for_ssl_incs_in)
820 if opensslv_h:
821 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100822 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000823 name = os.path.join(macosx_sdk_root(), name[1:])
824 try:
825 incfile = open(name, 'r')
826 for line in incfile:
827 m = openssl_ver_re.match(line)
828 if m:
829 openssl_ver = eval(m.group(1))
830 except IOError, msg:
831 print "IOError while reading opensshv.h:", msg
832 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000833
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000834 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000835 have_any_openssl = ssl_incs is not None and ssl_libs is not None
836 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000837 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000838
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000839 if have_any_openssl:
840 if have_usable_openssl:
841 # The _hashlib module wraps optimized implementations
842 # of hash functions from the OpenSSL library.
843 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
844 include_dirs = ssl_incs,
845 library_dirs = ssl_libs,
846 libraries = ['ssl', 'crypto']) )
847 else:
848 print ("warning: openssl 0x%08x is too old for _hashlib" %
849 openssl_ver)
850 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000851 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000852 # The _sha module implements the SHA1 hash algorithm.
853 exts.append( Extension('_sha', ['shamodule.c']) )
854 # The _md5 module implements the RSA Data Security, Inc. MD5
855 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000856 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000857 exts.append( Extension('_md5',
858 sources = ['md5module.c', 'md5.c'],
859 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000860
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000861 min_sha2_openssl_ver = 0x00908000
862 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000863 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
864 exts.append( Extension('_sha256', ['sha256module.c']) )
865 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000866
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000867 # Modules that provide persistent dictionary-like semantics. You will
868 # probably want to arrange for at least one of them to be available on
869 # your machine, though none are defined by default because of library
870 # dependencies. The Python module anydbm.py provides an
871 # implementation independent wrapper for these; dumbdbm.py provides
872 # similar functionality (but slower of course) implemented in Python.
873
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000874 # Sleepycat^WOracle Berkeley DB interface.
875 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000876 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000877 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000878 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000879 # a release. Most open source OSes come with one or more
880 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000881
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700882 max_db_ver = (5, 3)
883 min_db_ver = (4, 3)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000884 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000885
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000886 def allow_db_ver(db_ver):
887 """Returns a boolean if the given BerkeleyDB version is acceptable.
888
889 Args:
890 db_ver: A tuple of the version to verify.
891 """
892 if not (min_db_ver <= db_ver <= max_db_ver):
893 return False
894 # Use this function to filter out known bad configurations.
895 if (4, 6) == db_ver[:2]:
896 # BerkeleyDB 4.6.x is not stable on many architectures.
897 arch = platform_machine()
898 if arch not in ('i386', 'i486', 'i586', 'i686',
899 'x86_64', 'ia64'):
900 return False
901 return True
902
903 def gen_db_minor_ver_nums(major):
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700904 if major == 5:
905 for x in range(max_db_ver[1]+1):
906 if allow_db_ver((5, x)):
907 yield x
908 elif major == 4:
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000909 for x in range(max_db_ver[1]+1):
910 if allow_db_ver((4, x)):
911 yield x
912 elif major == 3:
913 for x in (3,):
914 if allow_db_ver((3, x)):
915 yield x
916 else:
917 raise ValueError("unknown major BerkeleyDB version", major)
918
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000919 # construct a list of paths to look for the header file in on
920 # top of the normal inc_dirs.
921 db_inc_paths = [
922 '/usr/include/db4',
923 '/usr/local/include/db4',
924 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000925 '/usr/include/db3',
926 '/usr/local/include/db3',
927 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000928 # Fink defaults (http://fink.sourceforge.net/)
929 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000930 '/sw/include/db3',
931 ]
932 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000933 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000934 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000935 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000936 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
937 db_inc_paths.append('/usr/local/include/db4%d' % x)
938 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000939 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000940 # MacPorts default (http://www.macports.org/)
941 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000942 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000943 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000944 db_inc_paths.append('/usr/include/db3%d' % x)
945 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
946 db_inc_paths.append('/usr/local/include/db3%d' % x)
947 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000948 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000949
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100950 if cross_compiling:
951 db_inc_paths = []
952
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000953 # Add some common subdirectories for Sleepycat DB to the list,
954 # based on the standard include directories. This way DB3/4 gets
955 # picked up when it is installed in a non-standard prefix and
956 # the user has added that prefix into inc_dirs.
957 std_variants = []
958 for dn in inc_dirs:
959 std_variants.append(os.path.join(dn, 'db3'))
960 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000961 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000962 std_variants.append(os.path.join(dn, "db4%d"%x))
963 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000964 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000965 std_variants.append(os.path.join(dn, "db3%d"%x))
966 std_variants.append(os.path.join(dn, "db3.%d"%x))
967
Tim Peters38ff36c2006-06-30 06:18:39 +0000968 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000969 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000970
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000971 db_ver_inc_map = {}
972
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100973 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000974 sysroot = macosx_sdk_root()
975
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000976 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000977 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000978 # See whether there is a Sleepycat header in the standard
979 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000980 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000981 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000982
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100983 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000984 f = os.path.join(sysroot, d[1:], "db.h")
985
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000986 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000987 if os.path.exists(f):
988 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000989 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000990 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000991 db_major = int(m.group(1))
992 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
993 db_minor = int(m.group(1))
994 db_ver = (db_major, db_minor)
995
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000996 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
997 if db_ver == (4, 6):
998 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
999 db_patch = int(m.group(1))
1000 if db_patch < 21:
1001 print "db.h:", db_ver, "patch", db_patch,
1002 print "being ignored (4.6.x must be >= 4.6.21)"
1003 continue
1004
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001005 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +00001006 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001007 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +00001008 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001009 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001010 if db_setup_debug:
1011 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001012 else:
1013 # we already found a header for this library version
1014 if db_setup_debug: print "db.h: ignoring", d
1015 else:
1016 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +00001017 if db_setup_debug:
1018 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001019
1020 db_found_vers = db_ver_inc_map.keys()
1021 db_found_vers.sort()
1022
1023 while db_found_vers:
1024 db_ver = db_found_vers.pop()
1025 db_incdir = db_ver_inc_map[db_ver]
1026
1027 # check lib directories parallel to the location of the header
1028 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +00001029 db_incdir.replace("include", 'lib64'),
1030 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001031 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001032
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001033 if host_platform != 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001034 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
1035
1036 else:
1037 # Same as other branch, but takes OSX SDK into account
1038 tmp = []
1039 for dn in db_dirs_to_check:
1040 if is_macosx_sdk_path(dn):
1041 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1042 tmp.append(dn)
1043 else:
1044 if os.path.isdir(dn):
1045 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +00001046 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001047
Ezio Melotti24b07bc2011-03-15 18:55:01 +02001048 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001049 # XXX should we -ever- look for a dbX name? Do any
1050 # systems really not name their library by version and
1051 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +00001052 for dblib in (('db-%d.%d' % db_ver),
1053 ('db%d%d' % db_ver),
1054 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001055 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001056 db_dirs_to_check + lib_dirs, dblib )
1057 if dblib_file:
1058 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1059 raise db_found
1060 else:
1061 if db_setup_debug: print "db lib: ", dblib, "not found"
1062
1063 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +00001064 if db_setup_debug:
1065 print "bsddb using BerkeleyDB lib:", db_ver, dblib
1066 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001067 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +00001068 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001069 # We add the runtime_library_dirs argument because the
1070 # BerkeleyDB lib we're linking against often isn't in the
1071 # system dynamic library search path. This is usually
1072 # correct and most trouble free, but may cause problems in
1073 # some unusual system configurations (e.g. the directory
1074 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001075 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +00001076 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001077 library_dirs=dblib_dir,
1078 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001079 include_dirs=db_incs,
1080 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +00001081 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001082 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001083 db_incs = None
1084 dblibs = []
1085 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001086 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001087
Anthony Baxterc51ee692006-04-01 00:57:31 +00001088 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001089 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001090
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001091 # We hunt for #define SQLITE_VERSION "n.n.n"
1092 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001093 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001094 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001095 '/usr/include/sqlite',
1096 '/usr/include/sqlite3',
1097 '/usr/local/include',
1098 '/usr/local/include/sqlite',
1099 '/usr/local/include/sqlite3',
1100 ]
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001101 if cross_compiling:
1102 sqlite_inc_paths = []
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001103 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1104 MIN_SQLITE_VERSION = ".".join([str(x)
1105 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001106
1107 # Scan the default include directories before the SQLite specific
1108 # ones. This allows one to override the copy of sqlite on OSX,
1109 # where /usr/include contains an old version of sqlite.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001110 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001111 sysroot = macosx_sdk_root()
1112
Ned Deily67028042012-08-05 14:42:45 -07001113 for d_ in inc_dirs + sqlite_inc_paths:
1114 d = d_
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001115 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily67028042012-08-05 14:42:45 -07001116 d = os.path.join(sysroot, d[1:])
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001117
Ned Deily67028042012-08-05 14:42:45 -07001118 f = os.path.join(d, "sqlite3.h")
Anthony Baxterc51ee692006-04-01 00:57:31 +00001119 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001120 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001121 incf = open(f).read()
1122 m = re.search(
Petri Lehtinenc23178b2013-02-23 17:05:28 +01001123 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001124 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001125 sqlite_version = m.group(1)
1126 sqlite_version_tuple = tuple([int(x)
1127 for x in sqlite_version.split(".")])
1128 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001129 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001130 if sqlite_setup_debug:
1131 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001132 sqlite_incdir = d
1133 break
1134 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001135 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001136 print "%s: version %d is too old, need >= %s"%(d,
1137 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001138 elif sqlite_setup_debug:
1139 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1140
Anthony Baxterc51ee692006-04-01 00:57:31 +00001141 if sqlite_incdir:
1142 sqlite_dirs_to_check = [
1143 os.path.join(sqlite_incdir, '..', 'lib64'),
1144 os.path.join(sqlite_incdir, '..', 'lib'),
1145 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1146 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1147 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001148 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001149 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001150 if sqlite_libfile:
1151 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001152
1153 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001154 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001155 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001156 '_sqlite/cursor.c',
1157 '_sqlite/microprotocols.c',
1158 '_sqlite/module.c',
1159 '_sqlite/prepare_protocol.c',
1160 '_sqlite/row.c',
1161 '_sqlite/statement.c',
1162 '_sqlite/util.c', ]
1163
Anthony Baxterc51ee692006-04-01 00:57:31 +00001164 sqlite_defines = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001165 if host_platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001166 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001167 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001168 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1169
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001170 # Comment this out if you want the sqlite3 module to be able to load extensions.
1171 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001172
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001173 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001174 # In every directory on the search path search for a dynamic
1175 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001176 # for dynamic libraries on the entire path.
1177 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001178 # before the dynamic library in /usr/lib.
1179 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1180 else:
1181 sqlite_extra_link_args = ()
1182
Anthony Baxterc51ee692006-04-01 00:57:31 +00001183 exts.append(Extension('_sqlite3', sqlite_srcs,
1184 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001185 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001186 sqlite_incdir],
1187 library_dirs=sqlite_libdir,
1188 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001189 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001190 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001191 else:
1192 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001193
1194 # Look for Berkeley db 1.85. Note that it is built as a different
1195 # module name so it can be included even when later versions are
1196 # available. A very restrictive search is performed to avoid
1197 # accidentally building this module with a later version of the
1198 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1199 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001200 #
1201 # If the better bsddb library can be built (db_incs is defined)
1202 # we do not build this one. Otherwise this build will pick up
1203 # the more recent berkeleydb's db.h file first in the include path
1204 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001205 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001206
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001207 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001208 if is_macosx_sdk_path(f):
1209 sysroot = macosx_sdk_root()
1210 f = os.path.join(sysroot, f[1:])
1211
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001212 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001213 data = open(f).read()
1214 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1215 if m is not None:
1216 # bingo - old version used hash file format version 2
1217 ### XXX this should be fixed to not be platform-dependent
1218 ### but I don't have direct access to an osf1 platform and
1219 ### seemed to be muffing the search somehow
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001220 libraries = host_platform == "osf1" and ['db'] or None
Skip Montanaro22e00c42003-05-06 20:43:34 +00001221 if libraries is not None:
1222 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1223 libraries=libraries))
1224 else:
1225 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001226 else:
1227 missing.append('bsddb185')
1228 else:
1229 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001230
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001231 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001232 # The standard Unix dbm module:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001233 if host_platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001234 config_args = [arg.strip("'")
1235 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001236 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001237 if arg.startswith('--with-dbmliborder=')]
1238 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001239 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001240 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001241 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001242 dbmext = None
1243 for cand in dbm_order:
1244 if cand == "ndbm":
1245 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001246 # Some systems have -lndbm, others have -lgdbm_compat,
1247 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001248 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001249 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001250 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001251 elif self.compiler.find_library_file(lib_dirs,
1252 'gdbm_compat'):
1253 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001254 else:
1255 ndbm_libs = []
1256 print "building dbm using ndbm"
1257 dbmext = Extension('dbm', ['dbmmodule.c'],
1258 define_macros=[
1259 ('HAVE_NDBM_H',None),
1260 ],
1261 libraries=ndbm_libs)
1262 break
1263
1264 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001265 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001266 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001267 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001268 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001269 gdbm_libs.append('gdbm_compat')
1270 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1271 print "building dbm using gdbm"
1272 dbmext = Extension(
1273 'dbm', ['dbmmodule.c'],
1274 define_macros=[
1275 ('HAVE_GDBM_NDBM_H', None),
1276 ],
1277 libraries = gdbm_libs)
1278 break
1279 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1280 print "building dbm using gdbm"
1281 dbmext = Extension(
1282 'dbm', ['dbmmodule.c'],
1283 define_macros=[
1284 ('HAVE_GDBM_DASH_NDBM_H', None),
1285 ],
1286 libraries = gdbm_libs)
1287 break
1288 elif cand == "bdb":
1289 if db_incs is not None:
1290 print "building dbm using bdb"
1291 dbmext = Extension('dbm', ['dbmmodule.c'],
1292 library_dirs=dblib_dir,
1293 runtime_library_dirs=dblib_dir,
1294 include_dirs=db_incs,
1295 define_macros=[
1296 ('HAVE_BERKDB_H', None),
1297 ('DB_DBM_HSEARCH', None),
1298 ],
1299 libraries=dblibs)
1300 break
1301 if dbmext is not None:
1302 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001303 else:
1304 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001305
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001306 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001307 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001308 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001309 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1310 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001311 else:
1312 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001313
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001314 # Unix-only modules
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001315 if host_platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001316 # Steen Lumholt's termios module
1317 exts.append( Extension('termios', ['termios.c']) )
1318 # Jeremy Hylton's rlimit interface
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001319 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001320 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001321 else:
1322 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001323
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001324 # Sun yellow pages. Some systems have the functions in libc.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001325 if (host_platform not in ['cygwin', 'atheos', 'qnx6'] and
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001326 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001327 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001328 libs = ['nsl']
1329 else:
1330 libs = []
1331 exts.append( Extension('nis', ['nismodule.c'],
1332 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001333 else:
1334 missing.append('nis')
1335 else:
1336 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001337
Skip Montanaro72092942004-02-07 12:50:19 +00001338 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001339 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001340 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001341 if curses_library.startswith('ncurses'):
1342 if curses_library == 'ncursesw':
1343 # Bug 1464056: If _curses.so links with ncursesw,
1344 # _curses_panel.so must link with panelw.
1345 panel_library = 'panelw'
1346 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001347 exts.append( Extension('_curses', ['_cursesmodule.c'],
1348 libraries = curses_libs) )
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001349 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001350 # OSX has an old Berkeley curses, not good enough for
1351 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001352 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001353 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001354 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001355 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001356 else:
1357 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001358
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001359 exts.append( Extension('_curses', ['_cursesmodule.c'],
1360 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001361 else:
1362 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001363
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001364 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001365 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001366 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001367 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001368 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001369 else:
1370 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001371
Barry Warsaw259b1e12002-08-13 20:09:26 +00001372 # Andrew Kuchling's zlib module. Note that some versions of zlib
1373 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1374 # http://www.cert.org/advisories/CA-2002-07.html
1375 #
1376 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1377 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1378 # now, we still accept 1.1.3, because we think it's difficult to
1379 # exploit this in Python, and we'd rather make it RedHat's problem
1380 # than our problem <wink>.
1381 #
1382 # You can upgrade zlib to version 1.1.4 yourself by going to
1383 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001384 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001385 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001386 if zlib_inc is not None:
1387 zlib_h = zlib_inc[0] + '/zlib.h'
1388 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001389 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001390 fp = open(zlib_h)
1391 while 1:
1392 line = fp.readline()
1393 if not line:
1394 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001395 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001396 version = line.split()[2]
1397 break
1398 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001399 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001400 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001401 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1402 else:
1403 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001404 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001405 libraries = ['z'],
1406 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001407 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001408 else:
1409 missing.append('zlib')
1410 else:
1411 missing.append('zlib')
1412 else:
1413 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001414
Gregory P. Smith440ca772008-03-24 00:08:01 +00001415 # Helper module for various ascii-encoders. Uses zlib for an optimized
1416 # crc32 if we have it. Otherwise binascii uses its own.
1417 if have_zlib:
1418 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1419 libraries = ['z']
1420 extra_link_args = zlib_extra_link_args
1421 else:
1422 extra_compile_args = []
1423 libraries = []
1424 extra_link_args = []
1425 exts.append( Extension('binascii', ['binascii.c'],
1426 extra_compile_args = extra_compile_args,
1427 libraries = libraries,
1428 extra_link_args = extra_link_args) )
1429
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001430 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001431 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001432 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001433 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1434 else:
1435 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001436 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001437 libraries = ['bz2'],
1438 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001439 else:
1440 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001441
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001442 # Interface to the Expat XML parser
1443 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001444 # Expat was written by James Clark and is now maintained by a group of
1445 # developers on SourceForge; see www.libexpat.org for more information.
1446 # The pyexpat module was written by Paul Prescod after a prototype by
1447 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1448 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001449 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001450 #
1451 # More information on Expat can be found at www.libexpat.org.
1452 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001453 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1454 expat_inc = []
1455 define_macros = []
1456 expat_lib = ['expat']
1457 expat_sources = []
Christian Heimes56656b02013-02-09 17:02:06 +01001458 expat_depends = []
Benjamin Peterson2c196742009-12-31 03:17:18 +00001459 else:
1460 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1461 define_macros = [
1462 ('HAVE_EXPAT_CONFIG_H', '1'),
1463 ]
1464 expat_lib = []
1465 expat_sources = ['expat/xmlparse.c',
1466 'expat/xmlrole.c',
1467 'expat/xmltok.c']
Christian Heimes56656b02013-02-09 17:02:06 +01001468 expat_depends = ['expat/ascii.h',
1469 'expat/asciitab.h',
1470 'expat/expat.h',
1471 'expat/expat_config.h',
1472 'expat/expat_external.h',
1473 'expat/internal.h',
1474 'expat/latin1tab.h',
1475 'expat/utf8tab.h',
1476 'expat/xmlrole.h',
1477 'expat/xmltok.h',
1478 'expat/xmltok_impl.h'
1479 ]
Ronald Oussoren988117f2006-04-29 11:31:35 +00001480
Fred Drake2d59a492003-10-21 15:41:15 +00001481 exts.append(Extension('pyexpat',
1482 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001483 include_dirs = expat_inc,
1484 libraries = expat_lib,
Christian Heimes56656b02013-02-09 17:02:06 +01001485 sources = ['pyexpat.c'] + expat_sources,
1486 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001487 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001488
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001489 # Fredrik Lundh's cElementTree module. Note that this also
1490 # uses expat (via the CAPI hook in pyexpat).
1491
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001492 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001493 define_macros.append(('USE_PYEXPAT_CAPI', None))
1494 exts.append(Extension('_elementtree',
1495 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001496 include_dirs = expat_inc,
1497 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001498 sources = ['_elementtree.c'],
Christian Heimes56656b02013-02-09 17:02:06 +01001499 depends = ['pyexpat.c'] + expat_sources +
1500 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001501 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001502 else:
1503 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001504
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001505 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001506 if have_unicode:
1507 exts.append(Extension('_multibytecodec',
1508 ['cjkcodecs/multibytecodec.c']))
1509 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001510 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001511 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001512 else:
1513 missing.append('_multibytecodec')
1514 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1515 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001516
Michael W. Hudson5b109102002-01-23 15:04:41 +00001517 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001518 if sys.maxint == 0x7fffffff:
1519 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1520 dl_inc = find_file('dlfcn.h', [], inc_dirs)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001521 if (dl_inc is not None) and (host_platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001522 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001523 else:
1524 missing.append('dl')
1525 else:
1526 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001527
Thomas Hellercf567c12006-03-08 19:51:58 +00001528 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001529 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001530
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001531 # Richard Oudkerk's multiprocessing module
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001532 if host_platform == 'win32': # Windows
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001533 macros = dict()
1534 libraries = ['ws2_32']
1535
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001536 elif host_platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001537 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001538 libraries = []
1539
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001540 elif host_platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001541 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001542 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001543
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001544 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001545 # FreeBSD's P1003.1b semaphore support is very experimental
1546 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001547 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001548 libraries = []
1549
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001550 elif host_platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001551 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001552 libraries = []
1553
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001554 elif host_platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001555 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001556 libraries = []
1557
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001558 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001559 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001560 libraries = ['rt']
1561
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001562 if host_platform == 'win32':
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001563 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1564 '_multiprocessing/semaphore.c',
1565 '_multiprocessing/pipe_connection.c',
1566 '_multiprocessing/socket_connection.c',
1567 '_multiprocessing/win32_functions.c'
1568 ]
1569
1570 else:
1571 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1572 '_multiprocessing/socket_connection.c'
1573 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001574 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001575 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001576 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1577
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001578 if sysconfig.get_config_var('WITH_THREAD'):
1579 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1580 define_macros=macros.items(),
1581 include_dirs=["Modules/_multiprocessing"]))
1582 else:
1583 missing.append('_multiprocessing')
1584
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001585 # End multiprocessing
1586
1587
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001588 # Platform-specific libraries
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001589 if host_platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001590 # Linux-specific modules
1591 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001592 else:
1593 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001594
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001595 if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Matthias Klose8a96d202010-04-21 22:18:52 +00001596 'freebsd7', 'freebsd8')
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001597 or host_platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001598 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001599 else:
1600 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001601
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001602 if host_platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001603 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001604 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001605 else:
1606 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001607
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001608 if host_platform == 'darwin':
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001609 # _scproxy
1610 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1611 extra_link_args= [
1612 '-framework', 'SystemConfiguration',
1613 '-framework', 'CoreFoundation'
1614 ]))
1615
1616
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001617 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001618 sysconfig.get_config_var("CONFIG_ARGS")):
1619
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001620 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001621 # We're on Mac OS X 10.4 or later, the compiler should
1622 # support '-Wno-deprecated-declarations'. This will
1623 # surpress deprecation warnings for the Carbon extensions,
1624 # these extensions wrap the Carbon APIs and even those
1625 # parts that are deprecated.
1626 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1627 else:
1628 carbon_extra_compile_args = []
1629
Just van Rossum05ced6a2002-11-24 23:15:57 +00001630 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001631 def macSrcExists(name1, name2=''):
1632 if not name1:
1633 return None
1634 names = (name1,)
1635 if name2:
1636 names = (name1, name2)
1637 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1638 return os.path.exists(path)
1639
1640 def addMacExtension(name, kwds, extra_srcs=[]):
1641 dirname = ''
1642 if name[0] == '_':
1643 dirname = name[1:].lower()
1644 cname = name + '.c'
1645 cmodulename = name + 'module.c'
1646 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1647 if macSrcExists(cname):
1648 srcs = [cname]
1649 elif macSrcExists(cmodulename):
1650 srcs = [cmodulename]
1651 elif macSrcExists(dirname, cname):
1652 # XXX(nnorwitz): If all the names ended with module, we
1653 # wouldn't need this condition. ibcarbon is the only one.
1654 srcs = [os.path.join(dirname, cname)]
1655 elif macSrcExists(dirname, cmodulename):
1656 srcs = [os.path.join(dirname, cmodulename)]
1657 else:
1658 raise RuntimeError("%s not found" % name)
1659
1660 # Here's the whole point: add the extension with sources
1661 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1662
1663 # Core Foundation
1664 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1665 'extra_link_args': ['-framework', 'CoreFoundation'],
1666 }
1667 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1668 addMacExtension('autoGIL', core_kwds)
1669
Ronald Oussoren51f06332009-09-20 10:31:22 +00001670
1671
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001672 # Carbon
1673 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1674 'extra_link_args': ['-framework', 'Carbon'],
1675 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001676 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1677 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001678 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001679 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001680 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001681 '_Help', '_Icn', '_IBCarbon', '_List',
1682 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001683 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001684 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001685 for name in CARBON_EXTS:
1686 addMacExtension(name, carbon_kwds)
1687
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001688 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1689 # The _Win extension should build just like the other Carbon extensions, but
1690 # this actually results in a hard crash of the linker.
1691 #
1692 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1693 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1694 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1695 }
1696 addMacExtension('_Win', win_kwds)
1697 else:
1698 addMacExtension('_Win', carbon_kwds)
1699
1700
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001701 # Application Services & QuickTime
1702 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1703 'extra_link_args': ['-framework','ApplicationServices'],
1704 }
1705 addMacExtension('_Launch', app_kwds)
1706 addMacExtension('_CG', app_kwds)
1707
Just van Rossum05ced6a2002-11-24 23:15:57 +00001708 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001709 extra_compile_args=carbon_extra_compile_args,
1710 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001711 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001712
Michael W. Hudson5b109102002-01-23 15:04:41 +00001713
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001714 self.extensions.extend(exts)
1715
1716 # Call the method for detecting whether _tkinter can be compiled
1717 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001718
Skip Montanarod1287322007-03-06 15:41:38 +00001719 if '_tkinter' not in [e.name for e in self.extensions]:
1720 missing.append('_tkinter')
1721
1722 return missing
1723
Jack Jansen0b06be72002-06-21 14:48:38 +00001724 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1725 # The _tkinter module, using frameworks. Since frameworks are quite
1726 # different the UNIX search logic is not sharable.
1727 from os.path import join, exists
1728 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001729 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001730 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001731 join(os.getenv('HOME'), '/Library/Frameworks')
1732 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001733
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001734 sysroot = macosx_sdk_root()
1735
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001736 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001737 # bundles.
1738 # XXX distutils should support -F!
1739 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001740 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001741
1742
Jack Jansen0b06be72002-06-21 14:48:38 +00001743 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001744 if is_macosx_sdk_path(F):
1745 if not exists(join(sysroot, F[1:], fw + '.framework')):
1746 break
1747 else:
1748 if not exists(join(F, fw + '.framework')):
1749 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001750 else:
1751 # ok, F is now directory with both frameworks. Continure
1752 # building
1753 break
1754 else:
1755 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1756 # will now resume.
1757 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001758
Jack Jansen0b06be72002-06-21 14:48:38 +00001759 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1760 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001761 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001762 #
1763 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001764 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001765 for fw in 'Tcl', 'Tk'
1766 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1767 ]
1768
Tim Peters2c60f7a2003-01-29 03:49:43 +00001769 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001770 # complicated search, this is a hard-coded path. It could bail out
1771 # if X11 libs are not found...
1772 include_dirs.append('/usr/X11R6/include')
1773 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1774
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001775 # All existing framework builds of Tcl/Tk don't support 64-bit
1776 # architectures.
1777 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1778 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001779
1780 if is_macosx_sdk_path(F):
1781 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1782 else:
1783 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1784
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001785 detected_archs = []
1786 for ln in fp:
1787 a = ln.split()[-1]
1788 if a in archs:
1789 detected_archs.append(ln.split()[-1])
1790 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001791
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001792 for a in detected_archs:
1793 frameworks.append('-arch')
1794 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001795
Jack Jansen0b06be72002-06-21 14:48:38 +00001796 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1797 define_macros=[('WITH_APPINIT', 1)],
1798 include_dirs = include_dirs,
1799 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001800 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001801 extra_link_args = frameworks,
1802 )
1803 self.extensions.append(ext)
1804 return 1
1805
Tim Peters2c60f7a2003-01-29 03:49:43 +00001806
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001807 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001808 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001809
Jack Jansen0b06be72002-06-21 14:48:38 +00001810 # Rather than complicate the code below, detecting and building
1811 # AquaTk is a separate method. Only one Tkinter will be built on
1812 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001813 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001814 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001815 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001816
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001817 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001818 # The versions with dots are used on Unix, and the versions without
1819 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001820 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001821 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1822 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001823 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001824 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001825 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001826 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001827 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001828 # Exit the loop when we've found the Tcl/Tk libraries
1829 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001830
Fredrik Lundhade711a2001-01-24 08:00:28 +00001831 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001832 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001833 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001834 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001835 dotversion = version
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001836 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001837 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1838 # but the include subdirs are named like .../include/tcl8.3.
1839 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1840 tcl_include_sub = []
1841 tk_include_sub = []
1842 for dir in inc_dirs:
1843 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1844 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1845 tk_include_sub += tcl_include_sub
1846 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1847 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001848
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001849 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001850 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001851 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001852 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001853
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001854 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001855
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001856 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1857 for dir in tcl_includes + tk_includes:
1858 if dir not in include_dirs:
1859 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001860
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001861 # Check for various platform-specific directories
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001862 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001863 include_dirs.append('/usr/openwin/include')
1864 added_lib_dirs.append('/usr/openwin/lib')
1865 elif os.path.exists('/usr/X11R6/include'):
1866 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001867 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001868 added_lib_dirs.append('/usr/X11R6/lib')
1869 elif os.path.exists('/usr/X11R5/include'):
1870 include_dirs.append('/usr/X11R5/include')
1871 added_lib_dirs.append('/usr/X11R5/lib')
1872 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001873 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001874 include_dirs.append('/usr/X11/include')
1875 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001876
Jason Tishler9181c942003-02-05 15:16:17 +00001877 # If Cygwin, then verify that X is installed before proceeding
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001878 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001879 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1880 if x11_inc is None:
1881 return
1882
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001883 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001884 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001885 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001886 defs.append( ('WITH_BLT', 1) )
1887 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001888 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001889 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001890 defs.append( ('WITH_BLT', 1) )
1891 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001892
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001893 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001894 libs.append('tk'+ version)
1895 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001896
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001897 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001898 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001899
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001900 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001901 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001902 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001903
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001904 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1905 define_macros=[('WITH_APPINIT', 1)] + defs,
1906 include_dirs = include_dirs,
1907 libraries = libs,
1908 library_dirs = added_lib_dirs,
1909 )
1910 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001911
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001912## # Uncomment these lines if you want to play with xxmodule.c
1913## ext = Extension('xx', ['xxmodule.c'])
1914## self.extensions.append(ext)
1915
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001916 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001917 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001918 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001919 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001920 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001921 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001922 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001923
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001924 def configure_ctypes_darwin(self, ext):
1925 # Darwin (OS X) uses preconfigured files, in
1926 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001927 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001928 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1929 '_ctypes', 'libffi_osx'))
1930 sources = [os.path.join(ffi_srcdir, p)
1931 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001932 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001933 'x86/x86-darwin.S',
1934 'x86/x86-ffi_darwin.c',
1935 'x86/x86-ffi64.c',
1936 'powerpc/ppc-darwin.S',
1937 'powerpc/ppc-darwin_closure.S',
1938 'powerpc/ppc-ffi_darwin.c',
1939 'powerpc/ppc64-darwin_closure.S',
1940 ]]
1941
1942 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001943 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001944
1945 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1946 os.path.join(ffi_srcdir, 'powerpc')]
1947 ext.include_dirs.extend(include_dirs)
1948 ext.sources.extend(sources)
1949 return True
1950
Thomas Hellereba43c12006-04-07 19:04:09 +00001951 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001952 if not self.use_system_libffi:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001953 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001954 return self.configure_ctypes_darwin(ext)
1955
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001956 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001957 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1958 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1959 '_ctypes', 'libffi'))
1960 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001961
Thomas Heller5e218b42006-04-27 15:50:42 +00001962 from distutils.dep_util import newer_group
1963
1964 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001965 for fname in os.listdir(ffi_srcdir)
1966 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001967 if self.force or newer_group(config_sources,
1968 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001969 from distutils.dir_util import mkpath
1970 mkpath(ffi_builddir)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001971 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
1972 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes6fd32482012-09-06 18:02:49 +02001973 if not self.verbose:
1974 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00001975
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001976 # Pass empty CFLAGS because we'll just append the resulting
1977 # CFLAGS to Python's; -g or -O2 is to be avoided.
1978 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1979 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001980
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001981 res = os.system(cmd)
1982 if res or not os.path.exists(ffi_configfile):
1983 print "Failed to configure _ctypes module"
1984 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001985
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001986 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001987 with open(ffi_configfile) as f:
1988 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001989
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001990 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001991 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001992
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001993 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001994 ffi_builddir,
1995 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001996 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001997
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001998 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1999 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002000 ext.include_dirs.extend(include_dirs)
2001 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00002002 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00002003
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002004 def detect_ctypes(self, inc_dirs, lib_dirs):
2005 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00002006 include_dirs = []
2007 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00002008 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002009 sources = ['_ctypes/_ctypes.c',
2010 '_ctypes/callbacks.c',
2011 '_ctypes/callproc.c',
2012 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00002013 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002014 depends = ['_ctypes/ctypes.h']
2015
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002016 if host_platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00002017 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00002018 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002019 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002020 include_dirs.append('_ctypes/darwin')
2021# XXX Is this still needed?
2022## extra_link_args.extend(['-read_only_relocs', 'warning'])
2023
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002024 elif host_platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00002025 # XXX This shouldn't be necessary; it appears that some
2026 # of the assembler code is non-PIC (i.e. it has relocations
2027 # when it shouldn't. The proper fix would be to rewrite
2028 # the assembler code to be PIC.
2029 # This only works with GCC; the Sun compiler likely refuses
2030 # this option. If you want to compile ctypes with the Sun
2031 # compiler, please research a proper solution, instead of
2032 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00002033 extra_link_args.append('-mimpure-text')
2034
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002035 elif host_platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00002036 extra_link_args.append('-fPIC')
2037
Thomas Hellercf567c12006-03-08 19:51:58 +00002038 ext = Extension('_ctypes',
2039 include_dirs=include_dirs,
2040 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00002041 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002042 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002043 sources=sources,
2044 depends=depends)
2045 ext_test = Extension('_ctypes_test',
2046 sources=['_ctypes/_ctypes_test.c'])
2047 self.extensions.extend([ext, ext_test])
2048
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002049 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
2050 return
2051
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002052 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002053 # OS X 10.5 comes with libffi.dylib; the include files are
2054 # in /usr/include/ffi
2055 inc_dirs.append('/usr/include/ffi')
2056
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002057 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00002058 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002059 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002060 if ffi_inc is not None:
2061 ffi_h = ffi_inc[0] + '/ffi.h'
2062 fp = open(ffi_h)
2063 while 1:
2064 line = fp.readline()
2065 if not line:
2066 ffi_inc = None
2067 break
2068 if line.startswith('#define LIBFFI_H'):
2069 break
2070 ffi_lib = None
2071 if ffi_inc is not None:
2072 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002073 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002074 ffi_lib = lib_name
2075 break
2076
2077 if ffi_inc and ffi_lib:
2078 ext.include_dirs.extend(ffi_inc)
2079 ext.libraries.append(ffi_lib)
2080 self.use_system_libffi = True
2081
2082
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002083class PyBuildInstall(install):
2084 # Suppress the warning about installation into the lib_dynload
2085 # directory, which is not in sys.path when running Python during
2086 # installation:
2087 def initialize_options (self):
2088 install.initialize_options(self)
2089 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002090
Michael W. Hudson529a5052002-12-17 16:47:17 +00002091class PyBuildInstallLib(install_lib):
2092 # Do exactly what install_lib does but make sure correct access modes get
2093 # set on installed directories and files. All installed files with get
2094 # mode 644 unless they are a shared library in which case they will get
2095 # mode 755. All installed directories will get mode 755.
2096
2097 so_ext = sysconfig.get_config_var("SO")
2098
2099 def install(self):
2100 outfiles = install_lib.install(self)
2101 self.set_file_modes(outfiles, 0644, 0755)
2102 self.set_dir_modes(self.install_dir, 0755)
2103 return outfiles
2104
2105 def set_file_modes(self, files, defaultMode, sharedLibMode):
2106 if not self.is_chmod_supported(): return
2107 if not files: return
2108
2109 for filename in files:
2110 if os.path.islink(filename): continue
2111 mode = defaultMode
2112 if filename.endswith(self.so_ext): mode = sharedLibMode
2113 log.info("changing mode of %s to %o", filename, mode)
2114 if not self.dry_run: os.chmod(filename, mode)
2115
2116 def set_dir_modes(self, dirname, mode):
2117 if not self.is_chmod_supported(): return
2118 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2119
2120 def set_dir_modes_visitor(self, mode, dirname, names):
2121 if os.path.islink(dirname): return
2122 log.info("changing mode of %s to %o", dirname, mode)
2123 if not self.dry_run: os.chmod(dirname, mode)
2124
2125 def is_chmod_supported(self):
2126 return hasattr(os, 'chmod')
2127
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002128SUMMARY = """
2129Python is an interpreted, interactive, object-oriented programming
2130language. It is often compared to Tcl, Perl, Scheme or Java.
2131
2132Python combines remarkable power with very clear syntax. It has
2133modules, classes, exceptions, very high level dynamic data types, and
2134dynamic typing. There are interfaces to many system calls and
2135libraries, as well as to various windowing systems (X11, Motif, Tk,
2136Mac, MFC). New built-in modules are easily written in C or C++. Python
2137is also usable as an extension language for applications that need a
2138programmable interface.
2139
2140The Python implementation is portable: it runs on many brands of UNIX,
2141on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2142listed here, it may still be supported, if there's a C compiler for
2143it. Ask around on comp.lang.python -- or just try compiling Python
2144yourself.
2145"""
2146
2147CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002148Development Status :: 6 - Mature
2149License :: OSI Approved :: Python Software Foundation License
2150Natural Language :: English
2151Programming Language :: C
2152Programming Language :: Python
2153Topic :: Software Development
2154"""
2155
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002156def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002157 # turn off warnings when deprecated modules are imported
2158 import warnings
2159 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002160 setup(# PyPI Metadata (PEP 301)
2161 name = "Python",
2162 version = sys.version.split()[0],
2163 url = "http://www.python.org/%s" % sys.version[:3],
2164 maintainer = "Guido van Rossum and the Python community",
2165 maintainer_email = "python-dev@python.org",
2166 description = "A high-level object-oriented programming language",
2167 long_description = SUMMARY.strip(),
2168 license = "PSF license",
2169 classifiers = filter(None, CLASSIFIERS.split("\n")),
2170 platforms = ["Many"],
2171
2172 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002173 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2174 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002175 # The struct module is defined here, because build_ext won't be
2176 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002177 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002178
2179 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002180 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002181 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002182 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002183 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002184
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002185# --install-platlib
2186if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002187 main()