blob: 4f895595ce41ab745a042476534522be3bfbcd46 [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
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000387 if os.path.normpath(sys.prefix) != '/usr':
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000388 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000389 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000390 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000391 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000392
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000393 try:
394 have_unicode = unicode
395 except NameError:
396 have_unicode = 0
397
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000398 # lib_dirs and inc_dirs are used to search for files;
399 # if a file is found in one of those directories, it can
400 # be assumed that no additional -I,-L directives are needed.
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000401 lib_dirs = self.compiler.library_dirs + [
Martin v. Löwisfba73692004-11-13 11:13:35 +0000402 '/lib64', '/usr/lib64',
403 '/lib', '/usr/lib',
404 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000405 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000406 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000407 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000408
Brett Cannon4454a1f2005-04-15 20:32:39 +0000409 config_h = sysconfig.get_config_h_filename()
410 config_h_vars = sysconfig.parse_config_h(open(config_h))
411
Fredrik Lundhade711a2001-01-24 08:00:28 +0000412 platform = self.get_platform()
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000413 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000414
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000415 # Check for AtheOS which has libraries in non-standard locations
416 if platform == 'atheos':
417 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
418 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
419 inc_dirs += ['/system/include', '/atheos/autolnk/include']
420 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
421
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000422 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
423 if platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000424 lib_dirs += ['/usr/ccs/lib']
425
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000426 if platform == 'darwin':
427 # This should work on any unixy platform ;-)
428 # If the user has bothered specifying additional -I and -L flags
429 # in OPT and LDFLAGS we might as well use them here.
430 # NOTE: using shlex.split would technically be more correct, but
431 # also gives a bootstrap problem. Let's hope nobody uses directories
432 # with whitespace in the name to store libraries.
433 cflags, ldflags = sysconfig.get_config_vars(
434 'CFLAGS', 'LDFLAGS')
435 for item in cflags.split():
436 if item.startswith('-I'):
437 inc_dirs.append(item[2:])
438
439 for item in ldflags.split():
440 if item.startswith('-L'):
441 lib_dirs.append(item[2:])
442
Fredrik Lundhade711a2001-01-24 08:00:28 +0000443 # Check for MacOS X, which doesn't need libm.a at all
444 math_libs = ['m']
Ronald Oussoren9545a232010-05-05 19:09:31 +0000445 if platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000446 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000447
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000448 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
449
450 #
451 # The following modules are all pretty straightforward, and compile
452 # on pretty much any POSIXish platform.
453 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000454
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000455 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000456 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000457
458 # array objects
459 exts.append( Extension('array', ['arraymodule.c']) )
460 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000461 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
462 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000463 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000464 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000465 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000466 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000467 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000468 # fast string operations implemented in C
469 exts.append( Extension('strop', ['stropmodule.c']) )
470 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000471 exts.append( Extension('time', ['timemodule.c'],
472 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000473 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000474 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000475 # fast iterator tools implemented in C
476 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000477 # code that will be builtins in the future, but conflict with the
478 # current builtins
479 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000480 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000481 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000482 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000483 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000484 # bisect
485 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000486 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000487 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000488 # operator.add() and similar goodies
489 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000490 # Python 3.1 _io library
491 exts.append( Extension("_io",
492 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
493 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
494 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000495 # _functools
496 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000497 # _json speedups
498 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000499 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000500 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
501 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000502 # profilers (_lsprof is for cProfile.py)
503 exts.append( Extension('_hotshot', ['_hotshot.c']) )
504 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000505 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000506 if have_unicode:
507 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000508 else:
509 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000510 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000511 data = open('pyconfig.h').read()
512 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
513 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000514 locale_libs = ['intl']
515 else:
516 locale_libs = []
Jack Jansen84b74472004-07-15 19:56:25 +0000517 if platform == 'darwin':
518 locale_extra_link_args = ['-framework', 'CoreFoundation']
519 else:
520 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000521
Jack Jansen84b74472004-07-15 19:56:25 +0000522
Jason Tishlerd28216b2002-08-14 11:13:52 +0000523 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000524 libraries=locale_libs,
525 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000526
527 # Modules with some UNIX dependencies -- on by default:
528 # (If you have a really backward UNIX, select and socket may not be
529 # supported...)
530
531 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000532 libs = []
533 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
534 # May be necessary on AIX for flock function
535 libs = ['bsd']
536 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000537 # pwd(3)
538 exts.append( Extension('pwd', ['pwdmodule.c']) )
539 # grp(3)
540 exts.append( Extension('grp', ['grpmodule.c']) )
541 # spwd, shadow passwords
542 if (config_h_vars.get('HAVE_GETSPNAM', False) or
543 config_h_vars.get('HAVE_GETSPENT', False)):
544 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000545 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000546 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000547
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000548 # select(2); not on ancient System V
549 exts.append( Extension('select', ['selectmodule.c']) )
550
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000551 # Fred Drake's interface to the Python parser
552 exts.append( Extension('parser', ['parsermodule.c']) )
553
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000554 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000555 exts.append( Extension('cStringIO', ['cStringIO.c']) )
556 exts.append( Extension('cPickle', ['cPickle.c']) )
557
558 # Memory-mapped files (also works on Win32).
Ronald Oussoren9545a232010-05-05 19:09:31 +0000559 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000560 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000561 else:
562 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000563
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000564 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000565 # syslog daemon interface
566 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000567
568 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000569 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
570 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
571 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000572
573 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000574 # Here ends the simple stuff. From here on, modules need certain
575 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000576 #
577
578 # Multimedia modules
579 # These don't work for 64-bit platforms!!!
580 # These represent audio samples or images as strings:
581
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000582 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000583 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000584 # 64-bit platforms.
585 exts.append( Extension('audioop', ['audioop.c']) )
586
Fredrik Lundhade711a2001-01-24 08:00:28 +0000587 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000588 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000589 # Operations on images
590 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000591 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000592 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000593
594 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000595 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000596 readline_termcap_library = ""
597 curses_library = ""
598 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000599 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000600 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000601 ldd_output = fp.readlines()
602 ret = fp.close()
603 if ret is None or ret >> 8 == 0:
604 for ln in ldd_output:
605 if 'curses' in ln:
606 readline_termcap_library = re.sub(
607 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
608 ).rstrip()
609 break
610 if 'tinfo' in ln: # termcap interface split out from ncurses
611 readline_termcap_library = 'tinfo'
612 break
Stefan Krah449aa862010-06-03 12:39:50 +0000613 # Issue 7384: If readline is already linked against curses,
614 # use the same library for the readline and curses modules.
615 if 'curses' in readline_termcap_library:
616 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000617 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000618 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000619 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000620 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000621 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000622 curses_library = 'curses'
623
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000624 if platform == 'darwin':
625 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000626 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
627 if dep_target and dep_target.split('.') < ['10', '5']:
628 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000629 if os_release < 9:
630 # MacOSX 10.4 has a broken readline. Don't try to build
631 # the readline module unless the user has installed a fixed
632 # readline package
633 if find_file('readline/rlconf.h', inc_dirs, []) is None:
634 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000635 if do_readline:
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000636 if platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000637 # In every directory on the search path search for a dynamic
638 # library and then a static library, instead of first looking
639 # for dynamic libraries on the entiry path.
640 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000641 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000642 readline_extra_link_args = ('-Wl,-search_paths_first',)
643 else:
644 readline_extra_link_args = ()
645
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000646 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000647 if readline_termcap_library:
648 pass # Issue 7384: Already linked against curses or tinfo.
649 elif curses_library:
650 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000651 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000652 ['/usr/lib/termcap'],
653 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000654 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000655 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000656 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000657 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000658 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000659 else:
660 missing.append('readline')
661
Ronald Oussoren9545a232010-05-05 19:09:31 +0000662 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000663
Ronald Oussoren9545a232010-05-05 19:09:31 +0000664 if self.compiler.find_library_file(lib_dirs, 'crypt'):
665 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000666 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000667 libs = []
668 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000669
Skip Montanaroba9e9782003-03-20 23:34:22 +0000670 # CSV files
671 exts.append( Extension('_csv', ['_csv.c']) )
672
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000673 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000674 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000675 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000676 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000677 search_for_ssl_incs_in = [
678 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000679 '/usr/contrib/ssl/include/'
680 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000681 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
682 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000683 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000684 if ssl_incs is not None:
685 krb5_h = find_file('krb5.h', inc_dirs,
686 ['/usr/kerberos/include'])
687 if krb5_h:
688 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000689 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000690 ['/usr/local/ssl/lib',
691 '/usr/contrib/ssl/lib/'
692 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000693
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000694 if (ssl_incs is not None and
695 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000696 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000697 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000698 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000699 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000700 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000701 else:
702 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000703
Gregory P. Smithade97332005-08-23 21:19:40 +0000704 # find out which version of OpenSSL we have
705 openssl_ver = 0
706 openssl_ver_re = re.compile(
707 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000708
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000709 # look for the openssl version header on the compiler search path.
710 opensslv_h = find_file('openssl/opensslv.h', [],
711 inc_dirs + search_for_ssl_incs_in)
712 if opensslv_h:
713 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
714 if sys.platform == 'darwin' and is_macosx_sdk_path(name):
715 name = os.path.join(macosx_sdk_root(), name[1:])
716 try:
717 incfile = open(name, 'r')
718 for line in incfile:
719 m = openssl_ver_re.match(line)
720 if m:
721 openssl_ver = eval(m.group(1))
722 except IOError, msg:
723 print "IOError while reading opensshv.h:", msg
724 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000725
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000726 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000727 have_any_openssl = ssl_incs is not None and ssl_libs is not None
728 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000729 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000730
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000731 if have_any_openssl:
732 if have_usable_openssl:
733 # The _hashlib module wraps optimized implementations
734 # of hash functions from the OpenSSL library.
735 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
736 include_dirs = ssl_incs,
737 library_dirs = ssl_libs,
738 libraries = ['ssl', 'crypto']) )
739 else:
740 print ("warning: openssl 0x%08x is too old for _hashlib" %
741 openssl_ver)
742 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000743 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000744 # The _sha module implements the SHA1 hash algorithm.
745 exts.append( Extension('_sha', ['shamodule.c']) )
746 # The _md5 module implements the RSA Data Security, Inc. MD5
747 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000748 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000749 exts.append( Extension('_md5',
750 sources = ['md5module.c', 'md5.c'],
751 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000752
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000753 min_sha2_openssl_ver = 0x00908000
754 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000755 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
756 exts.append( Extension('_sha256', ['sha256module.c']) )
757 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000758
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000759 # Modules that provide persistent dictionary-like semantics. You will
760 # probably want to arrange for at least one of them to be available on
761 # your machine, though none are defined by default because of library
762 # dependencies. The Python module anydbm.py provides an
763 # implementation independent wrapper for these; dumbdbm.py provides
764 # similar functionality (but slower of course) implemented in Python.
765
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000766 # Sleepycat^WOracle Berkeley DB interface.
767 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000768 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000769 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000770 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000771 # a release. Most open source OSes come with one or more
772 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000773
Matthias Klose54cc5392010-03-15 12:46:18 +0000774 max_db_ver = (4, 8)
Jesus Cea6557aac2010-03-22 14:22:26 +0000775 min_db_ver = (4, 1)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000776 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000777
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000778 def allow_db_ver(db_ver):
779 """Returns a boolean if the given BerkeleyDB version is acceptable.
780
781 Args:
782 db_ver: A tuple of the version to verify.
783 """
784 if not (min_db_ver <= db_ver <= max_db_ver):
785 return False
786 # Use this function to filter out known bad configurations.
787 if (4, 6) == db_ver[:2]:
788 # BerkeleyDB 4.6.x is not stable on many architectures.
789 arch = platform_machine()
790 if arch not in ('i386', 'i486', 'i586', 'i686',
791 'x86_64', 'ia64'):
792 return False
793 return True
794
795 def gen_db_minor_ver_nums(major):
796 if major == 4:
797 for x in range(max_db_ver[1]+1):
798 if allow_db_ver((4, x)):
799 yield x
800 elif major == 3:
801 for x in (3,):
802 if allow_db_ver((3, x)):
803 yield x
804 else:
805 raise ValueError("unknown major BerkeleyDB version", major)
806
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000807 # construct a list of paths to look for the header file in on
808 # top of the normal inc_dirs.
809 db_inc_paths = [
810 '/usr/include/db4',
811 '/usr/local/include/db4',
812 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000813 '/usr/include/db3',
814 '/usr/local/include/db3',
815 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000816 # Fink defaults (http://fink.sourceforge.net/)
817 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000818 '/sw/include/db3',
819 ]
820 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000821 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000822 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000823 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000824 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
825 db_inc_paths.append('/usr/local/include/db4%d' % x)
826 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000827 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000828 # MacPorts default (http://www.macports.org/)
829 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000830 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000831 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000832 db_inc_paths.append('/usr/include/db3%d' % x)
833 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
834 db_inc_paths.append('/usr/local/include/db3%d' % x)
835 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000836 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000837
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000838 # Add some common subdirectories for Sleepycat DB to the list,
839 # based on the standard include directories. This way DB3/4 gets
840 # picked up when it is installed in a non-standard prefix and
841 # the user has added that prefix into inc_dirs.
842 std_variants = []
843 for dn in inc_dirs:
844 std_variants.append(os.path.join(dn, 'db3'))
845 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000846 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000847 std_variants.append(os.path.join(dn, "db4%d"%x))
848 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000849 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000850 std_variants.append(os.path.join(dn, "db3%d"%x))
851 std_variants.append(os.path.join(dn, "db3.%d"%x))
852
Tim Peters38ff36c2006-06-30 06:18:39 +0000853 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000854 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000855
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000856 db_ver_inc_map = {}
857
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000858 if sys.platform == 'darwin':
859 sysroot = macosx_sdk_root()
860
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000861 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000862 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000863 # See whether there is a Sleepycat header in the standard
864 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000865 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000866 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000867
868 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
869 f = os.path.join(sysroot, d[1:], "db.h")
870
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000871 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000872 if os.path.exists(f):
873 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000874 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000875 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000876 db_major = int(m.group(1))
877 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
878 db_minor = int(m.group(1))
879 db_ver = (db_major, db_minor)
880
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000881 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
882 if db_ver == (4, 6):
883 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
884 db_patch = int(m.group(1))
885 if db_patch < 21:
886 print "db.h:", db_ver, "patch", db_patch,
887 print "being ignored (4.6.x must be >= 4.6.21)"
888 continue
889
Antoine Pitrou8c510e72010-01-13 11:47:49 +0000890 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000891 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000892 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +0000893 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000894 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000895 if db_setup_debug:
896 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000897 else:
898 # we already found a header for this library version
899 if db_setup_debug: print "db.h: ignoring", d
900 else:
901 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +0000902 if db_setup_debug:
903 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000904
905 db_found_vers = db_ver_inc_map.keys()
906 db_found_vers.sort()
907
908 while db_found_vers:
909 db_ver = db_found_vers.pop()
910 db_incdir = db_ver_inc_map[db_ver]
911
912 # check lib directories parallel to the location of the header
913 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +0000914 db_incdir.replace("include", 'lib64'),
915 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000916 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000917
918 if sys.platform != 'darwin':
919 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
920
921 else:
922 # Same as other branch, but takes OSX SDK into account
923 tmp = []
924 for dn in db_dirs_to_check:
925 if is_macosx_sdk_path(dn):
926 if os.path.isdir(os.path.join(sysroot, dn[1:])):
927 tmp.append(dn)
928 else:
929 if os.path.isdir(dn):
930 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +0000931 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000932
933 # Look for a version specific db-X.Y before an ambiguoius dbX
934 # XXX should we -ever- look for a dbX name? Do any
935 # systems really not name their library by version and
936 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +0000937 for dblib in (('db-%d.%d' % db_ver),
938 ('db%d%d' % db_ver),
939 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000940 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000941 db_dirs_to_check + lib_dirs, dblib )
942 if dblib_file:
943 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
944 raise db_found
945 else:
946 if db_setup_debug: print "db lib: ", dblib, "not found"
947
948 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +0000949 if db_setup_debug:
950 print "bsddb using BerkeleyDB lib:", db_ver, dblib
951 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000952 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +0000953 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000954 # We add the runtime_library_dirs argument because the
955 # BerkeleyDB lib we're linking against often isn't in the
956 # system dynamic library search path. This is usually
957 # correct and most trouble free, but may cause problems in
958 # some unusual system configurations (e.g. the directory
959 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000960 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +0000961 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000962 library_dirs=dblib_dir,
963 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000964 include_dirs=db_incs,
965 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +0000966 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000967 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +0000968 db_incs = None
969 dblibs = []
970 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +0000971 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +0000972
Anthony Baxterc51ee692006-04-01 00:57:31 +0000973 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000974 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +0000975
Anthony Baxter3dc6bb32006-04-03 02:20:49 +0000976 # We hunt for #define SQLITE_VERSION "n.n.n"
977 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +0000978 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +0000979 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +0000980 '/usr/include/sqlite',
981 '/usr/include/sqlite3',
982 '/usr/local/include',
983 '/usr/local/include/sqlite',
984 '/usr/local/include/sqlite3',
985 ]
Anthony Baxter3dc6bb32006-04-03 02:20:49 +0000986 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
987 MIN_SQLITE_VERSION = ".".join([str(x)
988 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000989
990 # Scan the default include directories before the SQLite specific
991 # ones. This allows one to override the copy of sqlite on OSX,
992 # where /usr/include contains an old version of sqlite.
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000993 if sys.platform == 'darwin':
994 sysroot = macosx_sdk_root()
995
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000996 for d in inc_dirs + sqlite_inc_paths:
Anthony Baxterc51ee692006-04-01 00:57:31 +0000997 f = os.path.join(d, "sqlite3.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000998
999 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
1000 f = os.path.join(sysroot, d[1:], "sqlite3.h")
1001
Anthony Baxterc51ee692006-04-01 00:57:31 +00001002 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001003 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001004 incf = open(f).read()
1005 m = re.search(
1006 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001007 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001008 sqlite_version = m.group(1)
1009 sqlite_version_tuple = tuple([int(x)
1010 for x in sqlite_version.split(".")])
1011 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001012 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001013 if sqlite_setup_debug:
1014 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001015 sqlite_incdir = d
1016 break
1017 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001018 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001019 print "%s: version %d is too old, need >= %s"%(d,
1020 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001021 elif sqlite_setup_debug:
1022 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1023
Anthony Baxterc51ee692006-04-01 00:57:31 +00001024 if sqlite_incdir:
1025 sqlite_dirs_to_check = [
1026 os.path.join(sqlite_incdir, '..', 'lib64'),
1027 os.path.join(sqlite_incdir, '..', 'lib'),
1028 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1029 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1030 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001031 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001032 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001033 if sqlite_libfile:
1034 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001035
1036 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001037 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001038 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001039 '_sqlite/cursor.c',
1040 '_sqlite/microprotocols.c',
1041 '_sqlite/module.c',
1042 '_sqlite/prepare_protocol.c',
1043 '_sqlite/row.c',
1044 '_sqlite/statement.c',
1045 '_sqlite/util.c', ]
1046
Anthony Baxterc51ee692006-04-01 00:57:31 +00001047 sqlite_defines = []
1048 if sys.platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001049 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001050 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001051 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1052
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001053 # Comment this out if you want the sqlite3 module to be able to load extensions.
1054 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001055
1056 if sys.platform == 'darwin':
1057 # In every directory on the search path search for a dynamic
1058 # library and then a static library, instead of first looking
1059 # for dynamic libraries on the entiry path.
1060 # This way a staticly linked custom sqlite gets picked up
1061 # before the dynamic library in /usr/lib.
1062 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1063 else:
1064 sqlite_extra_link_args = ()
1065
Anthony Baxterc51ee692006-04-01 00:57:31 +00001066 exts.append(Extension('_sqlite3', sqlite_srcs,
1067 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001068 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001069 sqlite_incdir],
1070 library_dirs=sqlite_libdir,
1071 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001072 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001073 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001074 else:
1075 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001076
1077 # Look for Berkeley db 1.85. Note that it is built as a different
1078 # module name so it can be included even when later versions are
1079 # available. A very restrictive search is performed to avoid
1080 # accidentally building this module with a later version of the
1081 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1082 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001083 #
1084 # If the better bsddb library can be built (db_incs is defined)
1085 # we do not build this one. Otherwise this build will pick up
1086 # the more recent berkeleydb's db.h file first in the include path
1087 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001088 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001089
1090 if sys.platform == 'darwin':
1091 if is_macosx_sdk_path(f):
1092 sysroot = macosx_sdk_root()
1093 f = os.path.join(sysroot, f[1:])
1094
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001095 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001096 data = open(f).read()
1097 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1098 if m is not None:
1099 # bingo - old version used hash file format version 2
1100 ### XXX this should be fixed to not be platform-dependent
1101 ### but I don't have direct access to an osf1 platform and
1102 ### seemed to be muffing the search somehow
1103 libraries = platform == "osf1" and ['db'] or None
1104 if libraries is not None:
1105 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1106 libraries=libraries))
1107 else:
1108 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001109 else:
1110 missing.append('bsddb185')
1111 else:
1112 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001113
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001114 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001115 # The standard Unix dbm module:
Jack Jansend1b20452002-07-08 21:39:36 +00001116 if platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001117 config_args = [arg.strip("'")
1118 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001119 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001120 if arg.startswith('--with-dbmliborder=')]
1121 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001122 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001123 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001124 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001125 dbmext = None
1126 for cand in dbm_order:
1127 if cand == "ndbm":
1128 if find_file("ndbm.h", inc_dirs, []) is not None:
1129 # Some systems have -lndbm, others don't
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001130 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001131 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001132 ndbm_libs = ['ndbm']
1133 else:
1134 ndbm_libs = []
1135 print "building dbm using ndbm"
1136 dbmext = Extension('dbm', ['dbmmodule.c'],
1137 define_macros=[
1138 ('HAVE_NDBM_H',None),
1139 ],
1140 libraries=ndbm_libs)
1141 break
1142
1143 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001144 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001145 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001146 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001147 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001148 gdbm_libs.append('gdbm_compat')
1149 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1150 print "building dbm using gdbm"
1151 dbmext = Extension(
1152 'dbm', ['dbmmodule.c'],
1153 define_macros=[
1154 ('HAVE_GDBM_NDBM_H', None),
1155 ],
1156 libraries = gdbm_libs)
1157 break
1158 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1159 print "building dbm using gdbm"
1160 dbmext = Extension(
1161 'dbm', ['dbmmodule.c'],
1162 define_macros=[
1163 ('HAVE_GDBM_DASH_NDBM_H', None),
1164 ],
1165 libraries = gdbm_libs)
1166 break
1167 elif cand == "bdb":
1168 if db_incs is not None:
1169 print "building dbm using bdb"
1170 dbmext = Extension('dbm', ['dbmmodule.c'],
1171 library_dirs=dblib_dir,
1172 runtime_library_dirs=dblib_dir,
1173 include_dirs=db_incs,
1174 define_macros=[
1175 ('HAVE_BERKDB_H', None),
1176 ('DB_DBM_HSEARCH', None),
1177 ],
1178 libraries=dblibs)
1179 break
1180 if dbmext is not None:
1181 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001182 else:
1183 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001184
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001185 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001186 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001187 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001188 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1189 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001190 else:
1191 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001192
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001193 # Unix-only modules
Ronald Oussoren9545a232010-05-05 19:09:31 +00001194 if platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001195 # Steen Lumholt's termios module
1196 exts.append( Extension('termios', ['termios.c']) )
1197 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43 +00001198 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001199 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001200 else:
1201 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001202
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001203 # Sun yellow pages. Some systems have the functions in libc.
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001204 if (platform not in ['cygwin', 'atheos', 'qnx6'] and
1205 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001206 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001207 libs = ['nsl']
1208 else:
1209 libs = []
1210 exts.append( Extension('nis', ['nismodule.c'],
1211 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001212 else:
1213 missing.append('nis')
1214 else:
1215 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001216
Skip Montanaro72092942004-02-07 12:50:19 +00001217 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001218 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001219 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001220 if curses_library.startswith('ncurses'):
1221 if curses_library == 'ncursesw':
1222 # Bug 1464056: If _curses.so links with ncursesw,
1223 # _curses_panel.so must link with panelw.
1224 panel_library = 'panelw'
1225 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001226 exts.append( Extension('_curses', ['_cursesmodule.c'],
1227 libraries = curses_libs) )
Stefan Krah449aa862010-06-03 12:39:50 +00001228 elif curses_library == 'curses' and platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001229 # OSX has an old Berkeley curses, not good enough for
1230 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001231 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001232 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001233 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001234 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001235 else:
1236 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001237
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001238 exts.append( Extension('_curses', ['_cursesmodule.c'],
1239 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001240 else:
1241 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001242
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001243 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001244 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001245 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001246 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001247 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001248 else:
1249 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001250
Barry Warsaw259b1e12002-08-13 20:09:26 +00001251 # Andrew Kuchling's zlib module. Note that some versions of zlib
1252 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1253 # http://www.cert.org/advisories/CA-2002-07.html
1254 #
1255 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1256 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1257 # now, we still accept 1.1.3, because we think it's difficult to
1258 # exploit this in Python, and we'd rather make it RedHat's problem
1259 # than our problem <wink>.
1260 #
1261 # You can upgrade zlib to version 1.1.4 yourself by going to
1262 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001263 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001264 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001265 if zlib_inc is not None:
1266 zlib_h = zlib_inc[0] + '/zlib.h'
1267 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001268 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001269 fp = open(zlib_h)
1270 while 1:
1271 line = fp.readline()
1272 if not line:
1273 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001274 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001275 version = line.split()[2]
1276 break
1277 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001278 if (self.compiler.find_library_file(lib_dirs, 'z')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001279 if sys.platform == "darwin":
1280 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1281 else:
1282 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001283 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001284 libraries = ['z'],
1285 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001286 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001287 else:
1288 missing.append('zlib')
1289 else:
1290 missing.append('zlib')
1291 else:
1292 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001293
Gregory P. Smith440ca772008-03-24 00:08:01 +00001294 # Helper module for various ascii-encoders. Uses zlib for an optimized
1295 # crc32 if we have it. Otherwise binascii uses its own.
1296 if have_zlib:
1297 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1298 libraries = ['z']
1299 extra_link_args = zlib_extra_link_args
1300 else:
1301 extra_compile_args = []
1302 libraries = []
1303 extra_link_args = []
1304 exts.append( Extension('binascii', ['binascii.c'],
1305 extra_compile_args = extra_compile_args,
1306 libraries = libraries,
1307 extra_link_args = extra_link_args) )
1308
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001309 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001310 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001311 if sys.platform == "darwin":
1312 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1313 else:
1314 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001315 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001316 libraries = ['bz2'],
1317 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001318 else:
1319 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001320
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001321 # Interface to the Expat XML parser
1322 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001323 # Expat was written by James Clark and is now maintained by a group of
1324 # developers on SourceForge; see www.libexpat.org for more information.
1325 # The pyexpat module was written by Paul Prescod after a prototype by
1326 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1327 # of a system shared libexpat.so is possible with --with-system-expat
1328 # cofigure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001329 #
1330 # More information on Expat can be found at www.libexpat.org.
1331 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001332 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1333 expat_inc = []
1334 define_macros = []
1335 expat_lib = ['expat']
1336 expat_sources = []
1337 else:
1338 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1339 define_macros = [
1340 ('HAVE_EXPAT_CONFIG_H', '1'),
1341 ]
1342 expat_lib = []
1343 expat_sources = ['expat/xmlparse.c',
1344 'expat/xmlrole.c',
1345 'expat/xmltok.c']
Ronald Oussoren988117f2006-04-29 11:31:35 +00001346
Fred Drake2d59a492003-10-21 15:41:15 +00001347 exts.append(Extension('pyexpat',
1348 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001349 include_dirs = expat_inc,
1350 libraries = expat_lib,
1351 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001352 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001353
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001354 # Fredrik Lundh's cElementTree module. Note that this also
1355 # uses expat (via the CAPI hook in pyexpat).
1356
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001357 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001358 define_macros.append(('USE_PYEXPAT_CAPI', None))
1359 exts.append(Extension('_elementtree',
1360 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001361 include_dirs = expat_inc,
1362 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001363 sources = ['_elementtree.c'],
1364 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001365 else:
1366 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001367
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001368 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001369 if have_unicode:
1370 exts.append(Extension('_multibytecodec',
1371 ['cjkcodecs/multibytecodec.c']))
1372 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001373 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001374 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001375 else:
1376 missing.append('_multibytecodec')
1377 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1378 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001379
Michael W. Hudson5b109102002-01-23 15:04:41 +00001380 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001381 if sys.maxint == 0x7fffffff:
1382 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1383 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Anthony Baxter82201742006-04-09 15:07:40 +00001384 if (dl_inc is not None) and (platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001385 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001386 else:
1387 missing.append('dl')
1388 else:
1389 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001390
Thomas Hellercf567c12006-03-08 19:51:58 +00001391 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001392 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001393
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001394 # Richard Oudkerk's multiprocessing module
1395 if platform == 'win32': # Windows
1396 macros = dict()
1397 libraries = ['ws2_32']
1398
1399 elif platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001400 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001401 libraries = []
1402
1403 elif platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001404 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001405 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001406
Martin v. Löwisbb86d832008-11-04 20:40:09 +00001407 elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001408 # FreeBSD's P1003.1b semaphore support is very experimental
1409 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001410 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001411 libraries = []
1412
Jesse Noller37040cd2008-09-30 00:15:45 +00001413 elif platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001414 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001415 libraries = []
1416
Jesse Noller40a61642009-03-31 18:12:35 +00001417 elif platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001418 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001419 libraries = []
1420
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001421 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001422 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001423 libraries = ['rt']
1424
1425 if platform == 'win32':
1426 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1427 '_multiprocessing/semaphore.c',
1428 '_multiprocessing/pipe_connection.c',
1429 '_multiprocessing/socket_connection.c',
1430 '_multiprocessing/win32_functions.c'
1431 ]
1432
1433 else:
1434 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1435 '_multiprocessing/socket_connection.c'
1436 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001437 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001438 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001439 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1440
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001441 if sysconfig.get_config_var('WITH_THREAD'):
1442 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1443 define_macros=macros.items(),
1444 include_dirs=["Modules/_multiprocessing"]))
1445 else:
1446 missing.append('_multiprocessing')
1447
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001448 # End multiprocessing
1449
1450
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001451 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001452 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001453 # Linux-specific modules
1454 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001455 else:
1456 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001457
Matthias Klose8a96d202010-04-21 22:18:52 +00001458 if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1459 'freebsd7', 'freebsd8')
1460 or platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001461 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001462 else:
1463 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001464
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001465 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001466 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001467 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001468 else:
1469 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001470
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001471 if platform == 'darwin':
1472 # _scproxy
1473 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1474 extra_link_args= [
1475 '-framework', 'SystemConfiguration',
1476 '-framework', 'CoreFoundation'
1477 ]))
1478
1479
Tim Peters66cb0182004-08-26 05:23:19 +00001480 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001481 sysconfig.get_config_var("CONFIG_ARGS")):
1482
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001483 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001484 # We're on Mac OS X 10.4 or later, the compiler should
1485 # support '-Wno-deprecated-declarations'. This will
1486 # surpress deprecation warnings for the Carbon extensions,
1487 # these extensions wrap the Carbon APIs and even those
1488 # parts that are deprecated.
1489 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1490 else:
1491 carbon_extra_compile_args = []
1492
Just van Rossum05ced6a2002-11-24 23:15:57 +00001493 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001494 def macSrcExists(name1, name2=''):
1495 if not name1:
1496 return None
1497 names = (name1,)
1498 if name2:
1499 names = (name1, name2)
1500 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1501 return os.path.exists(path)
1502
1503 def addMacExtension(name, kwds, extra_srcs=[]):
1504 dirname = ''
1505 if name[0] == '_':
1506 dirname = name[1:].lower()
1507 cname = name + '.c'
1508 cmodulename = name + 'module.c'
1509 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1510 if macSrcExists(cname):
1511 srcs = [cname]
1512 elif macSrcExists(cmodulename):
1513 srcs = [cmodulename]
1514 elif macSrcExists(dirname, cname):
1515 # XXX(nnorwitz): If all the names ended with module, we
1516 # wouldn't need this condition. ibcarbon is the only one.
1517 srcs = [os.path.join(dirname, cname)]
1518 elif macSrcExists(dirname, cmodulename):
1519 srcs = [os.path.join(dirname, cmodulename)]
1520 else:
1521 raise RuntimeError("%s not found" % name)
1522
1523 # Here's the whole point: add the extension with sources
1524 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1525
1526 # Core Foundation
1527 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1528 'extra_link_args': ['-framework', 'CoreFoundation'],
1529 }
1530 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1531 addMacExtension('autoGIL', core_kwds)
1532
Ronald Oussoren51f06332009-09-20 10:31:22 +00001533
1534
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001535 # Carbon
1536 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1537 'extra_link_args': ['-framework', 'Carbon'],
1538 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001539 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1540 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001541 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001542 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001543 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001544 '_Help', '_Icn', '_IBCarbon', '_List',
1545 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001546 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001547 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001548 for name in CARBON_EXTS:
1549 addMacExtension(name, carbon_kwds)
1550
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001551 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1552 # The _Win extension should build just like the other Carbon extensions, but
1553 # this actually results in a hard crash of the linker.
1554 #
1555 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1556 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1557 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1558 }
1559 addMacExtension('_Win', win_kwds)
1560 else:
1561 addMacExtension('_Win', carbon_kwds)
1562
1563
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001564 # Application Services & QuickTime
1565 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1566 'extra_link_args': ['-framework','ApplicationServices'],
1567 }
1568 addMacExtension('_Launch', app_kwds)
1569 addMacExtension('_CG', app_kwds)
1570
Just van Rossum05ced6a2002-11-24 23:15:57 +00001571 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001572 extra_compile_args=carbon_extra_compile_args,
1573 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001574 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001575
Michael W. Hudson5b109102002-01-23 15:04:41 +00001576
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001577 self.extensions.extend(exts)
1578
1579 # Call the method for detecting whether _tkinter can be compiled
1580 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001581
Skip Montanarod1287322007-03-06 15:41:38 +00001582 if '_tkinter' not in [e.name for e in self.extensions]:
1583 missing.append('_tkinter')
1584
1585 return missing
1586
Jack Jansen0b06be72002-06-21 14:48:38 +00001587 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1588 # The _tkinter module, using frameworks. Since frameworks are quite
1589 # different the UNIX search logic is not sharable.
1590 from os.path import join, exists
1591 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001592 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001593 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001594 join(os.getenv('HOME'), '/Library/Frameworks')
1595 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001596
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001597 sysroot = macosx_sdk_root()
1598
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001599 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001600 # bundles.
1601 # XXX distutils should support -F!
1602 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001603 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001604
1605
Jack Jansen0b06be72002-06-21 14:48:38 +00001606 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001607 if is_macosx_sdk_path(F):
1608 if not exists(join(sysroot, F[1:], fw + '.framework')):
1609 break
1610 else:
1611 if not exists(join(F, fw + '.framework')):
1612 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001613 else:
1614 # ok, F is now directory with both frameworks. Continure
1615 # building
1616 break
1617 else:
1618 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1619 # will now resume.
1620 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001621
Jack Jansen0b06be72002-06-21 14:48:38 +00001622 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1623 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001624 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001625 #
1626 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001627 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001628 for fw in 'Tcl', 'Tk'
1629 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1630 ]
1631
Tim Peters2c60f7a2003-01-29 03:49:43 +00001632 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001633 # complicated search, this is a hard-coded path. It could bail out
1634 # if X11 libs are not found...
1635 include_dirs.append('/usr/X11R6/include')
1636 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1637
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001638 # All existing framework builds of Tcl/Tk don't support 64-bit
1639 # architectures.
1640 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1641 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001642
1643 if is_macosx_sdk_path(F):
1644 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1645 else:
1646 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1647
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001648 detected_archs = []
1649 for ln in fp:
1650 a = ln.split()[-1]
1651 if a in archs:
1652 detected_archs.append(ln.split()[-1])
1653 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001654
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001655 for a in detected_archs:
1656 frameworks.append('-arch')
1657 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001658
Jack Jansen0b06be72002-06-21 14:48:38 +00001659 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1660 define_macros=[('WITH_APPINIT', 1)],
1661 include_dirs = include_dirs,
1662 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001663 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001664 extra_link_args = frameworks,
1665 )
1666 self.extensions.append(ext)
1667 return 1
1668
Tim Peters2c60f7a2003-01-29 03:49:43 +00001669
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001670 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001671 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001672
Jack Jansen0b06be72002-06-21 14:48:38 +00001673 # Rather than complicate the code below, detecting and building
1674 # AquaTk is a separate method. Only one Tkinter will be built on
1675 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1676 platform = self.get_platform()
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001677 if (platform == 'darwin' and
1678 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001679 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001680
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001681 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001682 # The versions with dots are used on Unix, and the versions without
1683 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001684 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001685 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1686 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001687 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001688 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001689 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001690 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001691 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001692 # Exit the loop when we've found the Tcl/Tk libraries
1693 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001694
Fredrik Lundhade711a2001-01-24 08:00:28 +00001695 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001696 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001697 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001698 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001699 dotversion = version
1700 if '.' not in dotversion and "bsd" in sys.platform.lower():
1701 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1702 # but the include subdirs are named like .../include/tcl8.3.
1703 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1704 tcl_include_sub = []
1705 tk_include_sub = []
1706 for dir in inc_dirs:
1707 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1708 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1709 tk_include_sub += tcl_include_sub
1710 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1711 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001712
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001713 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001714 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001715 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001716 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001717
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001718 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001719
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001720 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1721 for dir in tcl_includes + tk_includes:
1722 if dir not in include_dirs:
1723 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001724
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001725 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001726 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001727 include_dirs.append('/usr/openwin/include')
1728 added_lib_dirs.append('/usr/openwin/lib')
1729 elif os.path.exists('/usr/X11R6/include'):
1730 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001731 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001732 added_lib_dirs.append('/usr/X11R6/lib')
1733 elif os.path.exists('/usr/X11R5/include'):
1734 include_dirs.append('/usr/X11R5/include')
1735 added_lib_dirs.append('/usr/X11R5/lib')
1736 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001737 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001738 include_dirs.append('/usr/X11/include')
1739 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001740
Jason Tishler9181c942003-02-05 15:16:17 +00001741 # If Cygwin, then verify that X is installed before proceeding
1742 if platform == 'cygwin':
1743 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1744 if x11_inc is None:
1745 return
1746
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001747 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001748 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001749 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001750 defs.append( ('WITH_BLT', 1) )
1751 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001752 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001753 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001754 defs.append( ('WITH_BLT', 1) )
1755 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001756
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001757 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001758 libs.append('tk'+ version)
1759 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001760
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001761 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001762 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001763
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001764 # Finally, link with the X11 libraries (not appropriate on cygwin)
1765 if platform != "cygwin":
1766 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001767
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001768 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1769 define_macros=[('WITH_APPINIT', 1)] + defs,
1770 include_dirs = include_dirs,
1771 libraries = libs,
1772 library_dirs = added_lib_dirs,
1773 )
1774 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001775
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001776## # Uncomment these lines if you want to play with xxmodule.c
1777## ext = Extension('xx', ['xxmodule.c'])
1778## self.extensions.append(ext)
1779
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001780 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001781 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001782 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001783 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001784 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001785 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001786 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001787
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001788 def configure_ctypes_darwin(self, ext):
1789 # Darwin (OS X) uses preconfigured files, in
1790 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001791 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001792 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1793 '_ctypes', 'libffi_osx'))
1794 sources = [os.path.join(ffi_srcdir, p)
1795 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001796 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001797 'x86/x86-darwin.S',
1798 'x86/x86-ffi_darwin.c',
1799 'x86/x86-ffi64.c',
1800 'powerpc/ppc-darwin.S',
1801 'powerpc/ppc-darwin_closure.S',
1802 'powerpc/ppc-ffi_darwin.c',
1803 'powerpc/ppc64-darwin_closure.S',
1804 ]]
1805
1806 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001807 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001808
1809 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1810 os.path.join(ffi_srcdir, 'powerpc')]
1811 ext.include_dirs.extend(include_dirs)
1812 ext.sources.extend(sources)
1813 return True
1814
Thomas Hellereba43c12006-04-07 19:04:09 +00001815 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001816 if not self.use_system_libffi:
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001817 if sys.platform == 'darwin':
1818 return self.configure_ctypes_darwin(ext)
1819
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001820 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001821 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1822 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1823 '_ctypes', 'libffi'))
1824 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001825
Thomas Heller5e218b42006-04-27 15:50:42 +00001826 from distutils.dep_util import newer_group
1827
1828 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001829 for fname in os.listdir(ffi_srcdir)
1830 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001831 if self.force or newer_group(config_sources,
1832 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001833 from distutils.dir_util import mkpath
1834 mkpath(ffi_builddir)
1835 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001836
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001837 # Pass empty CFLAGS because we'll just append the resulting
1838 # CFLAGS to Python's; -g or -O2 is to be avoided.
1839 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1840 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001841
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001842 res = os.system(cmd)
1843 if res or not os.path.exists(ffi_configfile):
1844 print "Failed to configure _ctypes module"
1845 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001846
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001847 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001848 with open(ffi_configfile) as f:
1849 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001850
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001851 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001852 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001853
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001854 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001855 ffi_builddir,
1856 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001857 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001858
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001859 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1860 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001861 ext.include_dirs.extend(include_dirs)
1862 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00001863 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00001864
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001865 def detect_ctypes(self, inc_dirs, lib_dirs):
1866 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00001867 include_dirs = []
1868 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00001869 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001870 sources = ['_ctypes/_ctypes.c',
1871 '_ctypes/callbacks.c',
1872 '_ctypes/callproc.c',
1873 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00001874 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001875 depends = ['_ctypes/ctypes.h']
1876
1877 if sys.platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00001878 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001879 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001880 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001881 include_dirs.append('_ctypes/darwin')
1882# XXX Is this still needed?
1883## extra_link_args.extend(['-read_only_relocs', 'warning'])
1884
Thomas Heller17984892006-08-04 18:57:34 +00001885 elif sys.platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00001886 # XXX This shouldn't be necessary; it appears that some
1887 # of the assembler code is non-PIC (i.e. it has relocations
1888 # when it shouldn't. The proper fix would be to rewrite
1889 # the assembler code to be PIC.
1890 # This only works with GCC; the Sun compiler likely refuses
1891 # this option. If you want to compile ctypes with the Sun
1892 # compiler, please research a proper solution, instead of
1893 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00001894 extra_link_args.append('-mimpure-text')
1895
Thomas Hellerde2d78a2008-06-02 18:41:30 +00001896 elif sys.platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00001897 extra_link_args.append('-fPIC')
1898
Thomas Hellercf567c12006-03-08 19:51:58 +00001899 ext = Extension('_ctypes',
1900 include_dirs=include_dirs,
1901 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00001902 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001903 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001904 sources=sources,
1905 depends=depends)
1906 ext_test = Extension('_ctypes_test',
1907 sources=['_ctypes/_ctypes_test.c'])
1908 self.extensions.extend([ext, ext_test])
1909
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001910 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1911 return
1912
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001913 if sys.platform == 'darwin':
1914 # OS X 10.5 comes with libffi.dylib; the include files are
1915 # in /usr/include/ffi
1916 inc_dirs.append('/usr/include/ffi')
1917
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001918 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00001919 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001920 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001921 if ffi_inc is not None:
1922 ffi_h = ffi_inc[0] + '/ffi.h'
1923 fp = open(ffi_h)
1924 while 1:
1925 line = fp.readline()
1926 if not line:
1927 ffi_inc = None
1928 break
1929 if line.startswith('#define LIBFFI_H'):
1930 break
1931 ffi_lib = None
1932 if ffi_inc is not None:
1933 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001934 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001935 ffi_lib = lib_name
1936 break
1937
1938 if ffi_inc and ffi_lib:
1939 ext.include_dirs.extend(ffi_inc)
1940 ext.libraries.append(ffi_lib)
1941 self.use_system_libffi = True
1942
1943
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001944class PyBuildInstall(install):
1945 # Suppress the warning about installation into the lib_dynload
1946 # directory, which is not in sys.path when running Python during
1947 # installation:
1948 def initialize_options (self):
1949 install.initialize_options(self)
1950 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001951
Michael W. Hudson529a5052002-12-17 16:47:17 +00001952class PyBuildInstallLib(install_lib):
1953 # Do exactly what install_lib does but make sure correct access modes get
1954 # set on installed directories and files. All installed files with get
1955 # mode 644 unless they are a shared library in which case they will get
1956 # mode 755. All installed directories will get mode 755.
1957
1958 so_ext = sysconfig.get_config_var("SO")
1959
1960 def install(self):
1961 outfiles = install_lib.install(self)
1962 self.set_file_modes(outfiles, 0644, 0755)
1963 self.set_dir_modes(self.install_dir, 0755)
1964 return outfiles
1965
1966 def set_file_modes(self, files, defaultMode, sharedLibMode):
1967 if not self.is_chmod_supported(): return
1968 if not files: return
1969
1970 for filename in files:
1971 if os.path.islink(filename): continue
1972 mode = defaultMode
1973 if filename.endswith(self.so_ext): mode = sharedLibMode
1974 log.info("changing mode of %s to %o", filename, mode)
1975 if not self.dry_run: os.chmod(filename, mode)
1976
1977 def set_dir_modes(self, dirname, mode):
1978 if not self.is_chmod_supported(): return
1979 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
1980
1981 def set_dir_modes_visitor(self, mode, dirname, names):
1982 if os.path.islink(dirname): return
1983 log.info("changing mode of %s to %o", dirname, mode)
1984 if not self.dry_run: os.chmod(dirname, mode)
1985
1986 def is_chmod_supported(self):
1987 return hasattr(os, 'chmod')
1988
Guido van Rossum14ee89c2003-02-20 02:52:04 +00001989SUMMARY = """
1990Python is an interpreted, interactive, object-oriented programming
1991language. It is often compared to Tcl, Perl, Scheme or Java.
1992
1993Python combines remarkable power with very clear syntax. It has
1994modules, classes, exceptions, very high level dynamic data types, and
1995dynamic typing. There are interfaces to many system calls and
1996libraries, as well as to various windowing systems (X11, Motif, Tk,
1997Mac, MFC). New built-in modules are easily written in C or C++. Python
1998is also usable as an extension language for applications that need a
1999programmable interface.
2000
2001The Python implementation is portable: it runs on many brands of UNIX,
2002on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2003listed here, it may still be supported, if there's a C compiler for
2004it. Ask around on comp.lang.python -- or just try compiling Python
2005yourself.
2006"""
2007
2008CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002009Development Status :: 6 - Mature
2010License :: OSI Approved :: Python Software Foundation License
2011Natural Language :: English
2012Programming Language :: C
2013Programming Language :: Python
2014Topic :: Software Development
2015"""
2016
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002017def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002018 # turn off warnings when deprecated modules are imported
2019 import warnings
2020 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002021 setup(# PyPI Metadata (PEP 301)
2022 name = "Python",
2023 version = sys.version.split()[0],
2024 url = "http://www.python.org/%s" % sys.version[:3],
2025 maintainer = "Guido van Rossum and the Python community",
2026 maintainer_email = "python-dev@python.org",
2027 description = "A high-level object-oriented programming language",
2028 long_description = SUMMARY.strip(),
2029 license = "PSF license",
2030 classifiers = filter(None, CLASSIFIERS.split("\n")),
2031 platforms = ["Many"],
2032
2033 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002034 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2035 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002036 # The struct module is defined here, because build_ext won't be
2037 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002038 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002039
2040 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002041 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002042 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002043 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002044 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002045
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002046# --install-platlib
2047if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002048 main()