blob: a939b73eda4436aa5e245b6a89e0f55109070fb2 [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
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200454 # HP-UX11iv3 keeps files in lib/hpux folders.
455 if platform == 'hp-ux11':
456 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
457
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000458 if platform == 'darwin':
459 # This should work on any unixy platform ;-)
460 # If the user has bothered specifying additional -I and -L flags
461 # in OPT and LDFLAGS we might as well use them here.
462 # NOTE: using shlex.split would technically be more correct, but
463 # also gives a bootstrap problem. Let's hope nobody uses directories
464 # with whitespace in the name to store libraries.
465 cflags, ldflags = sysconfig.get_config_vars(
466 'CFLAGS', 'LDFLAGS')
467 for item in cflags.split():
468 if item.startswith('-I'):
469 inc_dirs.append(item[2:])
470
471 for item in ldflags.split():
472 if item.startswith('-L'):
473 lib_dirs.append(item[2:])
474
Fredrik Lundhade711a2001-01-24 08:00:28 +0000475 # Check for MacOS X, which doesn't need libm.a at all
476 math_libs = ['m']
Ronald Oussoren9545a232010-05-05 19:09:31 +0000477 if platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000478 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000479
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000480 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
481
482 #
483 # The following modules are all pretty straightforward, and compile
484 # on pretty much any POSIXish platform.
485 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000486
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000487 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000488 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000489
490 # array objects
491 exts.append( Extension('array', ['arraymodule.c']) )
492 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000493 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
494 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000495 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000496 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000497 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000498 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000499 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000500 # fast string operations implemented in C
501 exts.append( Extension('strop', ['stropmodule.c']) )
502 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000503 exts.append( Extension('time', ['timemodule.c'],
504 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000505 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000506 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000507 # fast iterator tools implemented in C
508 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000509 # code that will be builtins in the future, but conflict with the
510 # current builtins
511 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000512 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000513 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000514 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000515 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000516 # bisect
517 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000518 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000519 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000520 # operator.add() and similar goodies
521 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000522 # Python 3.1 _io library
523 exts.append( Extension("_io",
524 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
525 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
526 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000527 # _functools
528 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000529 # _json speedups
530 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000531 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000532 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
533 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000534 # profilers (_lsprof is for cProfile.py)
535 exts.append( Extension('_hotshot', ['_hotshot.c']) )
536 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000537 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000538 if have_unicode:
539 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000540 else:
541 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000542 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000543 data = open('pyconfig.h').read()
544 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
545 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000546 locale_libs = ['intl']
547 else:
548 locale_libs = []
Jack Jansen84b74472004-07-15 19:56:25 +0000549 if platform == 'darwin':
550 locale_extra_link_args = ['-framework', 'CoreFoundation']
551 else:
552 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000553
Jack Jansen84b74472004-07-15 19:56:25 +0000554
Jason Tishlerd28216b2002-08-14 11:13:52 +0000555 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000556 libraries=locale_libs,
557 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000558
559 # Modules with some UNIX dependencies -- on by default:
560 # (If you have a really backward UNIX, select and socket may not be
561 # supported...)
562
563 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000564 libs = []
565 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
566 # May be necessary on AIX for flock function
567 libs = ['bsd']
568 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000569 # pwd(3)
570 exts.append( Extension('pwd', ['pwdmodule.c']) )
571 # grp(3)
572 exts.append( Extension('grp', ['grpmodule.c']) )
573 # spwd, shadow passwords
574 if (config_h_vars.get('HAVE_GETSPNAM', False) or
575 config_h_vars.get('HAVE_GETSPENT', False)):
576 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000577 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000578 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000579
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000580 # select(2); not on ancient System V
581 exts.append( Extension('select', ['selectmodule.c']) )
582
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000583 # Fred Drake's interface to the Python parser
584 exts.append( Extension('parser', ['parsermodule.c']) )
585
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000586 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000587 exts.append( Extension('cStringIO', ['cStringIO.c']) )
588 exts.append( Extension('cPickle', ['cPickle.c']) )
589
590 # Memory-mapped files (also works on Win32).
Ronald Oussoren9545a232010-05-05 19:09:31 +0000591 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000592 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000593 else:
594 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000595
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000596 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000597 # syslog daemon interface
598 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000599
600 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000601 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
602 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
603 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000604
605 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000606 # Here ends the simple stuff. From here on, modules need certain
607 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000608 #
609
610 # Multimedia modules
611 # These don't work for 64-bit platforms!!!
612 # These represent audio samples or images as strings:
613
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000614 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000615 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000616 # 64-bit platforms.
617 exts.append( Extension('audioop', ['audioop.c']) )
618
Fredrik Lundhade711a2001-01-24 08:00:28 +0000619 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000620 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000621 # Operations on images
622 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000623 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000624 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000625
626 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000627 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000628 readline_termcap_library = ""
629 curses_library = ""
630 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000631 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000632 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000633 ldd_output = fp.readlines()
634 ret = fp.close()
635 if ret is None or ret >> 8 == 0:
636 for ln in ldd_output:
637 if 'curses' in ln:
638 readline_termcap_library = re.sub(
639 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
640 ).rstrip()
641 break
642 if 'tinfo' in ln: # termcap interface split out from ncurses
643 readline_termcap_library = 'tinfo'
644 break
Stefan Krah449aa862010-06-03 12:39:50 +0000645 # Issue 7384: If readline is already linked against curses,
646 # use the same library for the readline and curses modules.
647 if 'curses' in readline_termcap_library:
648 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000649 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000650 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000651 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000652 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000653 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000654 curses_library = 'curses'
655
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000656 if platform == 'darwin':
657 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000658 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
659 if dep_target and dep_target.split('.') < ['10', '5']:
660 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000661 if os_release < 9:
662 # MacOSX 10.4 has a broken readline. Don't try to build
663 # the readline module unless the user has installed a fixed
664 # readline package
665 if find_file('readline/rlconf.h', inc_dirs, []) is None:
666 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000667 if do_readline:
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000668 if platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000669 # In every directory on the search path search for a dynamic
670 # library and then a static library, instead of first looking
671 # for dynamic libraries on the entiry path.
672 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000673 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000674 readline_extra_link_args = ('-Wl,-search_paths_first',)
675 else:
676 readline_extra_link_args = ()
677
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000678 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000679 if readline_termcap_library:
680 pass # Issue 7384: Already linked against curses or tinfo.
681 elif curses_library:
682 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000683 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000684 ['/usr/lib/termcap'],
685 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000686 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000687 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000688 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000689 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000690 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000691 else:
692 missing.append('readline')
693
Ronald Oussoren9545a232010-05-05 19:09:31 +0000694 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000695
Ronald Oussoren9545a232010-05-05 19:09:31 +0000696 if self.compiler.find_library_file(lib_dirs, 'crypt'):
697 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000698 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000699 libs = []
700 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000701
Skip Montanaroba9e9782003-03-20 23:34:22 +0000702 # CSV files
703 exts.append( Extension('_csv', ['_csv.c']) )
704
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000705 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000706 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000707 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000708 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000709 search_for_ssl_incs_in = [
710 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000711 '/usr/contrib/ssl/include/'
712 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000713 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
714 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000715 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000716 if ssl_incs is not None:
717 krb5_h = find_file('krb5.h', inc_dirs,
718 ['/usr/kerberos/include'])
719 if krb5_h:
720 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000721 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000722 ['/usr/local/ssl/lib',
723 '/usr/contrib/ssl/lib/'
724 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000725
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000726 if (ssl_incs is not None and
727 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000728 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000729 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000730 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000731 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000732 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000733 else:
734 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000735
Gregory P. Smithade97332005-08-23 21:19:40 +0000736 # find out which version of OpenSSL we have
737 openssl_ver = 0
738 openssl_ver_re = re.compile(
739 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000740
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000741 # look for the openssl version header on the compiler search path.
742 opensslv_h = find_file('openssl/opensslv.h', [],
743 inc_dirs + search_for_ssl_incs_in)
744 if opensslv_h:
745 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
746 if sys.platform == 'darwin' and is_macosx_sdk_path(name):
747 name = os.path.join(macosx_sdk_root(), name[1:])
748 try:
749 incfile = open(name, 'r')
750 for line in incfile:
751 m = openssl_ver_re.match(line)
752 if m:
753 openssl_ver = eval(m.group(1))
754 except IOError, msg:
755 print "IOError while reading opensshv.h:", msg
756 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000757
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000758 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000759 have_any_openssl = ssl_incs is not None and ssl_libs is not None
760 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000761 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000762
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000763 if have_any_openssl:
764 if have_usable_openssl:
765 # The _hashlib module wraps optimized implementations
766 # of hash functions from the OpenSSL library.
767 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
768 include_dirs = ssl_incs,
769 library_dirs = ssl_libs,
770 libraries = ['ssl', 'crypto']) )
771 else:
772 print ("warning: openssl 0x%08x is too old for _hashlib" %
773 openssl_ver)
774 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000775 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000776 # The _sha module implements the SHA1 hash algorithm.
777 exts.append( Extension('_sha', ['shamodule.c']) )
778 # The _md5 module implements the RSA Data Security, Inc. MD5
779 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000780 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000781 exts.append( Extension('_md5',
782 sources = ['md5module.c', 'md5.c'],
783 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000784
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000785 min_sha2_openssl_ver = 0x00908000
786 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000787 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
788 exts.append( Extension('_sha256', ['sha256module.c']) )
789 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000790
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000791 # Modules that provide persistent dictionary-like semantics. You will
792 # probably want to arrange for at least one of them to be available on
793 # your machine, though none are defined by default because of library
794 # dependencies. The Python module anydbm.py provides an
795 # implementation independent wrapper for these; dumbdbm.py provides
796 # similar functionality (but slower of course) implemented in Python.
797
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000798 # Sleepycat^WOracle Berkeley DB interface.
799 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000800 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000801 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000802 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000803 # a release. Most open source OSes come with one or more
804 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000805
Matthias Klose54cc5392010-03-15 12:46:18 +0000806 max_db_ver = (4, 8)
Jesus Cea6557aac2010-03-22 14:22:26 +0000807 min_db_ver = (4, 1)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000808 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000809
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000810 def allow_db_ver(db_ver):
811 """Returns a boolean if the given BerkeleyDB version is acceptable.
812
813 Args:
814 db_ver: A tuple of the version to verify.
815 """
816 if not (min_db_ver <= db_ver <= max_db_ver):
817 return False
818 # Use this function to filter out known bad configurations.
819 if (4, 6) == db_ver[:2]:
820 # BerkeleyDB 4.6.x is not stable on many architectures.
821 arch = platform_machine()
822 if arch not in ('i386', 'i486', 'i586', 'i686',
823 'x86_64', 'ia64'):
824 return False
825 return True
826
827 def gen_db_minor_ver_nums(major):
828 if major == 4:
829 for x in range(max_db_ver[1]+1):
830 if allow_db_ver((4, x)):
831 yield x
832 elif major == 3:
833 for x in (3,):
834 if allow_db_ver((3, x)):
835 yield x
836 else:
837 raise ValueError("unknown major BerkeleyDB version", major)
838
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000839 # construct a list of paths to look for the header file in on
840 # top of the normal inc_dirs.
841 db_inc_paths = [
842 '/usr/include/db4',
843 '/usr/local/include/db4',
844 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000845 '/usr/include/db3',
846 '/usr/local/include/db3',
847 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000848 # Fink defaults (http://fink.sourceforge.net/)
849 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000850 '/sw/include/db3',
851 ]
852 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000853 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000854 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000855 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000856 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
857 db_inc_paths.append('/usr/local/include/db4%d' % x)
858 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000859 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000860 # MacPorts default (http://www.macports.org/)
861 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000862 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000863 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000864 db_inc_paths.append('/usr/include/db3%d' % x)
865 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
866 db_inc_paths.append('/usr/local/include/db3%d' % x)
867 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000868 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000869
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000870 # Add some common subdirectories for Sleepycat DB to the list,
871 # based on the standard include directories. This way DB3/4 gets
872 # picked up when it is installed in a non-standard prefix and
873 # the user has added that prefix into inc_dirs.
874 std_variants = []
875 for dn in inc_dirs:
876 std_variants.append(os.path.join(dn, 'db3'))
877 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000878 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000879 std_variants.append(os.path.join(dn, "db4%d"%x))
880 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000881 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000882 std_variants.append(os.path.join(dn, "db3%d"%x))
883 std_variants.append(os.path.join(dn, "db3.%d"%x))
884
Tim Peters38ff36c2006-06-30 06:18:39 +0000885 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000886 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000887
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000888 db_ver_inc_map = {}
889
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000890 if sys.platform == 'darwin':
891 sysroot = macosx_sdk_root()
892
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000893 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000894 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000895 # See whether there is a Sleepycat header in the standard
896 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000897 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000898 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000899
900 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
901 f = os.path.join(sysroot, d[1:], "db.h")
902
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000903 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000904 if os.path.exists(f):
905 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000906 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000907 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000908 db_major = int(m.group(1))
909 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
910 db_minor = int(m.group(1))
911 db_ver = (db_major, db_minor)
912
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000913 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
914 if db_ver == (4, 6):
915 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
916 db_patch = int(m.group(1))
917 if db_patch < 21:
918 print "db.h:", db_ver, "patch", db_patch,
919 print "being ignored (4.6.x must be >= 4.6.21)"
920 continue
921
Antoine Pitrou8c510e72010-01-13 11:47:49 +0000922 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000923 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000924 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +0000925 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000926 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000927 if db_setup_debug:
928 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000929 else:
930 # we already found a header for this library version
931 if db_setup_debug: print "db.h: ignoring", d
932 else:
933 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +0000934 if db_setup_debug:
935 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000936
937 db_found_vers = db_ver_inc_map.keys()
938 db_found_vers.sort()
939
940 while db_found_vers:
941 db_ver = db_found_vers.pop()
942 db_incdir = db_ver_inc_map[db_ver]
943
944 # check lib directories parallel to the location of the header
945 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +0000946 db_incdir.replace("include", 'lib64'),
947 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000948 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000949
950 if sys.platform != 'darwin':
951 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
952
953 else:
954 # Same as other branch, but takes OSX SDK into account
955 tmp = []
956 for dn in db_dirs_to_check:
957 if is_macosx_sdk_path(dn):
958 if os.path.isdir(os.path.join(sysroot, dn[1:])):
959 tmp.append(dn)
960 else:
961 if os.path.isdir(dn):
962 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +0000963 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000964
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200965 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000966 # XXX should we -ever- look for a dbX name? Do any
967 # systems really not name their library by version and
968 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +0000969 for dblib in (('db-%d.%d' % db_ver),
970 ('db%d%d' % db_ver),
971 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000972 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000973 db_dirs_to_check + lib_dirs, dblib )
974 if dblib_file:
975 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
976 raise db_found
977 else:
978 if db_setup_debug: print "db lib: ", dblib, "not found"
979
980 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +0000981 if db_setup_debug:
982 print "bsddb using BerkeleyDB lib:", db_ver, dblib
983 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000984 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +0000985 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000986 # We add the runtime_library_dirs argument because the
987 # BerkeleyDB lib we're linking against often isn't in the
988 # system dynamic library search path. This is usually
989 # correct and most trouble free, but may cause problems in
990 # some unusual system configurations (e.g. the directory
991 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000992 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +0000993 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000994 library_dirs=dblib_dir,
995 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000996 include_dirs=db_incs,
997 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +0000998 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000999 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001000 db_incs = None
1001 dblibs = []
1002 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001003 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001004
Anthony Baxterc51ee692006-04-01 00:57:31 +00001005 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001006 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001007
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001008 # We hunt for #define SQLITE_VERSION "n.n.n"
1009 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001010 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001011 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001012 '/usr/include/sqlite',
1013 '/usr/include/sqlite3',
1014 '/usr/local/include',
1015 '/usr/local/include/sqlite',
1016 '/usr/local/include/sqlite3',
1017 ]
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001018 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1019 MIN_SQLITE_VERSION = ".".join([str(x)
1020 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001021
1022 # Scan the default include directories before the SQLite specific
1023 # ones. This allows one to override the copy of sqlite on OSX,
1024 # where /usr/include contains an old version of sqlite.
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001025 if sys.platform == 'darwin':
1026 sysroot = macosx_sdk_root()
1027
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001028 for d in inc_dirs + sqlite_inc_paths:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001029 f = os.path.join(d, "sqlite3.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001030
1031 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
1032 f = os.path.join(sysroot, d[1:], "sqlite3.h")
1033
Anthony Baxterc51ee692006-04-01 00:57:31 +00001034 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001035 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001036 incf = open(f).read()
1037 m = re.search(
1038 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001039 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001040 sqlite_version = m.group(1)
1041 sqlite_version_tuple = tuple([int(x)
1042 for x in sqlite_version.split(".")])
1043 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001044 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001045 if sqlite_setup_debug:
1046 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001047 sqlite_incdir = d
1048 break
1049 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001050 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001051 print "%s: version %d is too old, need >= %s"%(d,
1052 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001053 elif sqlite_setup_debug:
1054 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1055
Anthony Baxterc51ee692006-04-01 00:57:31 +00001056 if sqlite_incdir:
1057 sqlite_dirs_to_check = [
1058 os.path.join(sqlite_incdir, '..', 'lib64'),
1059 os.path.join(sqlite_incdir, '..', 'lib'),
1060 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1061 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1062 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001063 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001064 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001065 if sqlite_libfile:
1066 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001067
1068 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001069 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001070 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001071 '_sqlite/cursor.c',
1072 '_sqlite/microprotocols.c',
1073 '_sqlite/module.c',
1074 '_sqlite/prepare_protocol.c',
1075 '_sqlite/row.c',
1076 '_sqlite/statement.c',
1077 '_sqlite/util.c', ]
1078
Anthony Baxterc51ee692006-04-01 00:57:31 +00001079 sqlite_defines = []
1080 if sys.platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001081 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001082 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001083 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1084
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001085 # Comment this out if you want the sqlite3 module to be able to load extensions.
1086 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001087
1088 if sys.platform == 'darwin':
1089 # In every directory on the search path search for a dynamic
1090 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001091 # for dynamic libraries on the entire path.
1092 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001093 # before the dynamic library in /usr/lib.
1094 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1095 else:
1096 sqlite_extra_link_args = ()
1097
Anthony Baxterc51ee692006-04-01 00:57:31 +00001098 exts.append(Extension('_sqlite3', sqlite_srcs,
1099 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001100 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001101 sqlite_incdir],
1102 library_dirs=sqlite_libdir,
1103 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001104 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001105 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001106 else:
1107 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001108
1109 # Look for Berkeley db 1.85. Note that it is built as a different
1110 # module name so it can be included even when later versions are
1111 # available. A very restrictive search is performed to avoid
1112 # accidentally building this module with a later version of the
1113 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1114 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001115 #
1116 # If the better bsddb library can be built (db_incs is defined)
1117 # we do not build this one. Otherwise this build will pick up
1118 # the more recent berkeleydb's db.h file first in the include path
1119 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001120 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001121
1122 if sys.platform == 'darwin':
1123 if is_macosx_sdk_path(f):
1124 sysroot = macosx_sdk_root()
1125 f = os.path.join(sysroot, f[1:])
1126
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001127 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001128 data = open(f).read()
1129 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1130 if m is not None:
1131 # bingo - old version used hash file format version 2
1132 ### XXX this should be fixed to not be platform-dependent
1133 ### but I don't have direct access to an osf1 platform and
1134 ### seemed to be muffing the search somehow
1135 libraries = platform == "osf1" and ['db'] or None
1136 if libraries is not None:
1137 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1138 libraries=libraries))
1139 else:
1140 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001141 else:
1142 missing.append('bsddb185')
1143 else:
1144 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001145
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001146 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001147 # The standard Unix dbm module:
Jack Jansend1b20452002-07-08 21:39:36 +00001148 if platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001149 config_args = [arg.strip("'")
1150 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001151 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001152 if arg.startswith('--with-dbmliborder=')]
1153 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001154 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001155 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001156 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001157 dbmext = None
1158 for cand in dbm_order:
1159 if cand == "ndbm":
1160 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001161 # Some systems have -lndbm, others have -lgdbm_compat,
1162 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001163 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001164 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001165 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001166 elif self.compiler.find_library_file(lib_dirs,
1167 'gdbm_compat'):
1168 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001169 else:
1170 ndbm_libs = []
1171 print "building dbm using ndbm"
1172 dbmext = Extension('dbm', ['dbmmodule.c'],
1173 define_macros=[
1174 ('HAVE_NDBM_H',None),
1175 ],
1176 libraries=ndbm_libs)
1177 break
1178
1179 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001180 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001181 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001182 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001183 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001184 gdbm_libs.append('gdbm_compat')
1185 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1186 print "building dbm using gdbm"
1187 dbmext = Extension(
1188 'dbm', ['dbmmodule.c'],
1189 define_macros=[
1190 ('HAVE_GDBM_NDBM_H', None),
1191 ],
1192 libraries = gdbm_libs)
1193 break
1194 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1195 print "building dbm using gdbm"
1196 dbmext = Extension(
1197 'dbm', ['dbmmodule.c'],
1198 define_macros=[
1199 ('HAVE_GDBM_DASH_NDBM_H', None),
1200 ],
1201 libraries = gdbm_libs)
1202 break
1203 elif cand == "bdb":
1204 if db_incs is not None:
1205 print "building dbm using bdb"
1206 dbmext = Extension('dbm', ['dbmmodule.c'],
1207 library_dirs=dblib_dir,
1208 runtime_library_dirs=dblib_dir,
1209 include_dirs=db_incs,
1210 define_macros=[
1211 ('HAVE_BERKDB_H', None),
1212 ('DB_DBM_HSEARCH', None),
1213 ],
1214 libraries=dblibs)
1215 break
1216 if dbmext is not None:
1217 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001218 else:
1219 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001220
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001221 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001222 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001223 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001224 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1225 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001226 else:
1227 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001228
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001229 # Unix-only modules
Ronald Oussoren9545a232010-05-05 19:09:31 +00001230 if platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001231 # Steen Lumholt's termios module
1232 exts.append( Extension('termios', ['termios.c']) )
1233 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43 +00001234 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001235 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001236 else:
1237 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001238
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001239 # Sun yellow pages. Some systems have the functions in libc.
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001240 if (platform not in ['cygwin', 'atheos', 'qnx6'] and
1241 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001242 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001243 libs = ['nsl']
1244 else:
1245 libs = []
1246 exts.append( Extension('nis', ['nismodule.c'],
1247 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001248 else:
1249 missing.append('nis')
1250 else:
1251 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001252
Skip Montanaro72092942004-02-07 12:50:19 +00001253 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001254 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001255 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001256 if curses_library.startswith('ncurses'):
1257 if curses_library == 'ncursesw':
1258 # Bug 1464056: If _curses.so links with ncursesw,
1259 # _curses_panel.so must link with panelw.
1260 panel_library = 'panelw'
1261 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001262 exts.append( Extension('_curses', ['_cursesmodule.c'],
1263 libraries = curses_libs) )
Stefan Krah449aa862010-06-03 12:39:50 +00001264 elif curses_library == 'curses' and platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001265 # OSX has an old Berkeley curses, not good enough for
1266 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001267 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001268 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001269 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001270 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001271 else:
1272 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001273
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001274 exts.append( Extension('_curses', ['_cursesmodule.c'],
1275 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001276 else:
1277 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001278
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001279 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001280 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001281 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001282 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001283 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001284 else:
1285 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001286
Barry Warsaw259b1e12002-08-13 20:09:26 +00001287 # Andrew Kuchling's zlib module. Note that some versions of zlib
1288 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1289 # http://www.cert.org/advisories/CA-2002-07.html
1290 #
1291 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1292 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1293 # now, we still accept 1.1.3, because we think it's difficult to
1294 # exploit this in Python, and we'd rather make it RedHat's problem
1295 # than our problem <wink>.
1296 #
1297 # You can upgrade zlib to version 1.1.4 yourself by going to
1298 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001299 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001300 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001301 if zlib_inc is not None:
1302 zlib_h = zlib_inc[0] + '/zlib.h'
1303 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001304 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001305 fp = open(zlib_h)
1306 while 1:
1307 line = fp.readline()
1308 if not line:
1309 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001310 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001311 version = line.split()[2]
1312 break
1313 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001314 if (self.compiler.find_library_file(lib_dirs, 'z')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001315 if sys.platform == "darwin":
1316 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1317 else:
1318 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001319 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001320 libraries = ['z'],
1321 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001322 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001323 else:
1324 missing.append('zlib')
1325 else:
1326 missing.append('zlib')
1327 else:
1328 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001329
Gregory P. Smith440ca772008-03-24 00:08:01 +00001330 # Helper module for various ascii-encoders. Uses zlib for an optimized
1331 # crc32 if we have it. Otherwise binascii uses its own.
1332 if have_zlib:
1333 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1334 libraries = ['z']
1335 extra_link_args = zlib_extra_link_args
1336 else:
1337 extra_compile_args = []
1338 libraries = []
1339 extra_link_args = []
1340 exts.append( Extension('binascii', ['binascii.c'],
1341 extra_compile_args = extra_compile_args,
1342 libraries = libraries,
1343 extra_link_args = extra_link_args) )
1344
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001345 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001346 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001347 if sys.platform == "darwin":
1348 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1349 else:
1350 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001351 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001352 libraries = ['bz2'],
1353 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001354 else:
1355 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001356
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001357 # Interface to the Expat XML parser
1358 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001359 # Expat was written by James Clark and is now maintained by a group of
1360 # developers on SourceForge; see www.libexpat.org for more information.
1361 # The pyexpat module was written by Paul Prescod after a prototype by
1362 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1363 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001364 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001365 #
1366 # More information on Expat can be found at www.libexpat.org.
1367 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001368 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1369 expat_inc = []
1370 define_macros = []
1371 expat_lib = ['expat']
1372 expat_sources = []
1373 else:
1374 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1375 define_macros = [
1376 ('HAVE_EXPAT_CONFIG_H', '1'),
1377 ]
1378 expat_lib = []
1379 expat_sources = ['expat/xmlparse.c',
1380 'expat/xmlrole.c',
1381 'expat/xmltok.c']
Ronald Oussoren988117f2006-04-29 11:31:35 +00001382
Fred Drake2d59a492003-10-21 15:41:15 +00001383 exts.append(Extension('pyexpat',
1384 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001385 include_dirs = expat_inc,
1386 libraries = expat_lib,
1387 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001388 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001389
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001390 # Fredrik Lundh's cElementTree module. Note that this also
1391 # uses expat (via the CAPI hook in pyexpat).
1392
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001393 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001394 define_macros.append(('USE_PYEXPAT_CAPI', None))
1395 exts.append(Extension('_elementtree',
1396 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001397 include_dirs = expat_inc,
1398 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001399 sources = ['_elementtree.c'],
1400 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001401 else:
1402 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001403
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001404 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001405 if have_unicode:
1406 exts.append(Extension('_multibytecodec',
1407 ['cjkcodecs/multibytecodec.c']))
1408 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001409 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001410 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001411 else:
1412 missing.append('_multibytecodec')
1413 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1414 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001415
Michael W. Hudson5b109102002-01-23 15:04:41 +00001416 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001417 if sys.maxint == 0x7fffffff:
1418 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1419 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Anthony Baxter82201742006-04-09 15:07:40 +00001420 if (dl_inc is not None) and (platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001421 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001422 else:
1423 missing.append('dl')
1424 else:
1425 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001426
Thomas Hellercf567c12006-03-08 19:51:58 +00001427 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001428 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001429
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001430 # Richard Oudkerk's multiprocessing module
1431 if platform == 'win32': # Windows
1432 macros = dict()
1433 libraries = ['ws2_32']
1434
1435 elif platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001436 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001437 libraries = []
1438
1439 elif platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001440 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001441 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001442
Martin v. Löwisbb86d832008-11-04 20:40:09 +00001443 elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001444 # FreeBSD's P1003.1b semaphore support is very experimental
1445 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001446 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001447 libraries = []
1448
Jesse Noller37040cd2008-09-30 00:15:45 +00001449 elif platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001450 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001451 libraries = []
1452
Jesse Noller40a61642009-03-31 18:12:35 +00001453 elif platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001454 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001455 libraries = []
1456
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001457 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001458 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001459 libraries = ['rt']
1460
1461 if platform == 'win32':
1462 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1463 '_multiprocessing/semaphore.c',
1464 '_multiprocessing/pipe_connection.c',
1465 '_multiprocessing/socket_connection.c',
1466 '_multiprocessing/win32_functions.c'
1467 ]
1468
1469 else:
1470 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1471 '_multiprocessing/socket_connection.c'
1472 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001473 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001474 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001475 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1476
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001477 if sysconfig.get_config_var('WITH_THREAD'):
1478 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1479 define_macros=macros.items(),
1480 include_dirs=["Modules/_multiprocessing"]))
1481 else:
1482 missing.append('_multiprocessing')
1483
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001484 # End multiprocessing
1485
1486
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001487 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001488 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001489 # Linux-specific modules
1490 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001491 else:
1492 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001493
Matthias Klose8a96d202010-04-21 22:18:52 +00001494 if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1495 'freebsd7', 'freebsd8')
1496 or platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001497 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001498 else:
1499 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001500
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001501 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001502 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001503 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001504 else:
1505 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001506
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001507 if platform == 'darwin':
1508 # _scproxy
1509 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1510 extra_link_args= [
1511 '-framework', 'SystemConfiguration',
1512 '-framework', 'CoreFoundation'
1513 ]))
1514
1515
Tim Peters66cb0182004-08-26 05:23:19 +00001516 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001517 sysconfig.get_config_var("CONFIG_ARGS")):
1518
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001519 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001520 # We're on Mac OS X 10.4 or later, the compiler should
1521 # support '-Wno-deprecated-declarations'. This will
1522 # surpress deprecation warnings for the Carbon extensions,
1523 # these extensions wrap the Carbon APIs and even those
1524 # parts that are deprecated.
1525 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1526 else:
1527 carbon_extra_compile_args = []
1528
Just van Rossum05ced6a2002-11-24 23:15:57 +00001529 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001530 def macSrcExists(name1, name2=''):
1531 if not name1:
1532 return None
1533 names = (name1,)
1534 if name2:
1535 names = (name1, name2)
1536 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1537 return os.path.exists(path)
1538
1539 def addMacExtension(name, kwds, extra_srcs=[]):
1540 dirname = ''
1541 if name[0] == '_':
1542 dirname = name[1:].lower()
1543 cname = name + '.c'
1544 cmodulename = name + 'module.c'
1545 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1546 if macSrcExists(cname):
1547 srcs = [cname]
1548 elif macSrcExists(cmodulename):
1549 srcs = [cmodulename]
1550 elif macSrcExists(dirname, cname):
1551 # XXX(nnorwitz): If all the names ended with module, we
1552 # wouldn't need this condition. ibcarbon is the only one.
1553 srcs = [os.path.join(dirname, cname)]
1554 elif macSrcExists(dirname, cmodulename):
1555 srcs = [os.path.join(dirname, cmodulename)]
1556 else:
1557 raise RuntimeError("%s not found" % name)
1558
1559 # Here's the whole point: add the extension with sources
1560 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1561
1562 # Core Foundation
1563 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1564 'extra_link_args': ['-framework', 'CoreFoundation'],
1565 }
1566 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1567 addMacExtension('autoGIL', core_kwds)
1568
Ronald Oussoren51f06332009-09-20 10:31:22 +00001569
1570
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001571 # Carbon
1572 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1573 'extra_link_args': ['-framework', 'Carbon'],
1574 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001575 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1576 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001577 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001578 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001579 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001580 '_Help', '_Icn', '_IBCarbon', '_List',
1581 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001582 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001583 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001584 for name in CARBON_EXTS:
1585 addMacExtension(name, carbon_kwds)
1586
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001587 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1588 # The _Win extension should build just like the other Carbon extensions, but
1589 # this actually results in a hard crash of the linker.
1590 #
1591 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1592 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1593 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1594 }
1595 addMacExtension('_Win', win_kwds)
1596 else:
1597 addMacExtension('_Win', carbon_kwds)
1598
1599
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001600 # Application Services & QuickTime
1601 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1602 'extra_link_args': ['-framework','ApplicationServices'],
1603 }
1604 addMacExtension('_Launch', app_kwds)
1605 addMacExtension('_CG', app_kwds)
1606
Just van Rossum05ced6a2002-11-24 23:15:57 +00001607 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001608 extra_compile_args=carbon_extra_compile_args,
1609 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001610 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001611
Michael W. Hudson5b109102002-01-23 15:04:41 +00001612
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001613 self.extensions.extend(exts)
1614
1615 # Call the method for detecting whether _tkinter can be compiled
1616 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001617
Skip Montanarod1287322007-03-06 15:41:38 +00001618 if '_tkinter' not in [e.name for e in self.extensions]:
1619 missing.append('_tkinter')
1620
1621 return missing
1622
Jack Jansen0b06be72002-06-21 14:48:38 +00001623 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1624 # The _tkinter module, using frameworks. Since frameworks are quite
1625 # different the UNIX search logic is not sharable.
1626 from os.path import join, exists
1627 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001628 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001629 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001630 join(os.getenv('HOME'), '/Library/Frameworks')
1631 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001632
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001633 sysroot = macosx_sdk_root()
1634
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001635 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001636 # bundles.
1637 # XXX distutils should support -F!
1638 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001639 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001640
1641
Jack Jansen0b06be72002-06-21 14:48:38 +00001642 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001643 if is_macosx_sdk_path(F):
1644 if not exists(join(sysroot, F[1:], fw + '.framework')):
1645 break
1646 else:
1647 if not exists(join(F, fw + '.framework')):
1648 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001649 else:
1650 # ok, F is now directory with both frameworks. Continure
1651 # building
1652 break
1653 else:
1654 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1655 # will now resume.
1656 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001657
Jack Jansen0b06be72002-06-21 14:48:38 +00001658 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1659 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001660 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001661 #
1662 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001663 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001664 for fw in 'Tcl', 'Tk'
1665 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1666 ]
1667
Tim Peters2c60f7a2003-01-29 03:49:43 +00001668 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001669 # complicated search, this is a hard-coded path. It could bail out
1670 # if X11 libs are not found...
1671 include_dirs.append('/usr/X11R6/include')
1672 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1673
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001674 # All existing framework builds of Tcl/Tk don't support 64-bit
1675 # architectures.
1676 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1677 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001678
1679 if is_macosx_sdk_path(F):
1680 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1681 else:
1682 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1683
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001684 detected_archs = []
1685 for ln in fp:
1686 a = ln.split()[-1]
1687 if a in archs:
1688 detected_archs.append(ln.split()[-1])
1689 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001690
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001691 for a in detected_archs:
1692 frameworks.append('-arch')
1693 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001694
Jack Jansen0b06be72002-06-21 14:48:38 +00001695 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1696 define_macros=[('WITH_APPINIT', 1)],
1697 include_dirs = include_dirs,
1698 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001699 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001700 extra_link_args = frameworks,
1701 )
1702 self.extensions.append(ext)
1703 return 1
1704
Tim Peters2c60f7a2003-01-29 03:49:43 +00001705
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001706 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001707 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001708
Jack Jansen0b06be72002-06-21 14:48:38 +00001709 # Rather than complicate the code below, detecting and building
1710 # AquaTk is a separate method. Only one Tkinter will be built on
1711 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1712 platform = self.get_platform()
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001713 if (platform == 'darwin' and
1714 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001715 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001716
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001717 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001718 # The versions with dots are used on Unix, and the versions without
1719 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001720 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001721 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1722 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001723 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001724 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001725 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001726 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001727 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001728 # Exit the loop when we've found the Tcl/Tk libraries
1729 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001730
Fredrik Lundhade711a2001-01-24 08:00:28 +00001731 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001732 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001733 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001734 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001735 dotversion = version
1736 if '.' not in dotversion and "bsd" in sys.platform.lower():
1737 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1738 # but the include subdirs are named like .../include/tcl8.3.
1739 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1740 tcl_include_sub = []
1741 tk_include_sub = []
1742 for dir in inc_dirs:
1743 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1744 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1745 tk_include_sub += tcl_include_sub
1746 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1747 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001748
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001749 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001750 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001751 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001752 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001753
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001754 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001755
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001756 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1757 for dir in tcl_includes + tk_includes:
1758 if dir not in include_dirs:
1759 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001760
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001761 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001762 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001763 include_dirs.append('/usr/openwin/include')
1764 added_lib_dirs.append('/usr/openwin/lib')
1765 elif os.path.exists('/usr/X11R6/include'):
1766 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001767 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001768 added_lib_dirs.append('/usr/X11R6/lib')
1769 elif os.path.exists('/usr/X11R5/include'):
1770 include_dirs.append('/usr/X11R5/include')
1771 added_lib_dirs.append('/usr/X11R5/lib')
1772 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001773 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001774 include_dirs.append('/usr/X11/include')
1775 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001776
Jason Tishler9181c942003-02-05 15:16:17 +00001777 # If Cygwin, then verify that X is installed before proceeding
1778 if platform == 'cygwin':
1779 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1780 if x11_inc is None:
1781 return
1782
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001783 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001784 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001785 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001786 defs.append( ('WITH_BLT', 1) )
1787 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001788 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001789 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001790 defs.append( ('WITH_BLT', 1) )
1791 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001792
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001793 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001794 libs.append('tk'+ version)
1795 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001796
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001797 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001798 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001799
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001800 # Finally, link with the X11 libraries (not appropriate on cygwin)
1801 if platform != "cygwin":
1802 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001803
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001804 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1805 define_macros=[('WITH_APPINIT', 1)] + defs,
1806 include_dirs = include_dirs,
1807 libraries = libs,
1808 library_dirs = added_lib_dirs,
1809 )
1810 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001811
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001812## # Uncomment these lines if you want to play with xxmodule.c
1813## ext = Extension('xx', ['xxmodule.c'])
1814## self.extensions.append(ext)
1815
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001816 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001817 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001818 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001819 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001820 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001821 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001822 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001823
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001824 def configure_ctypes_darwin(self, ext):
1825 # Darwin (OS X) uses preconfigured files, in
1826 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001827 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001828 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1829 '_ctypes', 'libffi_osx'))
1830 sources = [os.path.join(ffi_srcdir, p)
1831 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001832 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001833 'x86/x86-darwin.S',
1834 'x86/x86-ffi_darwin.c',
1835 'x86/x86-ffi64.c',
1836 'powerpc/ppc-darwin.S',
1837 'powerpc/ppc-darwin_closure.S',
1838 'powerpc/ppc-ffi_darwin.c',
1839 'powerpc/ppc64-darwin_closure.S',
1840 ]]
1841
1842 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001843 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001844
1845 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1846 os.path.join(ffi_srcdir, 'powerpc')]
1847 ext.include_dirs.extend(include_dirs)
1848 ext.sources.extend(sources)
1849 return True
1850
Thomas Hellereba43c12006-04-07 19:04:09 +00001851 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001852 if not self.use_system_libffi:
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001853 if sys.platform == 'darwin':
1854 return self.configure_ctypes_darwin(ext)
1855
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001856 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001857 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1858 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1859 '_ctypes', 'libffi'))
1860 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001861
Thomas Heller5e218b42006-04-27 15:50:42 +00001862 from distutils.dep_util import newer_group
1863
1864 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001865 for fname in os.listdir(ffi_srcdir)
1866 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001867 if self.force or newer_group(config_sources,
1868 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001869 from distutils.dir_util import mkpath
1870 mkpath(ffi_builddir)
1871 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001872
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001873 # Pass empty CFLAGS because we'll just append the resulting
1874 # CFLAGS to Python's; -g or -O2 is to be avoided.
1875 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1876 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001877
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001878 res = os.system(cmd)
1879 if res or not os.path.exists(ffi_configfile):
1880 print "Failed to configure _ctypes module"
1881 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001882
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001883 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001884 with open(ffi_configfile) as f:
1885 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001886
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001887 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001888 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001889
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001890 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001891 ffi_builddir,
1892 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001893 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001894
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001895 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1896 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001897 ext.include_dirs.extend(include_dirs)
1898 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00001899 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00001900
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001901 def detect_ctypes(self, inc_dirs, lib_dirs):
1902 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00001903 include_dirs = []
1904 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00001905 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001906 sources = ['_ctypes/_ctypes.c',
1907 '_ctypes/callbacks.c',
1908 '_ctypes/callproc.c',
1909 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00001910 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001911 depends = ['_ctypes/ctypes.h']
1912
1913 if sys.platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00001914 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001915 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001916 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001917 include_dirs.append('_ctypes/darwin')
1918# XXX Is this still needed?
1919## extra_link_args.extend(['-read_only_relocs', 'warning'])
1920
Thomas Heller17984892006-08-04 18:57:34 +00001921 elif sys.platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00001922 # XXX This shouldn't be necessary; it appears that some
1923 # of the assembler code is non-PIC (i.e. it has relocations
1924 # when it shouldn't. The proper fix would be to rewrite
1925 # the assembler code to be PIC.
1926 # This only works with GCC; the Sun compiler likely refuses
1927 # this option. If you want to compile ctypes with the Sun
1928 # compiler, please research a proper solution, instead of
1929 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00001930 extra_link_args.append('-mimpure-text')
1931
Thomas Hellerde2d78a2008-06-02 18:41:30 +00001932 elif sys.platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00001933 extra_link_args.append('-fPIC')
1934
Thomas Hellercf567c12006-03-08 19:51:58 +00001935 ext = Extension('_ctypes',
1936 include_dirs=include_dirs,
1937 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00001938 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001939 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001940 sources=sources,
1941 depends=depends)
1942 ext_test = Extension('_ctypes_test',
1943 sources=['_ctypes/_ctypes_test.c'])
1944 self.extensions.extend([ext, ext_test])
1945
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001946 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1947 return
1948
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001949 if sys.platform == 'darwin':
1950 # OS X 10.5 comes with libffi.dylib; the include files are
1951 # in /usr/include/ffi
1952 inc_dirs.append('/usr/include/ffi')
1953
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001954 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00001955 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001956 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001957 if ffi_inc is not None:
1958 ffi_h = ffi_inc[0] + '/ffi.h'
1959 fp = open(ffi_h)
1960 while 1:
1961 line = fp.readline()
1962 if not line:
1963 ffi_inc = None
1964 break
1965 if line.startswith('#define LIBFFI_H'):
1966 break
1967 ffi_lib = None
1968 if ffi_inc is not None:
1969 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001970 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001971 ffi_lib = lib_name
1972 break
1973
1974 if ffi_inc and ffi_lib:
1975 ext.include_dirs.extend(ffi_inc)
1976 ext.libraries.append(ffi_lib)
1977 self.use_system_libffi = True
1978
1979
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001980class PyBuildInstall(install):
1981 # Suppress the warning about installation into the lib_dynload
1982 # directory, which is not in sys.path when running Python during
1983 # installation:
1984 def initialize_options (self):
1985 install.initialize_options(self)
1986 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001987
Michael W. Hudson529a5052002-12-17 16:47:17 +00001988class PyBuildInstallLib(install_lib):
1989 # Do exactly what install_lib does but make sure correct access modes get
1990 # set on installed directories and files. All installed files with get
1991 # mode 644 unless they are a shared library in which case they will get
1992 # mode 755. All installed directories will get mode 755.
1993
1994 so_ext = sysconfig.get_config_var("SO")
1995
1996 def install(self):
1997 outfiles = install_lib.install(self)
1998 self.set_file_modes(outfiles, 0644, 0755)
1999 self.set_dir_modes(self.install_dir, 0755)
2000 return outfiles
2001
2002 def set_file_modes(self, files, defaultMode, sharedLibMode):
2003 if not self.is_chmod_supported(): return
2004 if not files: return
2005
2006 for filename in files:
2007 if os.path.islink(filename): continue
2008 mode = defaultMode
2009 if filename.endswith(self.so_ext): mode = sharedLibMode
2010 log.info("changing mode of %s to %o", filename, mode)
2011 if not self.dry_run: os.chmod(filename, mode)
2012
2013 def set_dir_modes(self, dirname, mode):
2014 if not self.is_chmod_supported(): return
2015 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2016
2017 def set_dir_modes_visitor(self, mode, dirname, names):
2018 if os.path.islink(dirname): return
2019 log.info("changing mode of %s to %o", dirname, mode)
2020 if not self.dry_run: os.chmod(dirname, mode)
2021
2022 def is_chmod_supported(self):
2023 return hasattr(os, 'chmod')
2024
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002025SUMMARY = """
2026Python is an interpreted, interactive, object-oriented programming
2027language. It is often compared to Tcl, Perl, Scheme or Java.
2028
2029Python combines remarkable power with very clear syntax. It has
2030modules, classes, exceptions, very high level dynamic data types, and
2031dynamic typing. There are interfaces to many system calls and
2032libraries, as well as to various windowing systems (X11, Motif, Tk,
2033Mac, MFC). New built-in modules are easily written in C or C++. Python
2034is also usable as an extension language for applications that need a
2035programmable interface.
2036
2037The Python implementation is portable: it runs on many brands of UNIX,
2038on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2039listed here, it may still be supported, if there's a C compiler for
2040it. Ask around on comp.lang.python -- or just try compiling Python
2041yourself.
2042"""
2043
2044CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002045Development Status :: 6 - Mature
2046License :: OSI Approved :: Python Software Foundation License
2047Natural Language :: English
2048Programming Language :: C
2049Programming Language :: Python
2050Topic :: Software Development
2051"""
2052
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002053def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002054 # turn off warnings when deprecated modules are imported
2055 import warnings
2056 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002057 setup(# PyPI Metadata (PEP 301)
2058 name = "Python",
2059 version = sys.version.split()[0],
2060 url = "http://www.python.org/%s" % sys.version[:3],
2061 maintainer = "Guido van Rossum and the Python community",
2062 maintainer_email = "python-dev@python.org",
2063 description = "A high-level object-oriented programming language",
2064 long_description = SUMMARY.strip(),
2065 license = "PSF license",
2066 classifiers = filter(None, CLASSIFIERS.split("\n")),
2067 platforms = ["Many"],
2068
2069 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002070 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2071 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002072 # The struct module is defined here, because build_ext won't be
2073 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002074 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002075
2076 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002077 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002078 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002079 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002080 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002081
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002082# --install-platlib
2083if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002084 main()