blob: 2c1473c8bb5540b6e8b124439d244fc100de0de2 [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()]
Stefan Krah4666ebd2012-02-29 14:17:18 +0100189 headers += glob(os.path.join(sysconfig.get_path('include'), "*.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
Barry Warsawffc9caf2011-04-07 11:28:11 -0400348 def add_multiarch_paths(self):
349 # Debian/Ubuntu multiarch support.
350 # https://wiki.ubuntu.com/MultiarchSpec
351 if not find_executable('dpkg-architecture'):
352 return
353 tmpfile = os.path.join(self.build_temp, 'multiarch')
354 if not os.path.exists(self.build_temp):
355 os.makedirs(self.build_temp)
356 ret = os.system(
357 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
358 tmpfile)
359 try:
360 if ret >> 8 == 0:
361 with open(tmpfile) as fp:
362 multiarch_path_component = fp.readline().strip()
363 add_dir_to_list(self.compiler.library_dirs,
364 '/usr/lib/' + multiarch_path_component)
365 add_dir_to_list(self.compiler.include_dirs,
366 '/usr/include/' + multiarch_path_component)
367 finally:
368 os.unlink(tmpfile)
369
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000370 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000371 # Ensure that /usr/local is always used
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000372 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
373 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400374 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000375
Brett Cannon516592f2004-12-07 00:42:59 +0000376 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000377 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000378 # We must get the values from the Makefile and not the environment
379 # directly since an inconsistently reproducible issue comes up where
380 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000381 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000382 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000383 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
384 ('LDFLAGS', '-L', self.compiler.library_dirs),
385 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000386 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000387 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000388 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000389 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000390 # all double dashes and any dashes followed by a character
391 # that is not for the option we are dealing with.
392 #
393 # Please note that order of the regex is important! We must
394 # strip out double-dashes first so that we don't end up with
395 # substituting "--Long" to "-Long" and thus lead to "ong" being
396 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000397 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
398 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000399 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000400 # Make sure that allowing args interspersed with options is
401 # allowed
402 parser.allow_interspersed_args = True
403 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000404 parser.add_option(arg_name, dest="dirs", action="append")
405 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000406 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000407 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000408 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000409
Ronald Oussoren24215252010-10-20 13:11:46 +0000410 if os.path.normpath(sys.prefix) != '/usr' \
411 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
412 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
413 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
414 # building a framework with different architectures than
415 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000416 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000417 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000418 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000419 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000420
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000421 try:
422 have_unicode = unicode
423 except NameError:
424 have_unicode = 0
425
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000426 # lib_dirs and inc_dirs are used to search for files;
427 # if a file is found in one of those directories, it can
428 # be assumed that no additional -I,-L directives are needed.
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000429 lib_dirs = self.compiler.library_dirs + [
Martin v. Löwisfba73692004-11-13 11:13:35 +0000430 '/lib64', '/usr/lib64',
431 '/lib', '/usr/lib',
432 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000433 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000434 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000435 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000436
Brett Cannon4454a1f2005-04-15 20:32:39 +0000437 config_h = sysconfig.get_config_h_filename()
438 config_h_vars = sysconfig.parse_config_h(open(config_h))
439
Fredrik Lundhade711a2001-01-24 08:00:28 +0000440 platform = self.get_platform()
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000441 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000442
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000443 # Check for AtheOS which has libraries in non-standard locations
444 if platform == 'atheos':
445 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
446 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
447 inc_dirs += ['/system/include', '/atheos/autolnk/include']
448 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
449
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000450 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
451 if platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000452 lib_dirs += ['/usr/ccs/lib']
453
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000454 if platform == 'darwin':
455 # This should work on any unixy platform ;-)
456 # If the user has bothered specifying additional -I and -L flags
457 # in OPT and LDFLAGS we might as well use them here.
458 # NOTE: using shlex.split would technically be more correct, but
459 # also gives a bootstrap problem. Let's hope nobody uses directories
460 # with whitespace in the name to store libraries.
461 cflags, ldflags = sysconfig.get_config_vars(
462 'CFLAGS', 'LDFLAGS')
463 for item in cflags.split():
464 if item.startswith('-I'):
465 inc_dirs.append(item[2:])
466
467 for item in ldflags.split():
468 if item.startswith('-L'):
469 lib_dirs.append(item[2:])
470
Fredrik Lundhade711a2001-01-24 08:00:28 +0000471 # Check for MacOS X, which doesn't need libm.a at all
472 math_libs = ['m']
Ronald Oussoren9545a232010-05-05 19:09:31 +0000473 if platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000474 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000475
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000476 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
477
478 #
479 # The following modules are all pretty straightforward, and compile
480 # on pretty much any POSIXish platform.
481 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000482
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000483 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000484 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000485
486 # array objects
487 exts.append( Extension('array', ['arraymodule.c']) )
488 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000489 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
490 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000491 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000492 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000493 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000494 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000495 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000496 # fast string operations implemented in C
497 exts.append( Extension('strop', ['stropmodule.c']) )
498 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000499 exts.append( Extension('time', ['timemodule.c'],
500 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000501 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000502 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000503 # fast iterator tools implemented in C
504 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000505 # code that will be builtins in the future, but conflict with the
506 # current builtins
507 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000508 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000509 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000510 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000511 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000512 # bisect
513 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000514 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000515 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000516 # operator.add() and similar goodies
517 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000518 # Python 3.1 _io library
519 exts.append( Extension("_io",
520 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
521 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
522 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000523 # _functools
524 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000525 # _json speedups
526 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000527 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000528 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
529 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000530 # profilers (_lsprof is for cProfile.py)
531 exts.append( Extension('_hotshot', ['_hotshot.c']) )
532 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000533 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000534 if have_unicode:
535 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000536 else:
537 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000538 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000539 data = open('pyconfig.h').read()
540 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
541 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000542 locale_libs = ['intl']
543 else:
544 locale_libs = []
Jack Jansen84b74472004-07-15 19:56:25 +0000545 if platform == 'darwin':
546 locale_extra_link_args = ['-framework', 'CoreFoundation']
547 else:
548 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000549
Jack Jansen84b74472004-07-15 19:56:25 +0000550
Jason Tishlerd28216b2002-08-14 11:13:52 +0000551 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000552 libraries=locale_libs,
553 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000554
555 # Modules with some UNIX dependencies -- on by default:
556 # (If you have a really backward UNIX, select and socket may not be
557 # supported...)
558
559 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000560 libs = []
561 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
562 # May be necessary on AIX for flock function
563 libs = ['bsd']
564 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000565 # pwd(3)
566 exts.append( Extension('pwd', ['pwdmodule.c']) )
567 # grp(3)
568 exts.append( Extension('grp', ['grpmodule.c']) )
569 # spwd, shadow passwords
570 if (config_h_vars.get('HAVE_GETSPNAM', False) or
571 config_h_vars.get('HAVE_GETSPENT', False)):
572 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000573 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000574 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000575
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000576 # select(2); not on ancient System V
577 exts.append( Extension('select', ['selectmodule.c']) )
578
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000579 # Fred Drake's interface to the Python parser
580 exts.append( Extension('parser', ['parsermodule.c']) )
581
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000582 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000583 exts.append( Extension('cStringIO', ['cStringIO.c']) )
584 exts.append( Extension('cPickle', ['cPickle.c']) )
585
586 # Memory-mapped files (also works on Win32).
Ronald Oussoren9545a232010-05-05 19:09:31 +0000587 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000588 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000589 else:
590 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000591
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000592 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000593 # syslog daemon interface
594 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000595
596 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000597 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
598 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
599 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000600
601 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000602 # Here ends the simple stuff. From here on, modules need certain
603 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000604 #
605
606 # Multimedia modules
607 # These don't work for 64-bit platforms!!!
608 # These represent audio samples or images as strings:
609
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000610 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000611 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000612 # 64-bit platforms.
613 exts.append( Extension('audioop', ['audioop.c']) )
614
Fredrik Lundhade711a2001-01-24 08:00:28 +0000615 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000616 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000617 # Operations on images
618 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000619 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000620 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000621
622 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000623 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000624 readline_termcap_library = ""
625 curses_library = ""
626 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000627 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000628 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000629 ldd_output = fp.readlines()
630 ret = fp.close()
631 if ret is None or ret >> 8 == 0:
632 for ln in ldd_output:
633 if 'curses' in ln:
634 readline_termcap_library = re.sub(
635 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
636 ).rstrip()
637 break
638 if 'tinfo' in ln: # termcap interface split out from ncurses
639 readline_termcap_library = 'tinfo'
640 break
Stefan Krah449aa862010-06-03 12:39:50 +0000641 # Issue 7384: If readline is already linked against curses,
642 # use the same library for the readline and curses modules.
643 if 'curses' in readline_termcap_library:
644 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000645 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000646 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000647 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000648 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000649 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000650 curses_library = 'curses'
651
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000652 if platform == 'darwin':
653 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000654 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
655 if dep_target and dep_target.split('.') < ['10', '5']:
656 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000657 if os_release < 9:
658 # MacOSX 10.4 has a broken readline. Don't try to build
659 # the readline module unless the user has installed a fixed
660 # readline package
661 if find_file('readline/rlconf.h', inc_dirs, []) is None:
662 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000663 if do_readline:
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000664 if platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000665 # In every directory on the search path search for a dynamic
666 # library and then a static library, instead of first looking
667 # for dynamic libraries on the entiry path.
668 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000669 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000670 readline_extra_link_args = ('-Wl,-search_paths_first',)
671 else:
672 readline_extra_link_args = ()
673
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000674 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000675 if readline_termcap_library:
676 pass # Issue 7384: Already linked against curses or tinfo.
677 elif curses_library:
678 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000679 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000680 ['/usr/lib/termcap'],
681 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000682 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000683 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000684 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000685 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000686 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000687 else:
688 missing.append('readline')
689
Ronald Oussoren9545a232010-05-05 19:09:31 +0000690 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000691
Ronald Oussoren9545a232010-05-05 19:09:31 +0000692 if self.compiler.find_library_file(lib_dirs, 'crypt'):
693 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000694 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000695 libs = []
696 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000697
Skip Montanaroba9e9782003-03-20 23:34:22 +0000698 # CSV files
699 exts.append( Extension('_csv', ['_csv.c']) )
700
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000701 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000702 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000703 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000704 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000705 search_for_ssl_incs_in = [
706 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000707 '/usr/contrib/ssl/include/'
708 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000709 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
710 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000711 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000712 if ssl_incs is not None:
713 krb5_h = find_file('krb5.h', inc_dirs,
714 ['/usr/kerberos/include'])
715 if krb5_h:
716 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000717 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000718 ['/usr/local/ssl/lib',
719 '/usr/contrib/ssl/lib/'
720 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000721
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000722 if (ssl_incs is not None and
723 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000724 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000725 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000726 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000727 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000728 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000729 else:
730 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000731
Gregory P. Smithade97332005-08-23 21:19:40 +0000732 # find out which version of OpenSSL we have
733 openssl_ver = 0
734 openssl_ver_re = re.compile(
735 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000736
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000737 # look for the openssl version header on the compiler search path.
738 opensslv_h = find_file('openssl/opensslv.h', [],
739 inc_dirs + search_for_ssl_incs_in)
740 if opensslv_h:
741 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
742 if sys.platform == 'darwin' and is_macosx_sdk_path(name):
743 name = os.path.join(macosx_sdk_root(), name[1:])
744 try:
745 incfile = open(name, 'r')
746 for line in incfile:
747 m = openssl_ver_re.match(line)
748 if m:
749 openssl_ver = eval(m.group(1))
750 except IOError, msg:
751 print "IOError while reading opensshv.h:", msg
752 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000753
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000754 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000755 have_any_openssl = ssl_incs is not None and ssl_libs is not None
756 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000757 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000758
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000759 if have_any_openssl:
760 if have_usable_openssl:
761 # The _hashlib module wraps optimized implementations
762 # of hash functions from the OpenSSL library.
763 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
764 include_dirs = ssl_incs,
765 library_dirs = ssl_libs,
766 libraries = ['ssl', 'crypto']) )
767 else:
768 print ("warning: openssl 0x%08x is too old for _hashlib" %
769 openssl_ver)
770 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000771 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000772 # The _sha module implements the SHA1 hash algorithm.
773 exts.append( Extension('_sha', ['shamodule.c']) )
774 # The _md5 module implements the RSA Data Security, Inc. MD5
775 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000776 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000777 exts.append( Extension('_md5',
778 sources = ['md5module.c', 'md5.c'],
779 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000780
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000781 min_sha2_openssl_ver = 0x00908000
782 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000783 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
784 exts.append( Extension('_sha256', ['sha256module.c']) )
785 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000786
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000787 # Modules that provide persistent dictionary-like semantics. You will
788 # probably want to arrange for at least one of them to be available on
789 # your machine, though none are defined by default because of library
790 # dependencies. The Python module anydbm.py provides an
791 # implementation independent wrapper for these; dumbdbm.py provides
792 # similar functionality (but slower of course) implemented in Python.
793
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000794 # Sleepycat^WOracle Berkeley DB interface.
795 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000796 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000797 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000798 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000799 # a release. Most open source OSes come with one or more
800 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000801
Matthias Klose54cc5392010-03-15 12:46:18 +0000802 max_db_ver = (4, 8)
Jesus Cea6557aac2010-03-22 14:22:26 +0000803 min_db_ver = (4, 1)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000804 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000805
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000806 def allow_db_ver(db_ver):
807 """Returns a boolean if the given BerkeleyDB version is acceptable.
808
809 Args:
810 db_ver: A tuple of the version to verify.
811 """
812 if not (min_db_ver <= db_ver <= max_db_ver):
813 return False
814 # Use this function to filter out known bad configurations.
815 if (4, 6) == db_ver[:2]:
816 # BerkeleyDB 4.6.x is not stable on many architectures.
817 arch = platform_machine()
818 if arch not in ('i386', 'i486', 'i586', 'i686',
819 'x86_64', 'ia64'):
820 return False
821 return True
822
823 def gen_db_minor_ver_nums(major):
824 if major == 4:
825 for x in range(max_db_ver[1]+1):
826 if allow_db_ver((4, x)):
827 yield x
828 elif major == 3:
829 for x in (3,):
830 if allow_db_ver((3, x)):
831 yield x
832 else:
833 raise ValueError("unknown major BerkeleyDB version", major)
834
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000835 # construct a list of paths to look for the header file in on
836 # top of the normal inc_dirs.
837 db_inc_paths = [
838 '/usr/include/db4',
839 '/usr/local/include/db4',
840 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000841 '/usr/include/db3',
842 '/usr/local/include/db3',
843 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000844 # Fink defaults (http://fink.sourceforge.net/)
845 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000846 '/sw/include/db3',
847 ]
848 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000849 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000850 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000851 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000852 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
853 db_inc_paths.append('/usr/local/include/db4%d' % x)
854 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000855 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000856 # MacPorts default (http://www.macports.org/)
857 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000858 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000859 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000860 db_inc_paths.append('/usr/include/db3%d' % x)
861 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
862 db_inc_paths.append('/usr/local/include/db3%d' % x)
863 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000864 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000865
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000866 # Add some common subdirectories for Sleepycat DB to the list,
867 # based on the standard include directories. This way DB3/4 gets
868 # picked up when it is installed in a non-standard prefix and
869 # the user has added that prefix into inc_dirs.
870 std_variants = []
871 for dn in inc_dirs:
872 std_variants.append(os.path.join(dn, 'db3'))
873 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000874 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000875 std_variants.append(os.path.join(dn, "db4%d"%x))
876 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000877 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000878 std_variants.append(os.path.join(dn, "db3%d"%x))
879 std_variants.append(os.path.join(dn, "db3.%d"%x))
880
Tim Peters38ff36c2006-06-30 06:18:39 +0000881 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000882 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000883
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000884 db_ver_inc_map = {}
885
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000886 if sys.platform == 'darwin':
887 sysroot = macosx_sdk_root()
888
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000889 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000890 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000891 # See whether there is a Sleepycat header in the standard
892 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000893 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000894 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000895
896 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
897 f = os.path.join(sysroot, d[1:], "db.h")
898
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000899 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000900 if os.path.exists(f):
901 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000902 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000903 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000904 db_major = int(m.group(1))
905 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
906 db_minor = int(m.group(1))
907 db_ver = (db_major, db_minor)
908
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000909 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
910 if db_ver == (4, 6):
911 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
912 db_patch = int(m.group(1))
913 if db_patch < 21:
914 print "db.h:", db_ver, "patch", db_patch,
915 print "being ignored (4.6.x must be >= 4.6.21)"
916 continue
917
Antoine Pitrou8c510e72010-01-13 11:47:49 +0000918 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000919 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000920 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +0000921 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000922 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000923 if db_setup_debug:
924 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000925 else:
926 # we already found a header for this library version
927 if db_setup_debug: print "db.h: ignoring", d
928 else:
929 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +0000930 if db_setup_debug:
931 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000932
933 db_found_vers = db_ver_inc_map.keys()
934 db_found_vers.sort()
935
936 while db_found_vers:
937 db_ver = db_found_vers.pop()
938 db_incdir = db_ver_inc_map[db_ver]
939
940 # check lib directories parallel to the location of the header
941 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +0000942 db_incdir.replace("include", 'lib64'),
943 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000944 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000945
946 if sys.platform != 'darwin':
947 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
948
949 else:
950 # Same as other branch, but takes OSX SDK into account
951 tmp = []
952 for dn in db_dirs_to_check:
953 if is_macosx_sdk_path(dn):
954 if os.path.isdir(os.path.join(sysroot, dn[1:])):
955 tmp.append(dn)
956 else:
957 if os.path.isdir(dn):
958 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +0000959 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000960
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200961 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000962 # XXX should we -ever- look for a dbX name? Do any
963 # systems really not name their library by version and
964 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +0000965 for dblib in (('db-%d.%d' % db_ver),
966 ('db%d%d' % db_ver),
967 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000968 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000969 db_dirs_to_check + lib_dirs, dblib )
970 if dblib_file:
971 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
972 raise db_found
973 else:
974 if db_setup_debug: print "db lib: ", dblib, "not found"
975
976 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +0000977 if db_setup_debug:
978 print "bsddb using BerkeleyDB lib:", db_ver, dblib
979 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000980 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +0000981 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000982 # We add the runtime_library_dirs argument because the
983 # BerkeleyDB lib we're linking against often isn't in the
984 # system dynamic library search path. This is usually
985 # correct and most trouble free, but may cause problems in
986 # some unusual system configurations (e.g. the directory
987 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000988 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +0000989 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000990 library_dirs=dblib_dir,
991 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000992 include_dirs=db_incs,
993 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +0000994 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000995 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +0000996 db_incs = None
997 dblibs = []
998 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +0000999 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001000
Anthony Baxterc51ee692006-04-01 00:57:31 +00001001 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001002 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001003
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001004 # We hunt for #define SQLITE_VERSION "n.n.n"
1005 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001006 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001007 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001008 '/usr/include/sqlite',
1009 '/usr/include/sqlite3',
1010 '/usr/local/include',
1011 '/usr/local/include/sqlite',
1012 '/usr/local/include/sqlite3',
1013 ]
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001014 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1015 MIN_SQLITE_VERSION = ".".join([str(x)
1016 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001017
1018 # Scan the default include directories before the SQLite specific
1019 # ones. This allows one to override the copy of sqlite on OSX,
1020 # where /usr/include contains an old version of sqlite.
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001021 if sys.platform == 'darwin':
1022 sysroot = macosx_sdk_root()
1023
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001024 for d in inc_dirs + sqlite_inc_paths:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001025 f = os.path.join(d, "sqlite3.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001026
1027 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
1028 f = os.path.join(sysroot, d[1:], "sqlite3.h")
1029
Anthony Baxterc51ee692006-04-01 00:57:31 +00001030 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001031 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001032 incf = open(f).read()
1033 m = re.search(
1034 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001035 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001036 sqlite_version = m.group(1)
1037 sqlite_version_tuple = tuple([int(x)
1038 for x in sqlite_version.split(".")])
1039 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001040 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001041 if sqlite_setup_debug:
1042 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001043 sqlite_incdir = d
1044 break
1045 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001046 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001047 print "%s: version %d is too old, need >= %s"%(d,
1048 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001049 elif sqlite_setup_debug:
1050 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1051
Anthony Baxterc51ee692006-04-01 00:57:31 +00001052 if sqlite_incdir:
1053 sqlite_dirs_to_check = [
1054 os.path.join(sqlite_incdir, '..', 'lib64'),
1055 os.path.join(sqlite_incdir, '..', 'lib'),
1056 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1057 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1058 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001059 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001060 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001061 if sqlite_libfile:
1062 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001063
1064 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001065 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001066 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001067 '_sqlite/cursor.c',
1068 '_sqlite/microprotocols.c',
1069 '_sqlite/module.c',
1070 '_sqlite/prepare_protocol.c',
1071 '_sqlite/row.c',
1072 '_sqlite/statement.c',
1073 '_sqlite/util.c', ]
1074
Anthony Baxterc51ee692006-04-01 00:57:31 +00001075 sqlite_defines = []
1076 if sys.platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001077 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001078 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001079 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1080
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001081 # Comment this out if you want the sqlite3 module to be able to load extensions.
1082 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001083
1084 if sys.platform == 'darwin':
1085 # In every directory on the search path search for a dynamic
1086 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001087 # for dynamic libraries on the entire path.
1088 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001089 # before the dynamic library in /usr/lib.
1090 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1091 else:
1092 sqlite_extra_link_args = ()
1093
Anthony Baxterc51ee692006-04-01 00:57:31 +00001094 exts.append(Extension('_sqlite3', sqlite_srcs,
1095 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001096 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001097 sqlite_incdir],
1098 library_dirs=sqlite_libdir,
1099 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001100 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001101 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001102 else:
1103 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001104
1105 # Look for Berkeley db 1.85. Note that it is built as a different
1106 # module name so it can be included even when later versions are
1107 # available. A very restrictive search is performed to avoid
1108 # accidentally building this module with a later version of the
1109 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1110 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001111 #
1112 # If the better bsddb library can be built (db_incs is defined)
1113 # we do not build this one. Otherwise this build will pick up
1114 # the more recent berkeleydb's db.h file first in the include path
1115 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001116 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001117
1118 if sys.platform == 'darwin':
1119 if is_macosx_sdk_path(f):
1120 sysroot = macosx_sdk_root()
1121 f = os.path.join(sysroot, f[1:])
1122
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001123 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001124 data = open(f).read()
1125 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1126 if m is not None:
1127 # bingo - old version used hash file format version 2
1128 ### XXX this should be fixed to not be platform-dependent
1129 ### but I don't have direct access to an osf1 platform and
1130 ### seemed to be muffing the search somehow
1131 libraries = platform == "osf1" and ['db'] or None
1132 if libraries is not None:
1133 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1134 libraries=libraries))
1135 else:
1136 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001137 else:
1138 missing.append('bsddb185')
1139 else:
1140 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001141
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001142 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001143 # The standard Unix dbm module:
Jack Jansend1b20452002-07-08 21:39:36 +00001144 if platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001145 config_args = [arg.strip("'")
1146 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001147 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001148 if arg.startswith('--with-dbmliborder=')]
1149 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001150 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001151 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001152 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001153 dbmext = None
1154 for cand in dbm_order:
1155 if cand == "ndbm":
1156 if find_file("ndbm.h", inc_dirs, []) is not None:
1157 # Some systems have -lndbm, others don't
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001158 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001159 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001160 ndbm_libs = ['ndbm']
1161 else:
1162 ndbm_libs = []
1163 print "building dbm using ndbm"
1164 dbmext = Extension('dbm', ['dbmmodule.c'],
1165 define_macros=[
1166 ('HAVE_NDBM_H',None),
1167 ],
1168 libraries=ndbm_libs)
1169 break
1170
1171 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001172 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001173 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001174 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001175 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001176 gdbm_libs.append('gdbm_compat')
1177 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1178 print "building dbm using gdbm"
1179 dbmext = Extension(
1180 'dbm', ['dbmmodule.c'],
1181 define_macros=[
1182 ('HAVE_GDBM_NDBM_H', None),
1183 ],
1184 libraries = gdbm_libs)
1185 break
1186 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1187 print "building dbm using gdbm"
1188 dbmext = Extension(
1189 'dbm', ['dbmmodule.c'],
1190 define_macros=[
1191 ('HAVE_GDBM_DASH_NDBM_H', None),
1192 ],
1193 libraries = gdbm_libs)
1194 break
1195 elif cand == "bdb":
1196 if db_incs is not None:
1197 print "building dbm using bdb"
1198 dbmext = Extension('dbm', ['dbmmodule.c'],
1199 library_dirs=dblib_dir,
1200 runtime_library_dirs=dblib_dir,
1201 include_dirs=db_incs,
1202 define_macros=[
1203 ('HAVE_BERKDB_H', None),
1204 ('DB_DBM_HSEARCH', None),
1205 ],
1206 libraries=dblibs)
1207 break
1208 if dbmext is not None:
1209 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001210 else:
1211 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001212
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001213 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001214 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001215 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001216 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1217 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001218 else:
1219 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001220
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001221 # Unix-only modules
Ronald Oussoren9545a232010-05-05 19:09:31 +00001222 if platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001223 # Steen Lumholt's termios module
1224 exts.append( Extension('termios', ['termios.c']) )
1225 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43 +00001226 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001227 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001228 else:
1229 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001230
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001231 # Sun yellow pages. Some systems have the functions in libc.
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001232 if (platform not in ['cygwin', 'atheos', 'qnx6'] and
1233 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001234 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001235 libs = ['nsl']
1236 else:
1237 libs = []
1238 exts.append( Extension('nis', ['nismodule.c'],
1239 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001240 else:
1241 missing.append('nis')
1242 else:
1243 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001244
Skip Montanaro72092942004-02-07 12:50:19 +00001245 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001246 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001247 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001248 if curses_library.startswith('ncurses'):
1249 if curses_library == 'ncursesw':
1250 # Bug 1464056: If _curses.so links with ncursesw,
1251 # _curses_panel.so must link with panelw.
1252 panel_library = 'panelw'
1253 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001254 exts.append( Extension('_curses', ['_cursesmodule.c'],
1255 libraries = curses_libs) )
Stefan Krah449aa862010-06-03 12:39:50 +00001256 elif curses_library == 'curses' and platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001257 # OSX has an old Berkeley curses, not good enough for
1258 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001259 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001260 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001261 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001262 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001263 else:
1264 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001265
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001266 exts.append( Extension('_curses', ['_cursesmodule.c'],
1267 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001268 else:
1269 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001270
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001271 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001272 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001273 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001274 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001275 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001276 else:
1277 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001278
Barry Warsaw259b1e12002-08-13 20:09:26 +00001279 # Andrew Kuchling's zlib module. Note that some versions of zlib
1280 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1281 # http://www.cert.org/advisories/CA-2002-07.html
1282 #
1283 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1284 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1285 # now, we still accept 1.1.3, because we think it's difficult to
1286 # exploit this in Python, and we'd rather make it RedHat's problem
1287 # than our problem <wink>.
1288 #
1289 # You can upgrade zlib to version 1.1.4 yourself by going to
1290 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001291 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001292 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001293 if zlib_inc is not None:
1294 zlib_h = zlib_inc[0] + '/zlib.h'
1295 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001296 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001297 fp = open(zlib_h)
1298 while 1:
1299 line = fp.readline()
1300 if not line:
1301 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001302 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001303 version = line.split()[2]
1304 break
1305 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001306 if (self.compiler.find_library_file(lib_dirs, 'z')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001307 if sys.platform == "darwin":
1308 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1309 else:
1310 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001311 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001312 libraries = ['z'],
1313 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001314 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001315 else:
1316 missing.append('zlib')
1317 else:
1318 missing.append('zlib')
1319 else:
1320 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001321
Gregory P. Smith440ca772008-03-24 00:08:01 +00001322 # Helper module for various ascii-encoders. Uses zlib for an optimized
1323 # crc32 if we have it. Otherwise binascii uses its own.
1324 if have_zlib:
1325 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1326 libraries = ['z']
1327 extra_link_args = zlib_extra_link_args
1328 else:
1329 extra_compile_args = []
1330 libraries = []
1331 extra_link_args = []
1332 exts.append( Extension('binascii', ['binascii.c'],
1333 extra_compile_args = extra_compile_args,
1334 libraries = libraries,
1335 extra_link_args = extra_link_args) )
1336
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001337 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001338 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001339 if sys.platform == "darwin":
1340 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1341 else:
1342 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001343 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001344 libraries = ['bz2'],
1345 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001346 else:
1347 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001348
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001349 # Interface to the Expat XML parser
1350 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001351 # Expat was written by James Clark and is now maintained by a group of
1352 # developers on SourceForge; see www.libexpat.org for more information.
1353 # The pyexpat module was written by Paul Prescod after a prototype by
1354 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1355 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001356 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001357 #
1358 # More information on Expat can be found at www.libexpat.org.
1359 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001360 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1361 expat_inc = []
1362 define_macros = []
1363 expat_lib = ['expat']
1364 expat_sources = []
1365 else:
1366 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1367 define_macros = [
1368 ('HAVE_EXPAT_CONFIG_H', '1'),
1369 ]
1370 expat_lib = []
1371 expat_sources = ['expat/xmlparse.c',
1372 'expat/xmlrole.c',
1373 'expat/xmltok.c']
Ronald Oussoren988117f2006-04-29 11:31:35 +00001374
Fred Drake2d59a492003-10-21 15:41:15 +00001375 exts.append(Extension('pyexpat',
1376 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001377 include_dirs = expat_inc,
1378 libraries = expat_lib,
1379 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001380 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001381
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001382 # Fredrik Lundh's cElementTree module. Note that this also
1383 # uses expat (via the CAPI hook in pyexpat).
1384
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001385 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001386 define_macros.append(('USE_PYEXPAT_CAPI', None))
1387 exts.append(Extension('_elementtree',
1388 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001389 include_dirs = expat_inc,
1390 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001391 sources = ['_elementtree.c'],
1392 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001393 else:
1394 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001395
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001396 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001397 if have_unicode:
1398 exts.append(Extension('_multibytecodec',
1399 ['cjkcodecs/multibytecodec.c']))
1400 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001401 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001402 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001403 else:
1404 missing.append('_multibytecodec')
1405 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1406 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001407
Michael W. Hudson5b109102002-01-23 15:04:41 +00001408 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001409 if sys.maxint == 0x7fffffff:
1410 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1411 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Anthony Baxter82201742006-04-09 15:07:40 +00001412 if (dl_inc is not None) and (platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001413 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001414 else:
1415 missing.append('dl')
1416 else:
1417 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001418
Thomas Hellercf567c12006-03-08 19:51:58 +00001419 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001420 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001421
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001422 # Richard Oudkerk's multiprocessing module
1423 if platform == 'win32': # Windows
1424 macros = dict()
1425 libraries = ['ws2_32']
1426
1427 elif platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001428 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001429 libraries = []
1430
1431 elif platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001432 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001433 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001434
Martin v. Löwisbb86d832008-11-04 20:40:09 +00001435 elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001436 # FreeBSD's P1003.1b semaphore support is very experimental
1437 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001438 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001439 libraries = []
1440
Jesse Noller37040cd2008-09-30 00:15:45 +00001441 elif platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001442 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001443 libraries = []
1444
Jesse Noller40a61642009-03-31 18:12:35 +00001445 elif platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001446 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001447 libraries = []
1448
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001449 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001450 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001451 libraries = ['rt']
1452
1453 if platform == 'win32':
1454 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1455 '_multiprocessing/semaphore.c',
1456 '_multiprocessing/pipe_connection.c',
1457 '_multiprocessing/socket_connection.c',
1458 '_multiprocessing/win32_functions.c'
1459 ]
1460
1461 else:
1462 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1463 '_multiprocessing/socket_connection.c'
1464 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001465 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001466 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001467 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1468
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001469 if sysconfig.get_config_var('WITH_THREAD'):
1470 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1471 define_macros=macros.items(),
1472 include_dirs=["Modules/_multiprocessing"]))
1473 else:
1474 missing.append('_multiprocessing')
1475
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001476 # End multiprocessing
1477
1478
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001479 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001480 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001481 # Linux-specific modules
1482 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001483 else:
1484 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001485
Matthias Klose8a96d202010-04-21 22:18:52 +00001486 if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1487 'freebsd7', 'freebsd8')
1488 or platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001489 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001490 else:
1491 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001492
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001493 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001494 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001495 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001496 else:
1497 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001498
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001499 if platform == 'darwin':
1500 # _scproxy
1501 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1502 extra_link_args= [
1503 '-framework', 'SystemConfiguration',
1504 '-framework', 'CoreFoundation'
1505 ]))
1506
1507
Tim Peters66cb0182004-08-26 05:23:19 +00001508 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001509 sysconfig.get_config_var("CONFIG_ARGS")):
1510
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001511 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001512 # We're on Mac OS X 10.4 or later, the compiler should
1513 # support '-Wno-deprecated-declarations'. This will
1514 # surpress deprecation warnings for the Carbon extensions,
1515 # these extensions wrap the Carbon APIs and even those
1516 # parts that are deprecated.
1517 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1518 else:
1519 carbon_extra_compile_args = []
1520
Just van Rossum05ced6a2002-11-24 23:15:57 +00001521 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001522 def macSrcExists(name1, name2=''):
1523 if not name1:
1524 return None
1525 names = (name1,)
1526 if name2:
1527 names = (name1, name2)
1528 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1529 return os.path.exists(path)
1530
1531 def addMacExtension(name, kwds, extra_srcs=[]):
1532 dirname = ''
1533 if name[0] == '_':
1534 dirname = name[1:].lower()
1535 cname = name + '.c'
1536 cmodulename = name + 'module.c'
1537 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1538 if macSrcExists(cname):
1539 srcs = [cname]
1540 elif macSrcExists(cmodulename):
1541 srcs = [cmodulename]
1542 elif macSrcExists(dirname, cname):
1543 # XXX(nnorwitz): If all the names ended with module, we
1544 # wouldn't need this condition. ibcarbon is the only one.
1545 srcs = [os.path.join(dirname, cname)]
1546 elif macSrcExists(dirname, cmodulename):
1547 srcs = [os.path.join(dirname, cmodulename)]
1548 else:
1549 raise RuntimeError("%s not found" % name)
1550
1551 # Here's the whole point: add the extension with sources
1552 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1553
1554 # Core Foundation
1555 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1556 'extra_link_args': ['-framework', 'CoreFoundation'],
1557 }
1558 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1559 addMacExtension('autoGIL', core_kwds)
1560
Ronald Oussoren51f06332009-09-20 10:31:22 +00001561
1562
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001563 # Carbon
1564 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1565 'extra_link_args': ['-framework', 'Carbon'],
1566 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001567 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1568 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001569 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001570 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001571 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001572 '_Help', '_Icn', '_IBCarbon', '_List',
1573 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001574 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001575 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001576 for name in CARBON_EXTS:
1577 addMacExtension(name, carbon_kwds)
1578
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001579 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1580 # The _Win extension should build just like the other Carbon extensions, but
1581 # this actually results in a hard crash of the linker.
1582 #
1583 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1584 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1585 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1586 }
1587 addMacExtension('_Win', win_kwds)
1588 else:
1589 addMacExtension('_Win', carbon_kwds)
1590
1591
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001592 # Application Services & QuickTime
1593 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1594 'extra_link_args': ['-framework','ApplicationServices'],
1595 }
1596 addMacExtension('_Launch', app_kwds)
1597 addMacExtension('_CG', app_kwds)
1598
Just van Rossum05ced6a2002-11-24 23:15:57 +00001599 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001600 extra_compile_args=carbon_extra_compile_args,
1601 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001602 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001603
Michael W. Hudson5b109102002-01-23 15:04:41 +00001604
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001605 self.extensions.extend(exts)
1606
1607 # Call the method for detecting whether _tkinter can be compiled
1608 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001609
Skip Montanarod1287322007-03-06 15:41:38 +00001610 if '_tkinter' not in [e.name for e in self.extensions]:
1611 missing.append('_tkinter')
1612
1613 return missing
1614
Jack Jansen0b06be72002-06-21 14:48:38 +00001615 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1616 # The _tkinter module, using frameworks. Since frameworks are quite
1617 # different the UNIX search logic is not sharable.
1618 from os.path import join, exists
1619 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001620 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001621 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001622 join(os.getenv('HOME'), '/Library/Frameworks')
1623 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001624
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001625 sysroot = macosx_sdk_root()
1626
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001627 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001628 # bundles.
1629 # XXX distutils should support -F!
1630 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001631 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001632
1633
Jack Jansen0b06be72002-06-21 14:48:38 +00001634 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001635 if is_macosx_sdk_path(F):
1636 if not exists(join(sysroot, F[1:], fw + '.framework')):
1637 break
1638 else:
1639 if not exists(join(F, fw + '.framework')):
1640 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001641 else:
1642 # ok, F is now directory with both frameworks. Continure
1643 # building
1644 break
1645 else:
1646 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1647 # will now resume.
1648 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001649
Jack Jansen0b06be72002-06-21 14:48:38 +00001650 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1651 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001652 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001653 #
1654 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001655 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001656 for fw in 'Tcl', 'Tk'
1657 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1658 ]
1659
Tim Peters2c60f7a2003-01-29 03:49:43 +00001660 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001661 # complicated search, this is a hard-coded path. It could bail out
1662 # if X11 libs are not found...
1663 include_dirs.append('/usr/X11R6/include')
1664 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1665
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001666 # All existing framework builds of Tcl/Tk don't support 64-bit
1667 # architectures.
1668 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1669 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001670
1671 if is_macosx_sdk_path(F):
1672 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1673 else:
1674 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1675
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001676 detected_archs = []
1677 for ln in fp:
1678 a = ln.split()[-1]
1679 if a in archs:
1680 detected_archs.append(ln.split()[-1])
1681 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001682
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001683 for a in detected_archs:
1684 frameworks.append('-arch')
1685 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001686
Jack Jansen0b06be72002-06-21 14:48:38 +00001687 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1688 define_macros=[('WITH_APPINIT', 1)],
1689 include_dirs = include_dirs,
1690 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001691 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001692 extra_link_args = frameworks,
1693 )
1694 self.extensions.append(ext)
1695 return 1
1696
Tim Peters2c60f7a2003-01-29 03:49:43 +00001697
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001698 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001699 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001700
Jack Jansen0b06be72002-06-21 14:48:38 +00001701 # Rather than complicate the code below, detecting and building
1702 # AquaTk is a separate method. Only one Tkinter will be built on
1703 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1704 platform = self.get_platform()
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001705 if (platform == 'darwin' and
1706 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001707 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001708
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001709 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001710 # The versions with dots are used on Unix, and the versions without
1711 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001712 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001713 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1714 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001715 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001716 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001717 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001718 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001719 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001720 # Exit the loop when we've found the Tcl/Tk libraries
1721 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001722
Fredrik Lundhade711a2001-01-24 08:00:28 +00001723 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001724 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001725 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001726 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001727 dotversion = version
1728 if '.' not in dotversion and "bsd" in sys.platform.lower():
1729 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1730 # but the include subdirs are named like .../include/tcl8.3.
1731 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1732 tcl_include_sub = []
1733 tk_include_sub = []
1734 for dir in inc_dirs:
1735 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1736 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1737 tk_include_sub += tcl_include_sub
1738 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1739 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001740
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001741 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001742 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001743 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001744 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001745
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001746 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001747
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001748 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1749 for dir in tcl_includes + tk_includes:
1750 if dir not in include_dirs:
1751 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001752
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001753 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001754 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001755 include_dirs.append('/usr/openwin/include')
1756 added_lib_dirs.append('/usr/openwin/lib')
1757 elif os.path.exists('/usr/X11R6/include'):
1758 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001759 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001760 added_lib_dirs.append('/usr/X11R6/lib')
1761 elif os.path.exists('/usr/X11R5/include'):
1762 include_dirs.append('/usr/X11R5/include')
1763 added_lib_dirs.append('/usr/X11R5/lib')
1764 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001765 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001766 include_dirs.append('/usr/X11/include')
1767 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001768
Jason Tishler9181c942003-02-05 15:16:17 +00001769 # If Cygwin, then verify that X is installed before proceeding
1770 if platform == 'cygwin':
1771 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1772 if x11_inc is None:
1773 return
1774
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001775 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001776 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001777 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001778 defs.append( ('WITH_BLT', 1) )
1779 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001780 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001781 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001782 defs.append( ('WITH_BLT', 1) )
1783 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001784
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001785 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001786 libs.append('tk'+ version)
1787 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001788
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001789 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001790 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001791
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001792 # Finally, link with the X11 libraries (not appropriate on cygwin)
1793 if platform != "cygwin":
1794 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001795
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001796 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1797 define_macros=[('WITH_APPINIT', 1)] + defs,
1798 include_dirs = include_dirs,
1799 libraries = libs,
1800 library_dirs = added_lib_dirs,
1801 )
1802 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001803
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001804## # Uncomment these lines if you want to play with xxmodule.c
1805## ext = Extension('xx', ['xxmodule.c'])
1806## self.extensions.append(ext)
1807
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001808 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001809 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001810 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001811 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001812 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001813 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001814 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001815
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001816 def configure_ctypes_darwin(self, ext):
1817 # Darwin (OS X) uses preconfigured files, in
1818 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001819 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001820 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1821 '_ctypes', 'libffi_osx'))
1822 sources = [os.path.join(ffi_srcdir, p)
1823 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001824 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001825 'x86/x86-darwin.S',
1826 'x86/x86-ffi_darwin.c',
1827 'x86/x86-ffi64.c',
1828 'powerpc/ppc-darwin.S',
1829 'powerpc/ppc-darwin_closure.S',
1830 'powerpc/ppc-ffi_darwin.c',
1831 'powerpc/ppc64-darwin_closure.S',
1832 ]]
1833
1834 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001835 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001836
1837 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1838 os.path.join(ffi_srcdir, 'powerpc')]
1839 ext.include_dirs.extend(include_dirs)
1840 ext.sources.extend(sources)
1841 return True
1842
Thomas Hellereba43c12006-04-07 19:04:09 +00001843 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001844 if not self.use_system_libffi:
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001845 if sys.platform == 'darwin':
1846 return self.configure_ctypes_darwin(ext)
1847
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001848 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001849 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1850 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1851 '_ctypes', 'libffi'))
1852 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001853
Thomas Heller5e218b42006-04-27 15:50:42 +00001854 from distutils.dep_util import newer_group
1855
1856 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001857 for fname in os.listdir(ffi_srcdir)
1858 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001859 if self.force or newer_group(config_sources,
1860 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001861 from distutils.dir_util import mkpath
1862 mkpath(ffi_builddir)
1863 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001864
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001865 # Pass empty CFLAGS because we'll just append the resulting
1866 # CFLAGS to Python's; -g or -O2 is to be avoided.
1867 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1868 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001869
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001870 res = os.system(cmd)
1871 if res or not os.path.exists(ffi_configfile):
1872 print "Failed to configure _ctypes module"
1873 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001874
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001875 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001876 with open(ffi_configfile) as f:
1877 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001878
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001879 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001880 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001881
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001882 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001883 ffi_builddir,
1884 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001885 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001886
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001887 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1888 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001889 ext.include_dirs.extend(include_dirs)
1890 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00001891 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00001892
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001893 def detect_ctypes(self, inc_dirs, lib_dirs):
1894 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00001895 include_dirs = []
1896 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00001897 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001898 sources = ['_ctypes/_ctypes.c',
1899 '_ctypes/callbacks.c',
1900 '_ctypes/callproc.c',
1901 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00001902 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001903 depends = ['_ctypes/ctypes.h']
1904
1905 if sys.platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00001906 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001907 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001908 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001909 include_dirs.append('_ctypes/darwin')
1910# XXX Is this still needed?
1911## extra_link_args.extend(['-read_only_relocs', 'warning'])
1912
Thomas Heller17984892006-08-04 18:57:34 +00001913 elif sys.platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00001914 # XXX This shouldn't be necessary; it appears that some
1915 # of the assembler code is non-PIC (i.e. it has relocations
1916 # when it shouldn't. The proper fix would be to rewrite
1917 # the assembler code to be PIC.
1918 # This only works with GCC; the Sun compiler likely refuses
1919 # this option. If you want to compile ctypes with the Sun
1920 # compiler, please research a proper solution, instead of
1921 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00001922 extra_link_args.append('-mimpure-text')
1923
Thomas Hellerde2d78a2008-06-02 18:41:30 +00001924 elif sys.platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00001925 extra_link_args.append('-fPIC')
1926
Thomas Hellercf567c12006-03-08 19:51:58 +00001927 ext = Extension('_ctypes',
1928 include_dirs=include_dirs,
1929 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00001930 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001931 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001932 sources=sources,
1933 depends=depends)
1934 ext_test = Extension('_ctypes_test',
1935 sources=['_ctypes/_ctypes_test.c'])
1936 self.extensions.extend([ext, ext_test])
1937
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001938 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1939 return
1940
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001941 if sys.platform == 'darwin':
1942 # OS X 10.5 comes with libffi.dylib; the include files are
1943 # in /usr/include/ffi
1944 inc_dirs.append('/usr/include/ffi')
1945
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001946 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00001947 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001948 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001949 if ffi_inc is not None:
1950 ffi_h = ffi_inc[0] + '/ffi.h'
1951 fp = open(ffi_h)
1952 while 1:
1953 line = fp.readline()
1954 if not line:
1955 ffi_inc = None
1956 break
1957 if line.startswith('#define LIBFFI_H'):
1958 break
1959 ffi_lib = None
1960 if ffi_inc is not None:
1961 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001962 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001963 ffi_lib = lib_name
1964 break
1965
1966 if ffi_inc and ffi_lib:
1967 ext.include_dirs.extend(ffi_inc)
1968 ext.libraries.append(ffi_lib)
1969 self.use_system_libffi = True
1970
1971
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001972class PyBuildInstall(install):
1973 # Suppress the warning about installation into the lib_dynload
1974 # directory, which is not in sys.path when running Python during
1975 # installation:
1976 def initialize_options (self):
1977 install.initialize_options(self)
1978 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001979
Michael W. Hudson529a5052002-12-17 16:47:17 +00001980class PyBuildInstallLib(install_lib):
1981 # Do exactly what install_lib does but make sure correct access modes get
1982 # set on installed directories and files. All installed files with get
1983 # mode 644 unless they are a shared library in which case they will get
1984 # mode 755. All installed directories will get mode 755.
1985
1986 so_ext = sysconfig.get_config_var("SO")
1987
1988 def install(self):
1989 outfiles = install_lib.install(self)
1990 self.set_file_modes(outfiles, 0644, 0755)
1991 self.set_dir_modes(self.install_dir, 0755)
1992 return outfiles
1993
1994 def set_file_modes(self, files, defaultMode, sharedLibMode):
1995 if not self.is_chmod_supported(): return
1996 if not files: return
1997
1998 for filename in files:
1999 if os.path.islink(filename): continue
2000 mode = defaultMode
2001 if filename.endswith(self.so_ext): mode = sharedLibMode
2002 log.info("changing mode of %s to %o", filename, mode)
2003 if not self.dry_run: os.chmod(filename, mode)
2004
2005 def set_dir_modes(self, dirname, mode):
2006 if not self.is_chmod_supported(): return
2007 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2008
2009 def set_dir_modes_visitor(self, mode, dirname, names):
2010 if os.path.islink(dirname): return
2011 log.info("changing mode of %s to %o", dirname, mode)
2012 if not self.dry_run: os.chmod(dirname, mode)
2013
2014 def is_chmod_supported(self):
2015 return hasattr(os, 'chmod')
2016
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002017SUMMARY = """
2018Python is an interpreted, interactive, object-oriented programming
2019language. It is often compared to Tcl, Perl, Scheme or Java.
2020
2021Python combines remarkable power with very clear syntax. It has
2022modules, classes, exceptions, very high level dynamic data types, and
2023dynamic typing. There are interfaces to many system calls and
2024libraries, as well as to various windowing systems (X11, Motif, Tk,
2025Mac, MFC). New built-in modules are easily written in C or C++. Python
2026is also usable as an extension language for applications that need a
2027programmable interface.
2028
2029The Python implementation is portable: it runs on many brands of UNIX,
2030on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2031listed here, it may still be supported, if there's a C compiler for
2032it. Ask around on comp.lang.python -- or just try compiling Python
2033yourself.
2034"""
2035
2036CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002037Development Status :: 6 - Mature
2038License :: OSI Approved :: Python Software Foundation License
2039Natural Language :: English
2040Programming Language :: C
2041Programming Language :: Python
2042Topic :: Software Development
2043"""
2044
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002045def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002046 # turn off warnings when deprecated modules are imported
2047 import warnings
2048 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002049 setup(# PyPI Metadata (PEP 301)
2050 name = "Python",
2051 version = sys.version.split()[0],
2052 url = "http://www.python.org/%s" % sys.version[:3],
2053 maintainer = "Guido van Rossum and the Python community",
2054 maintainer_email = "python-dev@python.org",
2055 description = "A high-level object-oriented programming language",
2056 long_description = SUMMARY.strip(),
2057 license = "PSF license",
2058 classifiers = filter(None, CLASSIFIERS.split("\n")),
2059 platforms = ["Many"],
2060
2061 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002062 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2063 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002064 # The struct module is defined here, because build_ext won't be
2065 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002066 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002067
2068 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002069 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002070 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002071 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002072 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002073
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002074# --install-platlib
2075if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002076 main()