blob: f947478014926454e70d9cfca1a323fbb8dbeb77 [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
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000020# Were we compiled --with-pydebug or with #define Py_DEBUG?
21COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
22
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000023# This global variable is used to hold the list of modules to be disabled.
24disabled_module_list = []
25
Michael W. Hudson39230b32002-01-16 15:26:48 +000026def add_dir_to_list(dirlist, dir):
27 """Add the directory 'dir' to the list 'dirlist' (at the front) if
28 1) 'dir' is not already in 'dirlist'
29 2) 'dir' actually exists, and is a directory."""
Jack Jansen4439b7c2002-06-26 15:44:30 +000030 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
Michael W. Hudson39230b32002-01-16 15:26:48 +000031 dirlist.insert(0, dir)
32
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000033def macosx_sdk_root():
34 """
35 Return the directory of the current OSX SDK,
36 or '/' if no SDK was specified.
37 """
38 cflags = sysconfig.get_config_var('CFLAGS')
39 m = re.search(r'-isysroot\s+(\S+)', cflags)
40 if m is None:
41 sysroot = '/'
42 else:
43 sysroot = m.group(1)
44 return sysroot
45
46def is_macosx_sdk_path(path):
47 """
48 Returns True if 'path' can be located in an OSX SDK
49 """
Ronald Oussorencd172132010-06-27 12:36:16 +000050 return (path.startswith('/usr/') and not path.startswith('/usr/local')) or path.startswith('/System/')
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000051
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000052def find_file(filename, std_dirs, paths):
53 """Searches for the directory where a given file is located,
54 and returns a possibly-empty list of additional directories, or None
55 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000056
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000057 'filename' is the name of a file, such as readline.h or libcrypto.a.
58 'std_dirs' is the list of standard system directories; if the
59 file is found in one of them, no additional directives are needed.
60 'paths' is a list of additional locations to check; if the file is
61 found in one of them, the resulting list will contain the directory.
62 """
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000063 if sys.platform == 'darwin':
64 # Honor the MacOSX SDK setting when one was specified.
65 # An SDK is a directory with the same structure as a real
66 # system, but with only header files and libraries.
67 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000068
69 # Check the standard locations
70 for dir in std_dirs:
71 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000072
73 if sys.platform == 'darwin' and is_macosx_sdk_path(dir):
74 f = os.path.join(sysroot, dir[1:], filename)
75
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000076 if os.path.exists(f): return []
77
78 # Check the additional directories
79 for dir in paths:
80 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000081
82 if sys.platform == 'darwin' and is_macosx_sdk_path(dir):
83 f = os.path.join(sysroot, dir[1:], filename)
84
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000085 if os.path.exists(f):
86 return [dir]
87
88 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000089 return None
90
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000091def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +000092 result = compiler.find_library_file(std_dirs + paths, libname)
93 if result is None:
94 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +000095
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000096 if sys.platform == 'darwin':
97 sysroot = macosx_sdk_root()
98
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +000099 # Check whether the found file is in one of the standard directories
100 dirname = os.path.dirname(result)
101 for p in std_dirs:
102 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000103 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000104
105 if sys.platform == 'darwin' and is_macosx_sdk_path(p):
106 if os.path.join(sysroot, p[1:]) == dirname:
107 return [ ]
108
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000109 if p == dirname:
110 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000111
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000112 # Otherwise, it must have been in one of the additional directories,
113 # so we have to figure out which one.
114 for p in paths:
115 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000116 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000117
118 if sys.platform == 'darwin' and is_macosx_sdk_path(p):
119 if os.path.join(sysroot, p[1:]) == dirname:
120 return [ p ]
121
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000122 if p == dirname:
123 return [p]
124 else:
125 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000126
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000127def module_enabled(extlist, modname):
128 """Returns whether the module 'modname' is present in the list
129 of extensions 'extlist'."""
130 extlist = [ext for ext in extlist if ext.name == modname]
131 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000132
Jack Jansen144ebcc2001-08-05 22:31:19 +0000133def find_module_file(module, dirlist):
134 """Find a module in a set of possible folders. If it is not found
135 return the unadorned filename"""
136 list = find_file(module, [], dirlist)
137 if not list:
138 return module
139 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000140 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000141 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000142
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000143class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000144
Skip Montanarod1287322007-03-06 15:41:38 +0000145 def __init__(self, dist):
146 build_ext.__init__(self, dist)
147 self.failed = []
148
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000149 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000150
151 # Detect which modules should be compiled
Skip Montanarod1287322007-03-06 15:41:38 +0000152 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000153
154 # Remove modules that are present on the disabled list
Christian Heimesb222bbc2008-01-18 09:51:43 +0000155 extensions = [ext for ext in self.extensions
156 if ext.name not in disabled_module_list]
157 # move ctypes to the end, it depends on other modules
158 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
159 if "_ctypes" in ext_map:
160 ctypes = extensions.pop(ext_map["_ctypes"])
161 extensions.append(ctypes)
162 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000163
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000164 # Fix up the autodetected modules, prefixing all the source files
165 # with Modules/ and adding Python's include directory to the path.
166 (srcdir,) = sysconfig.get_config_vars('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000167 if not srcdir:
168 # Maybe running on Windows but not using CYGWIN?
169 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer0189ddc2009-02-06 00:21:55 +0000170 srcdir = os.path.abspath(srcdir)
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000171 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000172
Jack Jansen144ebcc2001-08-05 22:31:19 +0000173 # Platform-dependent module source and include directories
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000174 incdirlist = []
Jack Jansen144ebcc2001-08-05 22:31:19 +0000175 platform = self.get_platform()
Ronald Oussoren9545a232010-05-05 19:09:31 +0000176 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07 +0000177 sysconfig.get_config_var("CONFIG_ARGS")):
Jack Jansen144ebcc2001-08-05 22:31:19 +0000178 # Mac OS X also includes some mac-specific modules
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000179 macmoddir = os.path.join(srcdir, 'Mac/Modules')
Jack Jansen144ebcc2001-08-05 22:31:19 +0000180 moddirlist.append(macmoddir)
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000181 incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000182
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000183 # Fix up the paths for scripts, too
184 self.distribution.scripts = [os.path.join(srcdir, filename)
185 for filename in self.distribution.scripts]
186
Christian Heimes8608d912008-01-25 15:52:11 +0000187 # Python header files
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000188 headers = [sysconfig.get_config_h_filename()]
Tarek Ziadé5633a802010-01-23 09:23:15 +0000189 headers += glob(os.path.join(sysconfig.get_path('platinclude'), "*.h"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000190 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000191 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000192 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000193 if ext.depends is not None:
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000194 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000195 for filename in ext.depends]
Christian Heimes8608d912008-01-25 15:52:11 +0000196 else:
197 ext.depends = []
198 # re-compile extensions if a header file has been changed
199 ext.depends.extend(headers)
200
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000201 # platform specific include directories
202 ext.include_dirs.extend(incdirlist)
203
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000204 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000205 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000206 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000207 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000208
Ronald Oussoren9545a232010-05-05 19:09:31 +0000209 # Parse Modules/Setup and Modules/Setup.local to figure out which
210 # modules are turned on in the file.
211 remove_modules = []
212 for filename in ('Modules/Setup', 'Modules/Setup.local'):
213 input = text_file.TextFile(filename, join_lines=1)
214 while 1:
215 line = input.readline()
216 if not line: break
217 line = line.split()
218 remove_modules.append(line[0])
219 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000220
Ronald Oussoren9545a232010-05-05 19:09:31 +0000221 for ext in self.extensions[:]:
222 if ext.name in remove_modules:
223 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000224
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000225 # When you run "make CC=altcc" or something similar, you really want
226 # those environment variables passed into the setup.py phase. Here's
227 # a small set of useful ones.
228 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000229 args = {}
230 # unfortunately, distutils doesn't let us provide separate C and C++
231 # compilers
232 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000233 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
234 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000235 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000236
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000237 build_ext.build_extensions(self)
238
Skip Montanarod1287322007-03-06 15:41:38 +0000239 longest = max([len(e.name) for e in self.extensions])
240 if self.failed:
241 longest = max(longest, max([len(name) for name in self.failed]))
242
243 def print_three_column(lst):
Georg Brandle95cf1c2007-03-06 17:49:14 +0000244 lst.sort(key=str.lower)
Skip Montanarod1287322007-03-06 15:41:38 +0000245 # guarantee zip() doesn't drop anything
246 while len(lst) % 3:
247 lst.append("")
248 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
249 print "%-*s %-*s %-*s" % (longest, e, longest, f,
250 longest, g)
Skip Montanarod1287322007-03-06 15:41:38 +0000251
252 if missing:
253 print
Georg Brandl40f982f2008-12-28 11:58:49 +0000254 print ("Python build finished, but the necessary bits to build "
255 "these modules were not found:")
Skip Montanarod1287322007-03-06 15:41:38 +0000256 print_three_column(missing)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000257 print ("To find the necessary bits, look in setup.py in"
258 " detect_modules() for the module's name.")
259 print
Skip Montanarod1287322007-03-06 15:41:38 +0000260
261 if self.failed:
262 failed = self.failed[:]
263 print
264 print "Failed to build these modules:"
265 print_three_column(failed)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000266 print
Skip Montanarod1287322007-03-06 15:41:38 +0000267
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000268 def build_extension(self, ext):
269
Thomas Hellereba43c12006-04-07 19:04:09 +0000270 if ext.name == '_ctypes':
Thomas Heller795246c2006-04-07 19:27:56 +0000271 if not self.configure_ctypes(ext):
272 return
Thomas Hellereba43c12006-04-07 19:04:09 +0000273
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000274 try:
275 build_ext.build_extension(self, ext)
276 except (CCompilerError, DistutilsError), why:
277 self.announce('WARNING: building of extension "%s" failed: %s' %
278 (ext.name, sys.exc_info()[1]))
Skip Montanarod1287322007-03-06 15:41:38 +0000279 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000280 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000281 # Workaround for Mac OS X: The Carbon-based modules cannot be
282 # reliably imported into a command-line Python
283 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000284 self.announce(
285 'WARNING: skipping import check for Carbon-based "%s"' %
286 ext.name)
287 return
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000288
289 if self.get_platform() == 'darwin' and (
290 sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
291 # Don't bother doing an import check when an extension was
292 # build with an explicit '-arch' flag on OSX. That's currently
293 # only used to build 32-bit only extensions in a 4-way
294 # universal build and loading 32-bit code into a 64-bit
295 # process will fail.
296 self.announce(
297 'WARNING: skipping import check for "%s"' %
298 ext.name)
299 return
300
Jason Tishler24cf7762002-05-22 16:46:15 +0000301 # Workaround for Cygwin: Cygwin currently has fork issues when many
302 # modules have been imported
303 if self.get_platform() == 'cygwin':
304 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
305 % ext.name)
306 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000307 ext_filename = os.path.join(
308 self.build_lib,
309 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000310 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000311 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000312 except ImportError, why:
Skip Montanarod1287322007-03-06 15:41:38 +0000313 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000314 self.announce('*** WARNING: renaming "%s" since importing it'
315 ' failed: %s' % (ext.name, why), level=3)
316 assert not self.inplace
317 basename, tail = os.path.splitext(ext_filename)
318 newname = basename + "_failed" + tail
319 if os.path.exists(newname):
320 os.remove(newname)
321 os.rename(ext_filename, newname)
322
323 # XXX -- This relies on a Vile HACK in
324 # distutils.command.build_ext.build_extension(). The
325 # _built_objects attribute is stored there strictly for
326 # use here.
327 # If there is a failure, _built_objects may not be there,
328 # so catch the AttributeError and move on.
329 try:
330 for filename in self._built_objects:
331 os.remove(filename)
332 except AttributeError:
333 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000334 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000335 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000336 self.announce('*** WARNING: importing extension "%s" '
337 'failed with %s: %s' % (ext.name, exc_type, why),
338 level=3)
Skip Montanarod1287322007-03-06 15:41:38 +0000339 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000340
Neal Norwitz51dead72003-06-17 02:51:28 +0000341 def get_platform(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000342 # Get value of sys.platform
Neal Norwitz51dead72003-06-17 02:51:28 +0000343 for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
344 if sys.platform.startswith(platform):
345 return platform
346 return sys.platform
Andrew M. Kuchling34febf52001-01-24 03:31:07 +0000347
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000348 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000349 # Ensure that /usr/local is always used
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000350 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
351 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
Michael W. Hudson39230b32002-01-16 15:26:48 +0000352
Brett Cannon516592f2004-12-07 00:42:59 +0000353 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000354 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000355 # We must get the values from the Makefile and not the environment
356 # directly since an inconsistently reproducible issue comes up where
357 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000358 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000359 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000360 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
361 ('LDFLAGS', '-L', self.compiler.library_dirs),
362 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000363 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000364 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000365 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000366 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000367 # all double dashes and any dashes followed by a character
368 # that is not for the option we are dealing with.
369 #
370 # Please note that order of the regex is important! We must
371 # strip out double-dashes first so that we don't end up with
372 # substituting "--Long" to "-Long" and thus lead to "ong" being
373 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000374 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
375 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000376 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000377 # Make sure that allowing args interspersed with options is
378 # allowed
379 parser.allow_interspersed_args = True
380 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000381 parser.add_option(arg_name, dest="dirs", action="append")
382 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000383 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000384 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000385 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000386
Ronald Oussoren24215252010-10-20 13:11:46 +0000387 if os.path.normpath(sys.prefix) != '/usr' \
388 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
389 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
390 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
391 # building a framework with different architectures than
392 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000393 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000394 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000395 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000396 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000397
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000398 try:
399 have_unicode = unicode
400 except NameError:
401 have_unicode = 0
402
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000403 # lib_dirs and inc_dirs are used to search for files;
404 # if a file is found in one of those directories, it can
405 # be assumed that no additional -I,-L directives are needed.
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000406 lib_dirs = self.compiler.library_dirs + [
Martin v. Löwisfba73692004-11-13 11:13:35 +0000407 '/lib64', '/usr/lib64',
408 '/lib', '/usr/lib',
409 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000410 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000411 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000412 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000413
Brett Cannon4454a1f2005-04-15 20:32:39 +0000414 config_h = sysconfig.get_config_h_filename()
415 config_h_vars = sysconfig.parse_config_h(open(config_h))
416
Fredrik Lundhade711a2001-01-24 08:00:28 +0000417 platform = self.get_platform()
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000418 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000419
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000420 # Check for AtheOS which has libraries in non-standard locations
421 if platform == 'atheos':
422 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
423 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
424 inc_dirs += ['/system/include', '/atheos/autolnk/include']
425 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
426
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000427 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
428 if platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000429 lib_dirs += ['/usr/ccs/lib']
430
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000431 if platform == 'darwin':
432 # This should work on any unixy platform ;-)
433 # If the user has bothered specifying additional -I and -L flags
434 # in OPT and LDFLAGS we might as well use them here.
435 # NOTE: using shlex.split would technically be more correct, but
436 # also gives a bootstrap problem. Let's hope nobody uses directories
437 # with whitespace in the name to store libraries.
438 cflags, ldflags = sysconfig.get_config_vars(
439 'CFLAGS', 'LDFLAGS')
440 for item in cflags.split():
441 if item.startswith('-I'):
442 inc_dirs.append(item[2:])
443
444 for item in ldflags.split():
445 if item.startswith('-L'):
446 lib_dirs.append(item[2:])
447
Fredrik Lundhade711a2001-01-24 08:00:28 +0000448 # Check for MacOS X, which doesn't need libm.a at all
449 math_libs = ['m']
Ronald Oussoren9545a232010-05-05 19:09:31 +0000450 if platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000451 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000452
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000453 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
454
455 #
456 # The following modules are all pretty straightforward, and compile
457 # on pretty much any POSIXish platform.
458 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000459
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000460 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000461 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000462
463 # array objects
464 exts.append( Extension('array', ['arraymodule.c']) )
465 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000466 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
467 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000468 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000469 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000470 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000471 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000472 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000473 # fast string operations implemented in C
474 exts.append( Extension('strop', ['stropmodule.c']) )
475 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000476 exts.append( Extension('time', ['timemodule.c'],
477 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000478 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000479 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000480 # fast iterator tools implemented in C
481 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000482 # code that will be builtins in the future, but conflict with the
483 # current builtins
484 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000485 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000486 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000487 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000488 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000489 # bisect
490 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000491 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000492 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000493 # operator.add() and similar goodies
494 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000495 # Python 3.1 _io library
496 exts.append( Extension("_io",
497 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
498 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
499 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000500 # _functools
501 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000502 # _json speedups
503 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000504 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000505 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
506 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000507 # profilers (_lsprof is for cProfile.py)
508 exts.append( Extension('_hotshot', ['_hotshot.c']) )
509 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000510 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000511 if have_unicode:
512 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000513 else:
514 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000515 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000516 data = open('pyconfig.h').read()
517 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
518 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000519 locale_libs = ['intl']
520 else:
521 locale_libs = []
Jack Jansen84b74472004-07-15 19:56:25 +0000522 if platform == 'darwin':
523 locale_extra_link_args = ['-framework', 'CoreFoundation']
524 else:
525 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000526
Jack Jansen84b74472004-07-15 19:56:25 +0000527
Jason Tishlerd28216b2002-08-14 11:13:52 +0000528 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000529 libraries=locale_libs,
530 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000531
532 # Modules with some UNIX dependencies -- on by default:
533 # (If you have a really backward UNIX, select and socket may not be
534 # supported...)
535
536 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000537 libs = []
538 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
539 # May be necessary on AIX for flock function
540 libs = ['bsd']
541 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000542 # pwd(3)
543 exts.append( Extension('pwd', ['pwdmodule.c']) )
544 # grp(3)
545 exts.append( Extension('grp', ['grpmodule.c']) )
546 # spwd, shadow passwords
547 if (config_h_vars.get('HAVE_GETSPNAM', False) or
548 config_h_vars.get('HAVE_GETSPENT', False)):
549 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000550 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000551 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000552
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000553 # select(2); not on ancient System V
554 exts.append( Extension('select', ['selectmodule.c']) )
555
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000556 # Fred Drake's interface to the Python parser
557 exts.append( Extension('parser', ['parsermodule.c']) )
558
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000559 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000560 exts.append( Extension('cStringIO', ['cStringIO.c']) )
561 exts.append( Extension('cPickle', ['cPickle.c']) )
562
563 # Memory-mapped files (also works on Win32).
Ronald Oussoren9545a232010-05-05 19:09:31 +0000564 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000565 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000566 else:
567 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000568
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000569 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000570 # syslog daemon interface
571 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000572
573 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000574 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
575 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
576 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000577
578 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000579 # Here ends the simple stuff. From here on, modules need certain
580 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000581 #
582
583 # Multimedia modules
584 # These don't work for 64-bit platforms!!!
585 # These represent audio samples or images as strings:
586
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000587 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000588 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000589 # 64-bit platforms.
590 exts.append( Extension('audioop', ['audioop.c']) )
591
Fredrik Lundhade711a2001-01-24 08:00:28 +0000592 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000593 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000594 # Operations on images
595 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000596 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000597 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000598
599 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000600 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000601 readline_termcap_library = ""
602 curses_library = ""
603 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000604 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000605 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000606 ldd_output = fp.readlines()
607 ret = fp.close()
608 if ret is None or ret >> 8 == 0:
609 for ln in ldd_output:
610 if 'curses' in ln:
611 readline_termcap_library = re.sub(
612 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
613 ).rstrip()
614 break
615 if 'tinfo' in ln: # termcap interface split out from ncurses
616 readline_termcap_library = 'tinfo'
617 break
Stefan Krah449aa862010-06-03 12:39:50 +0000618 # Issue 7384: If readline is already linked against curses,
619 # use the same library for the readline and curses modules.
620 if 'curses' in readline_termcap_library:
621 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000622 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000623 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000624 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000625 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000626 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000627 curses_library = 'curses'
628
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000629 if platform == 'darwin':
630 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000631 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
632 if dep_target and dep_target.split('.') < ['10', '5']:
633 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000634 if os_release < 9:
635 # MacOSX 10.4 has a broken readline. Don't try to build
636 # the readline module unless the user has installed a fixed
637 # readline package
638 if find_file('readline/rlconf.h', inc_dirs, []) is None:
639 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000640 if do_readline:
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000641 if platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000642 # In every directory on the search path search for a dynamic
643 # library and then a static library, instead of first looking
644 # for dynamic libraries on the entiry path.
645 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000646 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000647 readline_extra_link_args = ('-Wl,-search_paths_first',)
648 else:
649 readline_extra_link_args = ()
650
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000651 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000652 if readline_termcap_library:
653 pass # Issue 7384: Already linked against curses or tinfo.
654 elif curses_library:
655 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000656 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000657 ['/usr/lib/termcap'],
658 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000659 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000660 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000661 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000662 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000663 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000664 else:
665 missing.append('readline')
666
Ronald Oussoren9545a232010-05-05 19:09:31 +0000667 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000668
Ronald Oussoren9545a232010-05-05 19:09:31 +0000669 if self.compiler.find_library_file(lib_dirs, 'crypt'):
670 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000671 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000672 libs = []
673 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000674
Skip Montanaroba9e9782003-03-20 23:34:22 +0000675 # CSV files
676 exts.append( Extension('_csv', ['_csv.c']) )
677
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000678 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000679 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000680 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000681 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000682 search_for_ssl_incs_in = [
683 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000684 '/usr/contrib/ssl/include/'
685 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000686 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
687 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000688 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000689 if ssl_incs is not None:
690 krb5_h = find_file('krb5.h', inc_dirs,
691 ['/usr/kerberos/include'])
692 if krb5_h:
693 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000694 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000695 ['/usr/local/ssl/lib',
696 '/usr/contrib/ssl/lib/'
697 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000698
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000699 if (ssl_incs is not None and
700 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000701 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000702 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000703 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000704 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000705 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000706 else:
707 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000708
Gregory P. Smithade97332005-08-23 21:19:40 +0000709 # find out which version of OpenSSL we have
710 openssl_ver = 0
711 openssl_ver_re = re.compile(
712 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000713
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000714 # look for the openssl version header on the compiler search path.
715 opensslv_h = find_file('openssl/opensslv.h', [],
716 inc_dirs + search_for_ssl_incs_in)
717 if opensslv_h:
718 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
719 if sys.platform == 'darwin' and is_macosx_sdk_path(name):
720 name = os.path.join(macosx_sdk_root(), name[1:])
721 try:
722 incfile = open(name, 'r')
723 for line in incfile:
724 m = openssl_ver_re.match(line)
725 if m:
726 openssl_ver = eval(m.group(1))
727 except IOError, msg:
728 print "IOError while reading opensshv.h:", msg
729 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000730
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000731 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000732 have_any_openssl = ssl_incs is not None and ssl_libs is not None
733 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000734 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000735
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000736 if have_any_openssl:
737 if have_usable_openssl:
738 # The _hashlib module wraps optimized implementations
739 # of hash functions from the OpenSSL library.
740 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
741 include_dirs = ssl_incs,
742 library_dirs = ssl_libs,
743 libraries = ['ssl', 'crypto']) )
744 else:
745 print ("warning: openssl 0x%08x is too old for _hashlib" %
746 openssl_ver)
747 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000748 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000749 # The _sha module implements the SHA1 hash algorithm.
750 exts.append( Extension('_sha', ['shamodule.c']) )
751 # The _md5 module implements the RSA Data Security, Inc. MD5
752 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000753 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000754 exts.append( Extension('_md5',
755 sources = ['md5module.c', 'md5.c'],
756 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000757
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000758 min_sha2_openssl_ver = 0x00908000
759 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000760 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
761 exts.append( Extension('_sha256', ['sha256module.c']) )
762 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000763
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000764 # Modules that provide persistent dictionary-like semantics. You will
765 # probably want to arrange for at least one of them to be available on
766 # your machine, though none are defined by default because of library
767 # dependencies. The Python module anydbm.py provides an
768 # implementation independent wrapper for these; dumbdbm.py provides
769 # similar functionality (but slower of course) implemented in Python.
770
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000771 # Sleepycat^WOracle Berkeley DB interface.
772 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000773 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000774 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000775 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000776 # a release. Most open source OSes come with one or more
777 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000778
Matthias Klose54cc5392010-03-15 12:46:18 +0000779 max_db_ver = (4, 8)
Jesus Cea6557aac2010-03-22 14:22:26 +0000780 min_db_ver = (4, 1)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000781 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000782
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000783 def allow_db_ver(db_ver):
784 """Returns a boolean if the given BerkeleyDB version is acceptable.
785
786 Args:
787 db_ver: A tuple of the version to verify.
788 """
789 if not (min_db_ver <= db_ver <= max_db_ver):
790 return False
791 # Use this function to filter out known bad configurations.
792 if (4, 6) == db_ver[:2]:
793 # BerkeleyDB 4.6.x is not stable on many architectures.
794 arch = platform_machine()
795 if arch not in ('i386', 'i486', 'i586', 'i686',
796 'x86_64', 'ia64'):
797 return False
798 return True
799
800 def gen_db_minor_ver_nums(major):
801 if major == 4:
802 for x in range(max_db_ver[1]+1):
803 if allow_db_ver((4, x)):
804 yield x
805 elif major == 3:
806 for x in (3,):
807 if allow_db_ver((3, x)):
808 yield x
809 else:
810 raise ValueError("unknown major BerkeleyDB version", major)
811
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000812 # construct a list of paths to look for the header file in on
813 # top of the normal inc_dirs.
814 db_inc_paths = [
815 '/usr/include/db4',
816 '/usr/local/include/db4',
817 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000818 '/usr/include/db3',
819 '/usr/local/include/db3',
820 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000821 # Fink defaults (http://fink.sourceforge.net/)
822 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000823 '/sw/include/db3',
824 ]
825 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000826 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000827 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000828 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000829 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
830 db_inc_paths.append('/usr/local/include/db4%d' % x)
831 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000832 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000833 # MacPorts default (http://www.macports.org/)
834 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000835 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000836 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000837 db_inc_paths.append('/usr/include/db3%d' % x)
838 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
839 db_inc_paths.append('/usr/local/include/db3%d' % x)
840 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000841 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000842
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000843 # Add some common subdirectories for Sleepycat DB to the list,
844 # based on the standard include directories. This way DB3/4 gets
845 # picked up when it is installed in a non-standard prefix and
846 # the user has added that prefix into inc_dirs.
847 std_variants = []
848 for dn in inc_dirs:
849 std_variants.append(os.path.join(dn, 'db3'))
850 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000851 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000852 std_variants.append(os.path.join(dn, "db4%d"%x))
853 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000854 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000855 std_variants.append(os.path.join(dn, "db3%d"%x))
856 std_variants.append(os.path.join(dn, "db3.%d"%x))
857
Tim Peters38ff36c2006-06-30 06:18:39 +0000858 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000859 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000860
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000861 db_ver_inc_map = {}
862
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000863 if sys.platform == 'darwin':
864 sysroot = macosx_sdk_root()
865
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000866 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000867 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000868 # See whether there is a Sleepycat header in the standard
869 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000870 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000871 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000872
873 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
874 f = os.path.join(sysroot, d[1:], "db.h")
875
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000876 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000877 if os.path.exists(f):
878 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000879 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000880 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000881 db_major = int(m.group(1))
882 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
883 db_minor = int(m.group(1))
884 db_ver = (db_major, db_minor)
885
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000886 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
887 if db_ver == (4, 6):
888 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
889 db_patch = int(m.group(1))
890 if db_patch < 21:
891 print "db.h:", db_ver, "patch", db_patch,
892 print "being ignored (4.6.x must be >= 4.6.21)"
893 continue
894
Antoine Pitrou8c510e72010-01-13 11:47:49 +0000895 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000896 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000897 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +0000898 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000899 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000900 if db_setup_debug:
901 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000902 else:
903 # we already found a header for this library version
904 if db_setup_debug: print "db.h: ignoring", d
905 else:
906 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +0000907 if db_setup_debug:
908 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000909
910 db_found_vers = db_ver_inc_map.keys()
911 db_found_vers.sort()
912
913 while db_found_vers:
914 db_ver = db_found_vers.pop()
915 db_incdir = db_ver_inc_map[db_ver]
916
917 # check lib directories parallel to the location of the header
918 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +0000919 db_incdir.replace("include", 'lib64'),
920 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000921 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000922
923 if sys.platform != 'darwin':
924 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
925
926 else:
927 # Same as other branch, but takes OSX SDK into account
928 tmp = []
929 for dn in db_dirs_to_check:
930 if is_macosx_sdk_path(dn):
931 if os.path.isdir(os.path.join(sysroot, dn[1:])):
932 tmp.append(dn)
933 else:
934 if os.path.isdir(dn):
935 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +0000936 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000937
938 # Look for a version specific db-X.Y before an ambiguoius dbX
939 # XXX should we -ever- look for a dbX name? Do any
940 # systems really not name their library by version and
941 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +0000942 for dblib in (('db-%d.%d' % db_ver),
943 ('db%d%d' % db_ver),
944 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000945 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000946 db_dirs_to_check + lib_dirs, dblib )
947 if dblib_file:
948 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
949 raise db_found
950 else:
951 if db_setup_debug: print "db lib: ", dblib, "not found"
952
953 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +0000954 if db_setup_debug:
955 print "bsddb using BerkeleyDB lib:", db_ver, dblib
956 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000957 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +0000958 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000959 # We add the runtime_library_dirs argument because the
960 # BerkeleyDB lib we're linking against often isn't in the
961 # system dynamic library search path. This is usually
962 # correct and most trouble free, but may cause problems in
963 # some unusual system configurations (e.g. the directory
964 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000965 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +0000966 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000967 library_dirs=dblib_dir,
968 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000969 include_dirs=db_incs,
970 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +0000971 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000972 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +0000973 db_incs = None
974 dblibs = []
975 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +0000976 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +0000977
Anthony Baxterc51ee692006-04-01 00:57:31 +0000978 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000979 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +0000980
Anthony Baxter3dc6bb32006-04-03 02:20:49 +0000981 # We hunt for #define SQLITE_VERSION "n.n.n"
982 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +0000983 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +0000984 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +0000985 '/usr/include/sqlite',
986 '/usr/include/sqlite3',
987 '/usr/local/include',
988 '/usr/local/include/sqlite',
989 '/usr/local/include/sqlite3',
990 ]
Anthony Baxter3dc6bb32006-04-03 02:20:49 +0000991 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
992 MIN_SQLITE_VERSION = ".".join([str(x)
993 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000994
995 # Scan the default include directories before the SQLite specific
996 # ones. This allows one to override the copy of sqlite on OSX,
997 # where /usr/include contains an old version of sqlite.
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000998 if sys.platform == 'darwin':
999 sysroot = macosx_sdk_root()
1000
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001001 for d in inc_dirs + sqlite_inc_paths:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001002 f = os.path.join(d, "sqlite3.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001003
1004 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
1005 f = os.path.join(sysroot, d[1:], "sqlite3.h")
1006
Anthony Baxterc51ee692006-04-01 00:57:31 +00001007 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001008 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001009 incf = open(f).read()
1010 m = re.search(
1011 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001012 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001013 sqlite_version = m.group(1)
1014 sqlite_version_tuple = tuple([int(x)
1015 for x in sqlite_version.split(".")])
1016 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001017 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001018 if sqlite_setup_debug:
1019 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001020 sqlite_incdir = d
1021 break
1022 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001023 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001024 print "%s: version %d is too old, need >= %s"%(d,
1025 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001026 elif sqlite_setup_debug:
1027 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1028
Anthony Baxterc51ee692006-04-01 00:57:31 +00001029 if sqlite_incdir:
1030 sqlite_dirs_to_check = [
1031 os.path.join(sqlite_incdir, '..', 'lib64'),
1032 os.path.join(sqlite_incdir, '..', 'lib'),
1033 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1034 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1035 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001036 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001037 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001038 if sqlite_libfile:
1039 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001040
1041 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001042 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001043 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001044 '_sqlite/cursor.c',
1045 '_sqlite/microprotocols.c',
1046 '_sqlite/module.c',
1047 '_sqlite/prepare_protocol.c',
1048 '_sqlite/row.c',
1049 '_sqlite/statement.c',
1050 '_sqlite/util.c', ]
1051
Anthony Baxterc51ee692006-04-01 00:57:31 +00001052 sqlite_defines = []
1053 if sys.platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001054 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001055 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001056 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1057
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001058 # Comment this out if you want the sqlite3 module to be able to load extensions.
1059 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001060
1061 if sys.platform == 'darwin':
1062 # In every directory on the search path search for a dynamic
1063 # library and then a static library, instead of first looking
1064 # for dynamic libraries on the entiry path.
1065 # This way a staticly linked custom sqlite gets picked up
1066 # before the dynamic library in /usr/lib.
1067 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1068 else:
1069 sqlite_extra_link_args = ()
1070
Anthony Baxterc51ee692006-04-01 00:57:31 +00001071 exts.append(Extension('_sqlite3', sqlite_srcs,
1072 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001073 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001074 sqlite_incdir],
1075 library_dirs=sqlite_libdir,
1076 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001077 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001078 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001079 else:
1080 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001081
1082 # Look for Berkeley db 1.85. Note that it is built as a different
1083 # module name so it can be included even when later versions are
1084 # available. A very restrictive search is performed to avoid
1085 # accidentally building this module with a later version of the
1086 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1087 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001088 #
1089 # If the better bsddb library can be built (db_incs is defined)
1090 # we do not build this one. Otherwise this build will pick up
1091 # the more recent berkeleydb's db.h file first in the include path
1092 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001093 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001094
1095 if sys.platform == 'darwin':
1096 if is_macosx_sdk_path(f):
1097 sysroot = macosx_sdk_root()
1098 f = os.path.join(sysroot, f[1:])
1099
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001100 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001101 data = open(f).read()
1102 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1103 if m is not None:
1104 # bingo - old version used hash file format version 2
1105 ### XXX this should be fixed to not be platform-dependent
1106 ### but I don't have direct access to an osf1 platform and
1107 ### seemed to be muffing the search somehow
1108 libraries = platform == "osf1" and ['db'] or None
1109 if libraries is not None:
1110 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1111 libraries=libraries))
1112 else:
1113 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001114 else:
1115 missing.append('bsddb185')
1116 else:
1117 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001118
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001119 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001120 # The standard Unix dbm module:
Jack Jansend1b20452002-07-08 21:39:36 +00001121 if platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001122 config_args = [arg.strip("'")
1123 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001124 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001125 if arg.startswith('--with-dbmliborder=')]
1126 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001127 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001128 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001129 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001130 dbmext = None
1131 for cand in dbm_order:
1132 if cand == "ndbm":
1133 if find_file("ndbm.h", inc_dirs, []) is not None:
1134 # Some systems have -lndbm, others don't
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001135 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001136 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001137 ndbm_libs = ['ndbm']
1138 else:
1139 ndbm_libs = []
1140 print "building dbm using ndbm"
1141 dbmext = Extension('dbm', ['dbmmodule.c'],
1142 define_macros=[
1143 ('HAVE_NDBM_H',None),
1144 ],
1145 libraries=ndbm_libs)
1146 break
1147
1148 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001149 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001150 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001151 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001152 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001153 gdbm_libs.append('gdbm_compat')
1154 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1155 print "building dbm using gdbm"
1156 dbmext = Extension(
1157 'dbm', ['dbmmodule.c'],
1158 define_macros=[
1159 ('HAVE_GDBM_NDBM_H', None),
1160 ],
1161 libraries = gdbm_libs)
1162 break
1163 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1164 print "building dbm using gdbm"
1165 dbmext = Extension(
1166 'dbm', ['dbmmodule.c'],
1167 define_macros=[
1168 ('HAVE_GDBM_DASH_NDBM_H', None),
1169 ],
1170 libraries = gdbm_libs)
1171 break
1172 elif cand == "bdb":
1173 if db_incs is not None:
1174 print "building dbm using bdb"
1175 dbmext = Extension('dbm', ['dbmmodule.c'],
1176 library_dirs=dblib_dir,
1177 runtime_library_dirs=dblib_dir,
1178 include_dirs=db_incs,
1179 define_macros=[
1180 ('HAVE_BERKDB_H', None),
1181 ('DB_DBM_HSEARCH', None),
1182 ],
1183 libraries=dblibs)
1184 break
1185 if dbmext is not None:
1186 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001187 else:
1188 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001189
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001190 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001191 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001192 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001193 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1194 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001195 else:
1196 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001197
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001198 # Unix-only modules
Ronald Oussoren9545a232010-05-05 19:09:31 +00001199 if platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001200 # Steen Lumholt's termios module
1201 exts.append( Extension('termios', ['termios.c']) )
1202 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43 +00001203 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001204 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001205 else:
1206 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001207
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001208 # Sun yellow pages. Some systems have the functions in libc.
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001209 if (platform not in ['cygwin', 'atheos', 'qnx6'] and
1210 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001211 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001212 libs = ['nsl']
1213 else:
1214 libs = []
1215 exts.append( Extension('nis', ['nismodule.c'],
1216 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001217 else:
1218 missing.append('nis')
1219 else:
1220 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001221
Skip Montanaro72092942004-02-07 12:50:19 +00001222 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001223 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001224 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001225 if curses_library.startswith('ncurses'):
1226 if curses_library == 'ncursesw':
1227 # Bug 1464056: If _curses.so links with ncursesw,
1228 # _curses_panel.so must link with panelw.
1229 panel_library = 'panelw'
1230 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001231 exts.append( Extension('_curses', ['_cursesmodule.c'],
1232 libraries = curses_libs) )
Stefan Krah449aa862010-06-03 12:39:50 +00001233 elif curses_library == 'curses' and platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001234 # OSX has an old Berkeley curses, not good enough for
1235 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001236 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001237 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001238 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001239 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001240 else:
1241 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001242
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001243 exts.append( Extension('_curses', ['_cursesmodule.c'],
1244 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001245 else:
1246 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001247
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001248 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001249 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001250 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001251 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001252 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001253 else:
1254 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001255
Barry Warsaw259b1e12002-08-13 20:09:26 +00001256 # Andrew Kuchling's zlib module. Note that some versions of zlib
1257 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1258 # http://www.cert.org/advisories/CA-2002-07.html
1259 #
1260 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1261 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1262 # now, we still accept 1.1.3, because we think it's difficult to
1263 # exploit this in Python, and we'd rather make it RedHat's problem
1264 # than our problem <wink>.
1265 #
1266 # You can upgrade zlib to version 1.1.4 yourself by going to
1267 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001268 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001269 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001270 if zlib_inc is not None:
1271 zlib_h = zlib_inc[0] + '/zlib.h'
1272 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001273 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001274 fp = open(zlib_h)
1275 while 1:
1276 line = fp.readline()
1277 if not line:
1278 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001279 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001280 version = line.split()[2]
1281 break
1282 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001283 if (self.compiler.find_library_file(lib_dirs, 'z')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001284 if sys.platform == "darwin":
1285 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1286 else:
1287 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001288 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001289 libraries = ['z'],
1290 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001291 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001292 else:
1293 missing.append('zlib')
1294 else:
1295 missing.append('zlib')
1296 else:
1297 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001298
Gregory P. Smith440ca772008-03-24 00:08:01 +00001299 # Helper module for various ascii-encoders. Uses zlib for an optimized
1300 # crc32 if we have it. Otherwise binascii uses its own.
1301 if have_zlib:
1302 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1303 libraries = ['z']
1304 extra_link_args = zlib_extra_link_args
1305 else:
1306 extra_compile_args = []
1307 libraries = []
1308 extra_link_args = []
1309 exts.append( Extension('binascii', ['binascii.c'],
1310 extra_compile_args = extra_compile_args,
1311 libraries = libraries,
1312 extra_link_args = extra_link_args) )
1313
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001314 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001315 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001316 if sys.platform == "darwin":
1317 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1318 else:
1319 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001320 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001321 libraries = ['bz2'],
1322 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001323 else:
1324 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001325
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001326 # Interface to the Expat XML parser
1327 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001328 # Expat was written by James Clark and is now maintained by a group of
1329 # developers on SourceForge; see www.libexpat.org for more information.
1330 # The pyexpat module was written by Paul Prescod after a prototype by
1331 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1332 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001333 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001334 #
1335 # More information on Expat can be found at www.libexpat.org.
1336 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001337 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1338 expat_inc = []
1339 define_macros = []
1340 expat_lib = ['expat']
1341 expat_sources = []
1342 else:
1343 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1344 define_macros = [
1345 ('HAVE_EXPAT_CONFIG_H', '1'),
1346 ]
1347 expat_lib = []
1348 expat_sources = ['expat/xmlparse.c',
1349 'expat/xmlrole.c',
1350 'expat/xmltok.c']
Ronald Oussoren988117f2006-04-29 11:31:35 +00001351
Fred Drake2d59a492003-10-21 15:41:15 +00001352 exts.append(Extension('pyexpat',
1353 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001354 include_dirs = expat_inc,
1355 libraries = expat_lib,
1356 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001357 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001358
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001359 # Fredrik Lundh's cElementTree module. Note that this also
1360 # uses expat (via the CAPI hook in pyexpat).
1361
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001362 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001363 define_macros.append(('USE_PYEXPAT_CAPI', None))
1364 exts.append(Extension('_elementtree',
1365 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001366 include_dirs = expat_inc,
1367 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001368 sources = ['_elementtree.c'],
1369 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001370 else:
1371 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001372
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001373 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001374 if have_unicode:
1375 exts.append(Extension('_multibytecodec',
1376 ['cjkcodecs/multibytecodec.c']))
1377 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001378 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001379 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001380 else:
1381 missing.append('_multibytecodec')
1382 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1383 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001384
Michael W. Hudson5b109102002-01-23 15:04:41 +00001385 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001386 if sys.maxint == 0x7fffffff:
1387 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1388 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Anthony Baxter82201742006-04-09 15:07:40 +00001389 if (dl_inc is not None) and (platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001390 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001391 else:
1392 missing.append('dl')
1393 else:
1394 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001395
Thomas Hellercf567c12006-03-08 19:51:58 +00001396 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001397 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001398
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001399 # Richard Oudkerk's multiprocessing module
1400 if platform == 'win32': # Windows
1401 macros = dict()
1402 libraries = ['ws2_32']
1403
1404 elif platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001405 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001406 libraries = []
1407
1408 elif platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001409 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001410 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001411
Martin v. Löwisbb86d832008-11-04 20:40:09 +00001412 elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001413 # FreeBSD's P1003.1b semaphore support is very experimental
1414 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001415 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001416 libraries = []
1417
Jesse Noller37040cd2008-09-30 00:15:45 +00001418 elif platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001419 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001420 libraries = []
1421
Jesse Noller40a61642009-03-31 18:12:35 +00001422 elif platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001423 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001424 libraries = []
1425
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001426 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001427 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001428 libraries = ['rt']
1429
1430 if platform == 'win32':
1431 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1432 '_multiprocessing/semaphore.c',
1433 '_multiprocessing/pipe_connection.c',
1434 '_multiprocessing/socket_connection.c',
1435 '_multiprocessing/win32_functions.c'
1436 ]
1437
1438 else:
1439 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1440 '_multiprocessing/socket_connection.c'
1441 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001442 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001443 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001444 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1445
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001446 if sysconfig.get_config_var('WITH_THREAD'):
1447 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1448 define_macros=macros.items(),
1449 include_dirs=["Modules/_multiprocessing"]))
1450 else:
1451 missing.append('_multiprocessing')
1452
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001453 # End multiprocessing
1454
1455
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001456 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001457 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001458 # Linux-specific modules
1459 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001460 else:
1461 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001462
Matthias Klose8a96d202010-04-21 22:18:52 +00001463 if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1464 'freebsd7', 'freebsd8')
1465 or platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001466 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001467 else:
1468 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001469
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001470 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001471 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001472 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001473 else:
1474 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001475
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001476 if platform == 'darwin':
1477 # _scproxy
1478 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1479 extra_link_args= [
1480 '-framework', 'SystemConfiguration',
1481 '-framework', 'CoreFoundation'
1482 ]))
1483
1484
Tim Peters66cb0182004-08-26 05:23:19 +00001485 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001486 sysconfig.get_config_var("CONFIG_ARGS")):
1487
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001488 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001489 # We're on Mac OS X 10.4 or later, the compiler should
1490 # support '-Wno-deprecated-declarations'. This will
1491 # surpress deprecation warnings for the Carbon extensions,
1492 # these extensions wrap the Carbon APIs and even those
1493 # parts that are deprecated.
1494 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1495 else:
1496 carbon_extra_compile_args = []
1497
Just van Rossum05ced6a2002-11-24 23:15:57 +00001498 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001499 def macSrcExists(name1, name2=''):
1500 if not name1:
1501 return None
1502 names = (name1,)
1503 if name2:
1504 names = (name1, name2)
1505 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1506 return os.path.exists(path)
1507
1508 def addMacExtension(name, kwds, extra_srcs=[]):
1509 dirname = ''
1510 if name[0] == '_':
1511 dirname = name[1:].lower()
1512 cname = name + '.c'
1513 cmodulename = name + 'module.c'
1514 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1515 if macSrcExists(cname):
1516 srcs = [cname]
1517 elif macSrcExists(cmodulename):
1518 srcs = [cmodulename]
1519 elif macSrcExists(dirname, cname):
1520 # XXX(nnorwitz): If all the names ended with module, we
1521 # wouldn't need this condition. ibcarbon is the only one.
1522 srcs = [os.path.join(dirname, cname)]
1523 elif macSrcExists(dirname, cmodulename):
1524 srcs = [os.path.join(dirname, cmodulename)]
1525 else:
1526 raise RuntimeError("%s not found" % name)
1527
1528 # Here's the whole point: add the extension with sources
1529 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1530
1531 # Core Foundation
1532 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1533 'extra_link_args': ['-framework', 'CoreFoundation'],
1534 }
1535 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1536 addMacExtension('autoGIL', core_kwds)
1537
Ronald Oussoren51f06332009-09-20 10:31:22 +00001538
1539
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001540 # Carbon
1541 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1542 'extra_link_args': ['-framework', 'Carbon'],
1543 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001544 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1545 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001546 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001547 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001548 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001549 '_Help', '_Icn', '_IBCarbon', '_List',
1550 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001551 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001552 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001553 for name in CARBON_EXTS:
1554 addMacExtension(name, carbon_kwds)
1555
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001556 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1557 # The _Win extension should build just like the other Carbon extensions, but
1558 # this actually results in a hard crash of the linker.
1559 #
1560 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1561 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1562 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1563 }
1564 addMacExtension('_Win', win_kwds)
1565 else:
1566 addMacExtension('_Win', carbon_kwds)
1567
1568
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001569 # Application Services & QuickTime
1570 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1571 'extra_link_args': ['-framework','ApplicationServices'],
1572 }
1573 addMacExtension('_Launch', app_kwds)
1574 addMacExtension('_CG', app_kwds)
1575
Just van Rossum05ced6a2002-11-24 23:15:57 +00001576 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001577 extra_compile_args=carbon_extra_compile_args,
1578 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001579 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001580
Michael W. Hudson5b109102002-01-23 15:04:41 +00001581
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001582 self.extensions.extend(exts)
1583
1584 # Call the method for detecting whether _tkinter can be compiled
1585 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001586
Skip Montanarod1287322007-03-06 15:41:38 +00001587 if '_tkinter' not in [e.name for e in self.extensions]:
1588 missing.append('_tkinter')
1589
1590 return missing
1591
Jack Jansen0b06be72002-06-21 14:48:38 +00001592 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1593 # The _tkinter module, using frameworks. Since frameworks are quite
1594 # different the UNIX search logic is not sharable.
1595 from os.path import join, exists
1596 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001597 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001598 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001599 join(os.getenv('HOME'), '/Library/Frameworks')
1600 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001601
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001602 sysroot = macosx_sdk_root()
1603
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001604 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001605 # bundles.
1606 # XXX distutils should support -F!
1607 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001608 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001609
1610
Jack Jansen0b06be72002-06-21 14:48:38 +00001611 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001612 if is_macosx_sdk_path(F):
1613 if not exists(join(sysroot, F[1:], fw + '.framework')):
1614 break
1615 else:
1616 if not exists(join(F, fw + '.framework')):
1617 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001618 else:
1619 # ok, F is now directory with both frameworks. Continure
1620 # building
1621 break
1622 else:
1623 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1624 # will now resume.
1625 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001626
Jack Jansen0b06be72002-06-21 14:48:38 +00001627 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1628 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001629 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001630 #
1631 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001632 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001633 for fw in 'Tcl', 'Tk'
1634 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1635 ]
1636
Tim Peters2c60f7a2003-01-29 03:49:43 +00001637 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001638 # complicated search, this is a hard-coded path. It could bail out
1639 # if X11 libs are not found...
1640 include_dirs.append('/usr/X11R6/include')
1641 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1642
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001643 # All existing framework builds of Tcl/Tk don't support 64-bit
1644 # architectures.
1645 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1646 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001647
1648 if is_macosx_sdk_path(F):
1649 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1650 else:
1651 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1652
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001653 detected_archs = []
1654 for ln in fp:
1655 a = ln.split()[-1]
1656 if a in archs:
1657 detected_archs.append(ln.split()[-1])
1658 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001659
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001660 for a in detected_archs:
1661 frameworks.append('-arch')
1662 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001663
Jack Jansen0b06be72002-06-21 14:48:38 +00001664 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1665 define_macros=[('WITH_APPINIT', 1)],
1666 include_dirs = include_dirs,
1667 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001668 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001669 extra_link_args = frameworks,
1670 )
1671 self.extensions.append(ext)
1672 return 1
1673
Tim Peters2c60f7a2003-01-29 03:49:43 +00001674
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001675 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001676 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001677
Jack Jansen0b06be72002-06-21 14:48:38 +00001678 # Rather than complicate the code below, detecting and building
1679 # AquaTk is a separate method. Only one Tkinter will be built on
1680 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1681 platform = self.get_platform()
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001682 if (platform == 'darwin' and
1683 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001684 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001685
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001686 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001687 # The versions with dots are used on Unix, and the versions without
1688 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001689 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001690 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1691 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001692 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001693 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001694 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001695 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001696 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001697 # Exit the loop when we've found the Tcl/Tk libraries
1698 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001699
Fredrik Lundhade711a2001-01-24 08:00:28 +00001700 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001701 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001702 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001703 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001704 dotversion = version
1705 if '.' not in dotversion and "bsd" in sys.platform.lower():
1706 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1707 # but the include subdirs are named like .../include/tcl8.3.
1708 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1709 tcl_include_sub = []
1710 tk_include_sub = []
1711 for dir in inc_dirs:
1712 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1713 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1714 tk_include_sub += tcl_include_sub
1715 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1716 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001717
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001718 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001719 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001720 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001721 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001722
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001723 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001724
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001725 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1726 for dir in tcl_includes + tk_includes:
1727 if dir not in include_dirs:
1728 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001729
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001730 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001731 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001732 include_dirs.append('/usr/openwin/include')
1733 added_lib_dirs.append('/usr/openwin/lib')
1734 elif os.path.exists('/usr/X11R6/include'):
1735 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001736 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001737 added_lib_dirs.append('/usr/X11R6/lib')
1738 elif os.path.exists('/usr/X11R5/include'):
1739 include_dirs.append('/usr/X11R5/include')
1740 added_lib_dirs.append('/usr/X11R5/lib')
1741 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001742 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001743 include_dirs.append('/usr/X11/include')
1744 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001745
Jason Tishler9181c942003-02-05 15:16:17 +00001746 # If Cygwin, then verify that X is installed before proceeding
1747 if platform == 'cygwin':
1748 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1749 if x11_inc is None:
1750 return
1751
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001752 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001753 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001754 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001755 defs.append( ('WITH_BLT', 1) )
1756 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001757 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001758 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001759 defs.append( ('WITH_BLT', 1) )
1760 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001761
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001762 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001763 libs.append('tk'+ version)
1764 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001765
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001766 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001767 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001768
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001769 # Finally, link with the X11 libraries (not appropriate on cygwin)
1770 if platform != "cygwin":
1771 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001772
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001773 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1774 define_macros=[('WITH_APPINIT', 1)] + defs,
1775 include_dirs = include_dirs,
1776 libraries = libs,
1777 library_dirs = added_lib_dirs,
1778 )
1779 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001780
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001781## # Uncomment these lines if you want to play with xxmodule.c
1782## ext = Extension('xx', ['xxmodule.c'])
1783## self.extensions.append(ext)
1784
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001785 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001786 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001787 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001788 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001789 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001790 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001791 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001792
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001793 def configure_ctypes_darwin(self, ext):
1794 # Darwin (OS X) uses preconfigured files, in
1795 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001796 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001797 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1798 '_ctypes', 'libffi_osx'))
1799 sources = [os.path.join(ffi_srcdir, p)
1800 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001801 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001802 'x86/x86-darwin.S',
1803 'x86/x86-ffi_darwin.c',
1804 'x86/x86-ffi64.c',
1805 'powerpc/ppc-darwin.S',
1806 'powerpc/ppc-darwin_closure.S',
1807 'powerpc/ppc-ffi_darwin.c',
1808 'powerpc/ppc64-darwin_closure.S',
1809 ]]
1810
1811 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001812 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001813
1814 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1815 os.path.join(ffi_srcdir, 'powerpc')]
1816 ext.include_dirs.extend(include_dirs)
1817 ext.sources.extend(sources)
1818 return True
1819
Thomas Hellereba43c12006-04-07 19:04:09 +00001820 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001821 if not self.use_system_libffi:
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001822 if sys.platform == 'darwin':
1823 return self.configure_ctypes_darwin(ext)
1824
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001825 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001826 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1827 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1828 '_ctypes', 'libffi'))
1829 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001830
Thomas Heller5e218b42006-04-27 15:50:42 +00001831 from distutils.dep_util import newer_group
1832
1833 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001834 for fname in os.listdir(ffi_srcdir)
1835 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001836 if self.force or newer_group(config_sources,
1837 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001838 from distutils.dir_util import mkpath
1839 mkpath(ffi_builddir)
1840 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001841
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001842 # Pass empty CFLAGS because we'll just append the resulting
1843 # CFLAGS to Python's; -g or -O2 is to be avoided.
1844 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1845 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001846
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001847 res = os.system(cmd)
1848 if res or not os.path.exists(ffi_configfile):
1849 print "Failed to configure _ctypes module"
1850 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001851
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001852 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001853 with open(ffi_configfile) as f:
1854 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001855
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001856 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001857 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001858
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001859 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001860 ffi_builddir,
1861 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001862 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001863
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001864 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1865 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001866 ext.include_dirs.extend(include_dirs)
1867 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00001868 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00001869
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001870 def detect_ctypes(self, inc_dirs, lib_dirs):
1871 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00001872 include_dirs = []
1873 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00001874 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001875 sources = ['_ctypes/_ctypes.c',
1876 '_ctypes/callbacks.c',
1877 '_ctypes/callproc.c',
1878 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00001879 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001880 depends = ['_ctypes/ctypes.h']
1881
1882 if sys.platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00001883 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001884 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001885 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001886 include_dirs.append('_ctypes/darwin')
1887# XXX Is this still needed?
1888## extra_link_args.extend(['-read_only_relocs', 'warning'])
1889
Thomas Heller17984892006-08-04 18:57:34 +00001890 elif sys.platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00001891 # XXX This shouldn't be necessary; it appears that some
1892 # of the assembler code is non-PIC (i.e. it has relocations
1893 # when it shouldn't. The proper fix would be to rewrite
1894 # the assembler code to be PIC.
1895 # This only works with GCC; the Sun compiler likely refuses
1896 # this option. If you want to compile ctypes with the Sun
1897 # compiler, please research a proper solution, instead of
1898 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00001899 extra_link_args.append('-mimpure-text')
1900
Thomas Hellerde2d78a2008-06-02 18:41:30 +00001901 elif sys.platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00001902 extra_link_args.append('-fPIC')
1903
Thomas Hellercf567c12006-03-08 19:51:58 +00001904 ext = Extension('_ctypes',
1905 include_dirs=include_dirs,
1906 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00001907 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001908 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001909 sources=sources,
1910 depends=depends)
1911 ext_test = Extension('_ctypes_test',
1912 sources=['_ctypes/_ctypes_test.c'])
1913 self.extensions.extend([ext, ext_test])
1914
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001915 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1916 return
1917
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001918 if sys.platform == 'darwin':
1919 # OS X 10.5 comes with libffi.dylib; the include files are
1920 # in /usr/include/ffi
1921 inc_dirs.append('/usr/include/ffi')
1922
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001923 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00001924 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001925 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001926 if ffi_inc is not None:
1927 ffi_h = ffi_inc[0] + '/ffi.h'
1928 fp = open(ffi_h)
1929 while 1:
1930 line = fp.readline()
1931 if not line:
1932 ffi_inc = None
1933 break
1934 if line.startswith('#define LIBFFI_H'):
1935 break
1936 ffi_lib = None
1937 if ffi_inc is not None:
1938 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001939 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001940 ffi_lib = lib_name
1941 break
1942
1943 if ffi_inc and ffi_lib:
1944 ext.include_dirs.extend(ffi_inc)
1945 ext.libraries.append(ffi_lib)
1946 self.use_system_libffi = True
1947
1948
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001949class PyBuildInstall(install):
1950 # Suppress the warning about installation into the lib_dynload
1951 # directory, which is not in sys.path when running Python during
1952 # installation:
1953 def initialize_options (self):
1954 install.initialize_options(self)
1955 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001956
Michael W. Hudson529a5052002-12-17 16:47:17 +00001957class PyBuildInstallLib(install_lib):
1958 # Do exactly what install_lib does but make sure correct access modes get
1959 # set on installed directories and files. All installed files with get
1960 # mode 644 unless they are a shared library in which case they will get
1961 # mode 755. All installed directories will get mode 755.
1962
1963 so_ext = sysconfig.get_config_var("SO")
1964
1965 def install(self):
1966 outfiles = install_lib.install(self)
1967 self.set_file_modes(outfiles, 0644, 0755)
1968 self.set_dir_modes(self.install_dir, 0755)
1969 return outfiles
1970
1971 def set_file_modes(self, files, defaultMode, sharedLibMode):
1972 if not self.is_chmod_supported(): return
1973 if not files: return
1974
1975 for filename in files:
1976 if os.path.islink(filename): continue
1977 mode = defaultMode
1978 if filename.endswith(self.so_ext): mode = sharedLibMode
1979 log.info("changing mode of %s to %o", filename, mode)
1980 if not self.dry_run: os.chmod(filename, mode)
1981
1982 def set_dir_modes(self, dirname, mode):
1983 if not self.is_chmod_supported(): return
1984 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
1985
1986 def set_dir_modes_visitor(self, mode, dirname, names):
1987 if os.path.islink(dirname): return
1988 log.info("changing mode of %s to %o", dirname, mode)
1989 if not self.dry_run: os.chmod(dirname, mode)
1990
1991 def is_chmod_supported(self):
1992 return hasattr(os, 'chmod')
1993
Guido van Rossum14ee89c2003-02-20 02:52:04 +00001994SUMMARY = """
1995Python is an interpreted, interactive, object-oriented programming
1996language. It is often compared to Tcl, Perl, Scheme or Java.
1997
1998Python combines remarkable power with very clear syntax. It has
1999modules, classes, exceptions, very high level dynamic data types, and
2000dynamic typing. There are interfaces to many system calls and
2001libraries, as well as to various windowing systems (X11, Motif, Tk,
2002Mac, MFC). New built-in modules are easily written in C or C++. Python
2003is also usable as an extension language for applications that need a
2004programmable interface.
2005
2006The Python implementation is portable: it runs on many brands of UNIX,
2007on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2008listed here, it may still be supported, if there's a C compiler for
2009it. Ask around on comp.lang.python -- or just try compiling Python
2010yourself.
2011"""
2012
2013CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002014Development Status :: 6 - Mature
2015License :: OSI Approved :: Python Software Foundation License
2016Natural Language :: English
2017Programming Language :: C
2018Programming Language :: Python
2019Topic :: Software Development
2020"""
2021
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002022def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002023 # turn off warnings when deprecated modules are imported
2024 import warnings
2025 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002026 setup(# PyPI Metadata (PEP 301)
2027 name = "Python",
2028 version = sys.version.split()[0],
2029 url = "http://www.python.org/%s" % sys.version[:3],
2030 maintainer = "Guido van Rossum and the Python community",
2031 maintainer_email = "python-dev@python.org",
2032 description = "A high-level object-oriented programming language",
2033 long_description = SUMMARY.strip(),
2034 license = "PSF license",
2035 classifiers = filter(None, CLASSIFIERS.split("\n")),
2036 platforms = ["Many"],
2037
2038 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002039 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2040 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002041 # The struct module is defined here, because build_ext won't be
2042 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002043 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002044
2045 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002046 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002047 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002048 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002049 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002050
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002051# --install-platlib
2052if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002053 main()