blob: 064bbc0f08b0fb20bca86d91709cf8991dd636fd [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:
1161 # Some systems have -lndbm, others don't
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001162 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001163 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001164 ndbm_libs = ['ndbm']
1165 else:
1166 ndbm_libs = []
1167 print "building dbm using ndbm"
1168 dbmext = Extension('dbm', ['dbmmodule.c'],
1169 define_macros=[
1170 ('HAVE_NDBM_H',None),
1171 ],
1172 libraries=ndbm_libs)
1173 break
1174
1175 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001176 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001177 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001178 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001179 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001180 gdbm_libs.append('gdbm_compat')
1181 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1182 print "building dbm using gdbm"
1183 dbmext = Extension(
1184 'dbm', ['dbmmodule.c'],
1185 define_macros=[
1186 ('HAVE_GDBM_NDBM_H', None),
1187 ],
1188 libraries = gdbm_libs)
1189 break
1190 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1191 print "building dbm using gdbm"
1192 dbmext = Extension(
1193 'dbm', ['dbmmodule.c'],
1194 define_macros=[
1195 ('HAVE_GDBM_DASH_NDBM_H', None),
1196 ],
1197 libraries = gdbm_libs)
1198 break
1199 elif cand == "bdb":
1200 if db_incs is not None:
1201 print "building dbm using bdb"
1202 dbmext = Extension('dbm', ['dbmmodule.c'],
1203 library_dirs=dblib_dir,
1204 runtime_library_dirs=dblib_dir,
1205 include_dirs=db_incs,
1206 define_macros=[
1207 ('HAVE_BERKDB_H', None),
1208 ('DB_DBM_HSEARCH', None),
1209 ],
1210 libraries=dblibs)
1211 break
1212 if dbmext is not None:
1213 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001214 else:
1215 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001216
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001217 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001218 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001219 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001220 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1221 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001222 else:
1223 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001224
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001225 # Unix-only modules
Ronald Oussoren9545a232010-05-05 19:09:31 +00001226 if platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001227 # Steen Lumholt's termios module
1228 exts.append( Extension('termios', ['termios.c']) )
1229 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43 +00001230 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001231 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001232 else:
1233 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001234
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001235 # Sun yellow pages. Some systems have the functions in libc.
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001236 if (platform not in ['cygwin', 'atheos', 'qnx6'] and
1237 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001238 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001239 libs = ['nsl']
1240 else:
1241 libs = []
1242 exts.append( Extension('nis', ['nismodule.c'],
1243 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001244 else:
1245 missing.append('nis')
1246 else:
1247 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001248
Skip Montanaro72092942004-02-07 12:50:19 +00001249 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001250 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001251 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001252 if curses_library.startswith('ncurses'):
1253 if curses_library == 'ncursesw':
1254 # Bug 1464056: If _curses.so links with ncursesw,
1255 # _curses_panel.so must link with panelw.
1256 panel_library = 'panelw'
1257 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001258 exts.append( Extension('_curses', ['_cursesmodule.c'],
1259 libraries = curses_libs) )
Stefan Krah449aa862010-06-03 12:39:50 +00001260 elif curses_library == 'curses' and platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001261 # OSX has an old Berkeley curses, not good enough for
1262 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001263 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001264 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001265 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001266 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001267 else:
1268 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001269
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001270 exts.append( Extension('_curses', ['_cursesmodule.c'],
1271 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001272 else:
1273 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001274
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001275 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001276 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001277 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001278 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001279 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001280 else:
1281 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001282
Barry Warsaw259b1e12002-08-13 20:09:26 +00001283 # Andrew Kuchling's zlib module. Note that some versions of zlib
1284 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1285 # http://www.cert.org/advisories/CA-2002-07.html
1286 #
1287 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1288 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1289 # now, we still accept 1.1.3, because we think it's difficult to
1290 # exploit this in Python, and we'd rather make it RedHat's problem
1291 # than our problem <wink>.
1292 #
1293 # You can upgrade zlib to version 1.1.4 yourself by going to
1294 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001295 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001296 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001297 if zlib_inc is not None:
1298 zlib_h = zlib_inc[0] + '/zlib.h'
1299 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001300 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001301 fp = open(zlib_h)
1302 while 1:
1303 line = fp.readline()
1304 if not line:
1305 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001306 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001307 version = line.split()[2]
1308 break
1309 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001310 if (self.compiler.find_library_file(lib_dirs, 'z')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001311 if sys.platform == "darwin":
1312 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1313 else:
1314 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001315 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001316 libraries = ['z'],
1317 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001318 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001319 else:
1320 missing.append('zlib')
1321 else:
1322 missing.append('zlib')
1323 else:
1324 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001325
Gregory P. Smith440ca772008-03-24 00:08:01 +00001326 # Helper module for various ascii-encoders. Uses zlib for an optimized
1327 # crc32 if we have it. Otherwise binascii uses its own.
1328 if have_zlib:
1329 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1330 libraries = ['z']
1331 extra_link_args = zlib_extra_link_args
1332 else:
1333 extra_compile_args = []
1334 libraries = []
1335 extra_link_args = []
1336 exts.append( Extension('binascii', ['binascii.c'],
1337 extra_compile_args = extra_compile_args,
1338 libraries = libraries,
1339 extra_link_args = extra_link_args) )
1340
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001341 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001342 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001343 if sys.platform == "darwin":
1344 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1345 else:
1346 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001347 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001348 libraries = ['bz2'],
1349 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001350 else:
1351 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001352
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001353 # Interface to the Expat XML parser
1354 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001355 # Expat was written by James Clark and is now maintained by a group of
1356 # developers on SourceForge; see www.libexpat.org for more information.
1357 # The pyexpat module was written by Paul Prescod after a prototype by
1358 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1359 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001360 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001361 #
1362 # More information on Expat can be found at www.libexpat.org.
1363 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001364 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1365 expat_inc = []
1366 define_macros = []
1367 expat_lib = ['expat']
1368 expat_sources = []
1369 else:
1370 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1371 define_macros = [
1372 ('HAVE_EXPAT_CONFIG_H', '1'),
1373 ]
1374 expat_lib = []
1375 expat_sources = ['expat/xmlparse.c',
1376 'expat/xmlrole.c',
1377 'expat/xmltok.c']
Ronald Oussoren988117f2006-04-29 11:31:35 +00001378
Fred Drake2d59a492003-10-21 15:41:15 +00001379 exts.append(Extension('pyexpat',
1380 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001381 include_dirs = expat_inc,
1382 libraries = expat_lib,
1383 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001384 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001385
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001386 # Fredrik Lundh's cElementTree module. Note that this also
1387 # uses expat (via the CAPI hook in pyexpat).
1388
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001389 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001390 define_macros.append(('USE_PYEXPAT_CAPI', None))
1391 exts.append(Extension('_elementtree',
1392 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001393 include_dirs = expat_inc,
1394 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001395 sources = ['_elementtree.c'],
1396 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001397 else:
1398 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001399
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001400 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001401 if have_unicode:
1402 exts.append(Extension('_multibytecodec',
1403 ['cjkcodecs/multibytecodec.c']))
1404 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001405 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001406 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001407 else:
1408 missing.append('_multibytecodec')
1409 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1410 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001411
Michael W. Hudson5b109102002-01-23 15:04:41 +00001412 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001413 if sys.maxint == 0x7fffffff:
1414 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1415 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Anthony Baxter82201742006-04-09 15:07:40 +00001416 if (dl_inc is not None) and (platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001417 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001418 else:
1419 missing.append('dl')
1420 else:
1421 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001422
Thomas Hellercf567c12006-03-08 19:51:58 +00001423 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001424 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001425
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001426 # Richard Oudkerk's multiprocessing module
1427 if platform == 'win32': # Windows
1428 macros = dict()
1429 libraries = ['ws2_32']
1430
1431 elif platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001432 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001433 libraries = []
1434
1435 elif platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001436 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001437 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001438
Martin v. Löwisbb86d832008-11-04 20:40:09 +00001439 elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001440 # FreeBSD's P1003.1b semaphore support is very experimental
1441 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001442 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001443 libraries = []
1444
Jesse Noller37040cd2008-09-30 00:15:45 +00001445 elif platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001446 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001447 libraries = []
1448
Jesse Noller40a61642009-03-31 18:12:35 +00001449 elif platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001450 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001451 libraries = []
1452
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001453 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001454 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001455 libraries = ['rt']
1456
1457 if platform == 'win32':
1458 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1459 '_multiprocessing/semaphore.c',
1460 '_multiprocessing/pipe_connection.c',
1461 '_multiprocessing/socket_connection.c',
1462 '_multiprocessing/win32_functions.c'
1463 ]
1464
1465 else:
1466 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1467 '_multiprocessing/socket_connection.c'
1468 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001469 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001470 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001471 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1472
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001473 if sysconfig.get_config_var('WITH_THREAD'):
1474 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1475 define_macros=macros.items(),
1476 include_dirs=["Modules/_multiprocessing"]))
1477 else:
1478 missing.append('_multiprocessing')
1479
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001480 # End multiprocessing
1481
1482
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001483 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001484 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001485 # Linux-specific modules
1486 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001487 else:
1488 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001489
Matthias Klose8a96d202010-04-21 22:18:52 +00001490 if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1491 'freebsd7', 'freebsd8')
1492 or platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001493 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001494 else:
1495 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001496
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001497 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001498 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001499 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001500 else:
1501 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001502
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001503 if platform == 'darwin':
1504 # _scproxy
1505 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1506 extra_link_args= [
1507 '-framework', 'SystemConfiguration',
1508 '-framework', 'CoreFoundation'
1509 ]))
1510
1511
Tim Peters66cb0182004-08-26 05:23:19 +00001512 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001513 sysconfig.get_config_var("CONFIG_ARGS")):
1514
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001515 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001516 # We're on Mac OS X 10.4 or later, the compiler should
1517 # support '-Wno-deprecated-declarations'. This will
1518 # surpress deprecation warnings for the Carbon extensions,
1519 # these extensions wrap the Carbon APIs and even those
1520 # parts that are deprecated.
1521 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1522 else:
1523 carbon_extra_compile_args = []
1524
Just van Rossum05ced6a2002-11-24 23:15:57 +00001525 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001526 def macSrcExists(name1, name2=''):
1527 if not name1:
1528 return None
1529 names = (name1,)
1530 if name2:
1531 names = (name1, name2)
1532 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1533 return os.path.exists(path)
1534
1535 def addMacExtension(name, kwds, extra_srcs=[]):
1536 dirname = ''
1537 if name[0] == '_':
1538 dirname = name[1:].lower()
1539 cname = name + '.c'
1540 cmodulename = name + 'module.c'
1541 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1542 if macSrcExists(cname):
1543 srcs = [cname]
1544 elif macSrcExists(cmodulename):
1545 srcs = [cmodulename]
1546 elif macSrcExists(dirname, cname):
1547 # XXX(nnorwitz): If all the names ended with module, we
1548 # wouldn't need this condition. ibcarbon is the only one.
1549 srcs = [os.path.join(dirname, cname)]
1550 elif macSrcExists(dirname, cmodulename):
1551 srcs = [os.path.join(dirname, cmodulename)]
1552 else:
1553 raise RuntimeError("%s not found" % name)
1554
1555 # Here's the whole point: add the extension with sources
1556 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1557
1558 # Core Foundation
1559 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1560 'extra_link_args': ['-framework', 'CoreFoundation'],
1561 }
1562 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1563 addMacExtension('autoGIL', core_kwds)
1564
Ronald Oussoren51f06332009-09-20 10:31:22 +00001565
1566
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001567 # Carbon
1568 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1569 'extra_link_args': ['-framework', 'Carbon'],
1570 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001571 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1572 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001573 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001574 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001575 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001576 '_Help', '_Icn', '_IBCarbon', '_List',
1577 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001578 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001579 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001580 for name in CARBON_EXTS:
1581 addMacExtension(name, carbon_kwds)
1582
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001583 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1584 # The _Win extension should build just like the other Carbon extensions, but
1585 # this actually results in a hard crash of the linker.
1586 #
1587 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1588 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1589 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1590 }
1591 addMacExtension('_Win', win_kwds)
1592 else:
1593 addMacExtension('_Win', carbon_kwds)
1594
1595
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001596 # Application Services & QuickTime
1597 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1598 'extra_link_args': ['-framework','ApplicationServices'],
1599 }
1600 addMacExtension('_Launch', app_kwds)
1601 addMacExtension('_CG', app_kwds)
1602
Just van Rossum05ced6a2002-11-24 23:15:57 +00001603 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001604 extra_compile_args=carbon_extra_compile_args,
1605 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001606 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001607
Michael W. Hudson5b109102002-01-23 15:04:41 +00001608
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001609 self.extensions.extend(exts)
1610
1611 # Call the method for detecting whether _tkinter can be compiled
1612 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001613
Skip Montanarod1287322007-03-06 15:41:38 +00001614 if '_tkinter' not in [e.name for e in self.extensions]:
1615 missing.append('_tkinter')
1616
1617 return missing
1618
Jack Jansen0b06be72002-06-21 14:48:38 +00001619 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1620 # The _tkinter module, using frameworks. Since frameworks are quite
1621 # different the UNIX search logic is not sharable.
1622 from os.path import join, exists
1623 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001624 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001625 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001626 join(os.getenv('HOME'), '/Library/Frameworks')
1627 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001628
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001629 sysroot = macosx_sdk_root()
1630
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001631 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001632 # bundles.
1633 # XXX distutils should support -F!
1634 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001635 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001636
1637
Jack Jansen0b06be72002-06-21 14:48:38 +00001638 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001639 if is_macosx_sdk_path(F):
1640 if not exists(join(sysroot, F[1:], fw + '.framework')):
1641 break
1642 else:
1643 if not exists(join(F, fw + '.framework')):
1644 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001645 else:
1646 # ok, F is now directory with both frameworks. Continure
1647 # building
1648 break
1649 else:
1650 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1651 # will now resume.
1652 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001653
Jack Jansen0b06be72002-06-21 14:48:38 +00001654 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1655 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001656 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001657 #
1658 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001659 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001660 for fw in 'Tcl', 'Tk'
1661 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1662 ]
1663
Tim Peters2c60f7a2003-01-29 03:49:43 +00001664 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001665 # complicated search, this is a hard-coded path. It could bail out
1666 # if X11 libs are not found...
1667 include_dirs.append('/usr/X11R6/include')
1668 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1669
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001670 # All existing framework builds of Tcl/Tk don't support 64-bit
1671 # architectures.
1672 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1673 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001674
1675 if is_macosx_sdk_path(F):
1676 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1677 else:
1678 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1679
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001680 detected_archs = []
1681 for ln in fp:
1682 a = ln.split()[-1]
1683 if a in archs:
1684 detected_archs.append(ln.split()[-1])
1685 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001686
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001687 for a in detected_archs:
1688 frameworks.append('-arch')
1689 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001690
Jack Jansen0b06be72002-06-21 14:48:38 +00001691 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1692 define_macros=[('WITH_APPINIT', 1)],
1693 include_dirs = include_dirs,
1694 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001695 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001696 extra_link_args = frameworks,
1697 )
1698 self.extensions.append(ext)
1699 return 1
1700
Tim Peters2c60f7a2003-01-29 03:49:43 +00001701
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001702 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001703 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001704
Jack Jansen0b06be72002-06-21 14:48:38 +00001705 # Rather than complicate the code below, detecting and building
1706 # AquaTk is a separate method. Only one Tkinter will be built on
1707 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1708 platform = self.get_platform()
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001709 if (platform == 'darwin' and
1710 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001711 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001712
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001713 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001714 # The versions with dots are used on Unix, and the versions without
1715 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001716 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001717 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1718 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001719 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001720 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001721 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001722 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001723 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001724 # Exit the loop when we've found the Tcl/Tk libraries
1725 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001726
Fredrik Lundhade711a2001-01-24 08:00:28 +00001727 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001728 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001729 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001730 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001731 dotversion = version
1732 if '.' not in dotversion and "bsd" in sys.platform.lower():
1733 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1734 # but the include subdirs are named like .../include/tcl8.3.
1735 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1736 tcl_include_sub = []
1737 tk_include_sub = []
1738 for dir in inc_dirs:
1739 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1740 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1741 tk_include_sub += tcl_include_sub
1742 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1743 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001744
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001745 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001746 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001747 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001748 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001749
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001750 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001751
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001752 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1753 for dir in tcl_includes + tk_includes:
1754 if dir not in include_dirs:
1755 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001756
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001757 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001758 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001759 include_dirs.append('/usr/openwin/include')
1760 added_lib_dirs.append('/usr/openwin/lib')
1761 elif os.path.exists('/usr/X11R6/include'):
1762 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001763 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001764 added_lib_dirs.append('/usr/X11R6/lib')
1765 elif os.path.exists('/usr/X11R5/include'):
1766 include_dirs.append('/usr/X11R5/include')
1767 added_lib_dirs.append('/usr/X11R5/lib')
1768 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001769 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001770 include_dirs.append('/usr/X11/include')
1771 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001772
Jason Tishler9181c942003-02-05 15:16:17 +00001773 # If Cygwin, then verify that X is installed before proceeding
1774 if platform == 'cygwin':
1775 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1776 if x11_inc is None:
1777 return
1778
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001779 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001780 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001781 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001782 defs.append( ('WITH_BLT', 1) )
1783 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001784 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001785 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001786 defs.append( ('WITH_BLT', 1) )
1787 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001788
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001789 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001790 libs.append('tk'+ version)
1791 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001792
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001793 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001794 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001795
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001796 # Finally, link with the X11 libraries (not appropriate on cygwin)
1797 if platform != "cygwin":
1798 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001799
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001800 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1801 define_macros=[('WITH_APPINIT', 1)] + defs,
1802 include_dirs = include_dirs,
1803 libraries = libs,
1804 library_dirs = added_lib_dirs,
1805 )
1806 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001807
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001808## # Uncomment these lines if you want to play with xxmodule.c
1809## ext = Extension('xx', ['xxmodule.c'])
1810## self.extensions.append(ext)
1811
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001812 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001813 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001814 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001815 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001816 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001817 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001818 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001819
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001820 def configure_ctypes_darwin(self, ext):
1821 # Darwin (OS X) uses preconfigured files, in
1822 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001823 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001824 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1825 '_ctypes', 'libffi_osx'))
1826 sources = [os.path.join(ffi_srcdir, p)
1827 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001828 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001829 'x86/x86-darwin.S',
1830 'x86/x86-ffi_darwin.c',
1831 'x86/x86-ffi64.c',
1832 'powerpc/ppc-darwin.S',
1833 'powerpc/ppc-darwin_closure.S',
1834 'powerpc/ppc-ffi_darwin.c',
1835 'powerpc/ppc64-darwin_closure.S',
1836 ]]
1837
1838 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001839 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001840
1841 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1842 os.path.join(ffi_srcdir, 'powerpc')]
1843 ext.include_dirs.extend(include_dirs)
1844 ext.sources.extend(sources)
1845 return True
1846
Thomas Hellereba43c12006-04-07 19:04:09 +00001847 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001848 if not self.use_system_libffi:
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001849 if sys.platform == 'darwin':
1850 return self.configure_ctypes_darwin(ext)
1851
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001852 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001853 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1854 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1855 '_ctypes', 'libffi'))
1856 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001857
Thomas Heller5e218b42006-04-27 15:50:42 +00001858 from distutils.dep_util import newer_group
1859
1860 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001861 for fname in os.listdir(ffi_srcdir)
1862 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001863 if self.force or newer_group(config_sources,
1864 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001865 from distutils.dir_util import mkpath
1866 mkpath(ffi_builddir)
1867 config_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001868
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001869 # Pass empty CFLAGS because we'll just append the resulting
1870 # CFLAGS to Python's; -g or -O2 is to be avoided.
1871 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1872 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001873
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001874 res = os.system(cmd)
1875 if res or not os.path.exists(ffi_configfile):
1876 print "Failed to configure _ctypes module"
1877 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001878
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001879 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001880 with open(ffi_configfile) as f:
1881 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001882
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001883 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001884 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001885
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001886 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001887 ffi_builddir,
1888 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001889 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001890
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001891 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1892 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001893 ext.include_dirs.extend(include_dirs)
1894 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00001895 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00001896
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001897 def detect_ctypes(self, inc_dirs, lib_dirs):
1898 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00001899 include_dirs = []
1900 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00001901 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001902 sources = ['_ctypes/_ctypes.c',
1903 '_ctypes/callbacks.c',
1904 '_ctypes/callproc.c',
1905 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00001906 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001907 depends = ['_ctypes/ctypes.h']
1908
1909 if sys.platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00001910 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001911 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001912 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001913 include_dirs.append('_ctypes/darwin')
1914# XXX Is this still needed?
1915## extra_link_args.extend(['-read_only_relocs', 'warning'])
1916
Thomas Heller17984892006-08-04 18:57:34 +00001917 elif sys.platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00001918 # XXX This shouldn't be necessary; it appears that some
1919 # of the assembler code is non-PIC (i.e. it has relocations
1920 # when it shouldn't. The proper fix would be to rewrite
1921 # the assembler code to be PIC.
1922 # This only works with GCC; the Sun compiler likely refuses
1923 # this option. If you want to compile ctypes with the Sun
1924 # compiler, please research a proper solution, instead of
1925 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00001926 extra_link_args.append('-mimpure-text')
1927
Thomas Hellerde2d78a2008-06-02 18:41:30 +00001928 elif sys.platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00001929 extra_link_args.append('-fPIC')
1930
Thomas Hellercf567c12006-03-08 19:51:58 +00001931 ext = Extension('_ctypes',
1932 include_dirs=include_dirs,
1933 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00001934 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001935 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001936 sources=sources,
1937 depends=depends)
1938 ext_test = Extension('_ctypes_test',
1939 sources=['_ctypes/_ctypes_test.c'])
1940 self.extensions.extend([ext, ext_test])
1941
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001942 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1943 return
1944
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001945 if sys.platform == 'darwin':
1946 # OS X 10.5 comes with libffi.dylib; the include files are
1947 # in /usr/include/ffi
1948 inc_dirs.append('/usr/include/ffi')
1949
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001950 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00001951 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001952 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001953 if ffi_inc is not None:
1954 ffi_h = ffi_inc[0] + '/ffi.h'
1955 fp = open(ffi_h)
1956 while 1:
1957 line = fp.readline()
1958 if not line:
1959 ffi_inc = None
1960 break
1961 if line.startswith('#define LIBFFI_H'):
1962 break
1963 ffi_lib = None
1964 if ffi_inc is not None:
1965 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001966 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001967 ffi_lib = lib_name
1968 break
1969
1970 if ffi_inc and ffi_lib:
1971 ext.include_dirs.extend(ffi_inc)
1972 ext.libraries.append(ffi_lib)
1973 self.use_system_libffi = True
1974
1975
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001976class PyBuildInstall(install):
1977 # Suppress the warning about installation into the lib_dynload
1978 # directory, which is not in sys.path when running Python during
1979 # installation:
1980 def initialize_options (self):
1981 install.initialize_options(self)
1982 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001983
Michael W. Hudson529a5052002-12-17 16:47:17 +00001984class PyBuildInstallLib(install_lib):
1985 # Do exactly what install_lib does but make sure correct access modes get
1986 # set on installed directories and files. All installed files with get
1987 # mode 644 unless they are a shared library in which case they will get
1988 # mode 755. All installed directories will get mode 755.
1989
1990 so_ext = sysconfig.get_config_var("SO")
1991
1992 def install(self):
1993 outfiles = install_lib.install(self)
1994 self.set_file_modes(outfiles, 0644, 0755)
1995 self.set_dir_modes(self.install_dir, 0755)
1996 return outfiles
1997
1998 def set_file_modes(self, files, defaultMode, sharedLibMode):
1999 if not self.is_chmod_supported(): return
2000 if not files: return
2001
2002 for filename in files:
2003 if os.path.islink(filename): continue
2004 mode = defaultMode
2005 if filename.endswith(self.so_ext): mode = sharedLibMode
2006 log.info("changing mode of %s to %o", filename, mode)
2007 if not self.dry_run: os.chmod(filename, mode)
2008
2009 def set_dir_modes(self, dirname, mode):
2010 if not self.is_chmod_supported(): return
2011 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2012
2013 def set_dir_modes_visitor(self, mode, dirname, names):
2014 if os.path.islink(dirname): return
2015 log.info("changing mode of %s to %o", dirname, mode)
2016 if not self.dry_run: os.chmod(dirname, mode)
2017
2018 def is_chmod_supported(self):
2019 return hasattr(os, 'chmod')
2020
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002021SUMMARY = """
2022Python is an interpreted, interactive, object-oriented programming
2023language. It is often compared to Tcl, Perl, Scheme or Java.
2024
2025Python combines remarkable power with very clear syntax. It has
2026modules, classes, exceptions, very high level dynamic data types, and
2027dynamic typing. There are interfaces to many system calls and
2028libraries, as well as to various windowing systems (X11, Motif, Tk,
2029Mac, MFC). New built-in modules are easily written in C or C++. Python
2030is also usable as an extension language for applications that need a
2031programmable interface.
2032
2033The Python implementation is portable: it runs on many brands of UNIX,
2034on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2035listed here, it may still be supported, if there's a C compiler for
2036it. Ask around on comp.lang.python -- or just try compiling Python
2037yourself.
2038"""
2039
2040CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002041Development Status :: 6 - Mature
2042License :: OSI Approved :: Python Software Foundation License
2043Natural Language :: English
2044Programming Language :: C
2045Programming Language :: Python
2046Topic :: Software Development
2047"""
2048
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002049def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002050 # turn off warnings when deprecated modules are imported
2051 import warnings
2052 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002053 setup(# PyPI Metadata (PEP 301)
2054 name = "Python",
2055 version = sys.version.split()[0],
2056 url = "http://www.python.org/%s" % sys.version[:3],
2057 maintainer = "Guido van Rossum and the Python community",
2058 maintainer_email = "python-dev@python.org",
2059 description = "A high-level object-oriented programming language",
2060 long_description = SUMMARY.strip(),
2061 license = "PSF license",
2062 classifiers = filter(None, CLASSIFIERS.split("\n")),
2063 platforms = ["Many"],
2064
2065 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002066 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2067 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002068 # The struct module is defined here, because build_ext won't be
2069 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002070 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002071
2072 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002073 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002074 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002075 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002076 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002077
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002078# --install-platlib
2079if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002080 main()