setup.py revision e95cf1c8a2cba11b38f9c83da659895fbc952466
166012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling# Autodetecting setup.py script for building the Python extensions 266012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling# 3ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 466012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling__version__ = "$Revision$" 566012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling 684667c063a1e93a985134f7cef376edf82941c02Brett Cannonimport sys, os, imp, re, optparse 7529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 8529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonfrom distutils import log 900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils import sysconfig 108d7f0869ee672d7e9e8e1bf126bf717d8223ee2bAndrew M. Kuchlingfrom distutils import text_file 117c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburgfrom distutils.errors import * 1200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils.core import Extension, setup 1300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils.command.build_ext import build_ext 14f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchlingfrom distutils.command.install import install 15529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonfrom distutils.command.install_lib import install_lib 1600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 1700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling# This global variable is used to hold the list of modules to be disabled. 1800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdisabled_module_list = [] 1900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 2039230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudsondef add_dir_to_list(dirlist, dir): 2139230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson """Add the directory 'dir' to the list 'dirlist' (at the front) if 2239230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson 1) 'dir' is not already in 'dirlist' 2339230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson 2) 'dir' actually exists, and is a directory.""" 244439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen if dir is not None and os.path.isdir(dir) and dir not in dirlist: 2539230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson dirlist.insert(0, dir) 2639230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson 27fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchlingdef find_file(filename, std_dirs, paths): 28fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling """Searches for the directory where a given file is located, 29fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling and returns a possibly-empty list of additional directories, or None 30fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling if the file couldn't be found at all. 31ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 32fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 'filename' is the name of a file, such as readline.h or libcrypto.a. 33fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 'std_dirs' is the list of standard system directories; if the 34fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling file is found in one of them, no additional directives are needed. 35fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 'paths' is a list of additional locations to check; if the file is 36fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling found in one of them, the resulting list will contain the directory. 37fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling """ 38fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 39fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Check the standard locations 40fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling for dir in std_dirs: 41fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling f = os.path.join(dir, filename) 42fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling if os.path.exists(f): return [] 43fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 44fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Check the additional directories 45fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling for dir in paths: 46fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling f = os.path.join(dir, filename) 47fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling if os.path.exists(f): 48fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling return [dir] 49fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 50fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Not found anywhere 5100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling return None 5200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 53fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchlingdef find_library_file(compiler, libname, std_dirs, paths): 54a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling result = compiler.find_library_file(std_dirs + paths, libname) 55a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling if result is None: 56a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling return None 57ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 58a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling # Check whether the found file is in one of the standard directories 59a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling dirname = os.path.dirname(result) 60a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling for p in std_dirs: 61a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling # Ensure path doesn't end with path separator 629f5178abb7edd1b1bcaffcdfcf1afd8816dab102Skip Montanaro p = p.rstrip(os.sep) 63a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling if p == dirname: 64a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling return [ ] 65fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 66a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling # Otherwise, it must have been in one of the additional directories, 67a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling # so we have to figure out which one. 68a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling for p in paths: 69a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling # Ensure path doesn't end with path separator 709f5178abb7edd1b1bcaffcdfcf1afd8816dab102Skip Montanaro p = p.rstrip(os.sep) 71a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling if p == dirname: 72a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling return [p] 73a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling else: 74a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling assert False, "Internal error: Path not found in std_dirs or paths" 752c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters 7600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdef module_enabled(extlist, modname): 7700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling """Returns whether the module 'modname' is present in the list 7800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling of extensions 'extlist'.""" 7900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling extlist = [ext for ext in extlist if ext.name == modname] 8000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling return len(extlist) 81ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 82144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansendef find_module_file(module, dirlist): 83144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen """Find a module in a set of possible folders. If it is not found 84144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen return the unadorned filename""" 85144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen list = find_file(module, [], dirlist) 86144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen if not list: 87144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen return module 88144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen if len(list) > 1: 8912471d63893f84cb88deccf83af5aa5c6866c275Guido van Rossum log.info("WARNING: multiple copies of %s found"%module) 90144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen return os.path.join(list[0], module) 915b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 9200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingclass PyBuildExt(build_ext): 93ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 94d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro def __init__(self, dist): 95d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro build_ext.__init__(self, dist) 96d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro self.failed = [] 97d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 9800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling def build_extensions(self): 9900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 10000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Detect which modules should be compiled 101d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing = self.detect_modules() 10200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 10300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Remove modules that are present on the disabled list 10400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling self.extensions = [ext for ext in self.extensions 10500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling if ext.name not in disabled_module_list] 106ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 10700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Fix up the autodetected modules, prefixing all the source files 10800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # with Modules/ and adding Python's include directory to the path. 10900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling (srcdir,) = sysconfig.get_config_vars('srcdir') 110e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum if not srcdir: 111e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum # Maybe running on Windows but not using CYGWIN? 112e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum raise ValueError("No source directory; cannot proceed.") 11300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 114726b78ecb8660278399abaf36f98dec56ecf1271Neil Schemenauer # Figure out the location of the source code for extension modules 115726b78ecb8660278399abaf36f98dec56ecf1271Neil Schemenauer moddir = os.path.join(os.getcwd(), srcdir, 'Modules') 11600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling moddir = os.path.normpath(moddir) 11700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling srcdir, tail = os.path.split(moddir) 11800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling srcdir = os.path.normpath(srcdir) 11900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling moddir = os.path.normpath(moddir) 1205b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 121144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen moddirlist = [moddir] 122144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen incdirlist = ['./Include'] 1235b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 124144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen # Platform-dependent module source and include directories 125144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen platform = self.get_platform() 12666cb018c96e49b5e5cf1b8fc395171a223d86d8eTim Peters if platform in ('darwin', 'mac') and ("--disable-toolbox-glue" not in 127cc8a4f6563395e39d77da9888d0ea3675214ca64Brett Cannon sysconfig.get_config_var("CONFIG_ARGS")): 128144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen # Mac OS X also includes some mac-specific modules 129144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen macmoddir = os.path.join(os.getcwd(), srcdir, 'Mac/Modules') 130144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen moddirlist.append(macmoddir) 131144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen incdirlist.append('./Mac/Include') 13200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 133340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton alldirlist = moddirlist + incdirlist 134340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton 1353da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling # Fix up the paths for scripts, too 1363da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling self.distribution.scripts = [os.path.join(srcdir, filename) 1373da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling for filename in self.distribution.scripts] 1383da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling 139fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling for ext in self.extensions[:]: 140144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen ext.sources = [ find_module_file(filename, moddirlist) 14100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling for filename in ext.sources ] 142340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton if ext.depends is not None: 143340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton ext.depends = [find_module_file(filename, alldirlist) 144340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton for filename in ext.depends] 145144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen ext.include_dirs.append( '.' ) # to get config.h 146144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen for incdir in incdirlist: 147144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen ext.include_dirs.append( os.path.join(srcdir, incdir) ) 148fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 149e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling # If a module has already been built statically, 150fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # don't build it here 151e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling if ext.name in sys.builtin_module_names: 152fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling self.extensions.remove(ext) 1535bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling 1544439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen if platform != 'mac': 155e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl # Parse Modules/Setup and Modules/Setup.local to figure out which 156e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl # modules are turned on in the file. 1574439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen remove_modules = [] 158e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl for filename in ('Modules/Setup', 'Modules/Setup.local'): 159e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl input = text_file.TextFile(filename, join_lines=1) 160e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl while 1: 161e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl line = input.readline() 162e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl if not line: break 163e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl line = line.split() 164e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl remove_modules.append(line[0]) 165e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl input.close() 1661b27f86411f2593fe6137c54143c0d23f21271c7Tim Peters 1674439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen for ext in self.extensions[:]: 1684439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen if ext.name in remove_modules: 1694439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen self.extensions.remove(ext) 1705b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 1715bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # When you run "make CC=altcc" or something similar, you really want 1725bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # those environment variables passed into the setup.py phase. Here's 1735bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # a small set of useful ones. 1745bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling compiler = os.environ.get('CC') 1755bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling args = {} 1765bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # unfortunately, distutils doesn't let us provide separate C and C++ 1775bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # compilers 1785bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling if compiler is not None: 179d7c795e72966f7c72b94b919f3539be66495e6c3Martin v. Löwis (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS') 180d7c795e72966f7c72b94b919f3539be66495e6c3Martin v. Löwis args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags 1815bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling self.compiler.set_executables(**args) 1825bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling 18300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling build_ext.build_extensions(self) 18400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 185d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro longest = max([len(e.name) for e in self.extensions]) 186d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro if self.failed: 187d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro longest = max(longest, max([len(name) for name in self.failed])) 188d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 189d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro def print_three_column(lst): 190e95cf1c8a2cba11b38f9c83da659895fbc952466Georg Brandl lst.sort(key=str.lower) 191d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro # guarantee zip() doesn't drop anything 192d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro while len(lst) % 3: 193d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro lst.append("") 194d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]): 195d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print "%-*s %-*s %-*s" % (longest, e, longest, f, 196d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro longest, g) 197d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print 198d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 199d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro if missing: 200d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print 201d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print "Failed to find the necessary bits to build these modules:" 202d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print_three_column(missing) 203d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 204d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro if self.failed: 205d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro failed = self.failed[:] 206d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print 207d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print "Failed to build these modules:" 208d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro print_three_column(failed) 209d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 2107c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg def build_extension(self, ext): 2117c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg 212eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller if ext.name == '_ctypes': 213795246cf9937f088f8d98253f38da4a093c08300Thomas Heller if not self.configure_ctypes(ext): 214795246cf9937f088f8d98253f38da4a093c08300Thomas Heller return 215eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller 2167c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg try: 2177c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg build_ext.build_extension(self, ext) 2187c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg except (CCompilerError, DistutilsError), why: 2197c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg self.announce('WARNING: building of extension "%s" failed: %s' % 2207c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg (ext.name, sys.exc_info()[1])) 221d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro self.failed.append(ext.name) 22262686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling return 223f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen # Workaround for Mac OS X: The Carbon-based modules cannot be 224f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen # reliably imported into a command-line Python 225f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen if 'Carbon' in ext.extra_link_args: 2265b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson self.announce( 2275b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 'WARNING: skipping import check for Carbon-based "%s"' % 2285b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson ext.name) 2295b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson return 23024cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler # Workaround for Cygwin: Cygwin currently has fork issues when many 23124cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler # modules have been imported 23224cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler if self.get_platform() == 'cygwin': 23324cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler self.announce('WARNING: skipping import check for Cygwin-based "%s"' 23424cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler % ext.name) 23524cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler return 236af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson ext_filename = os.path.join( 237af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson self.build_lib, 238af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson self.get_ext_filename(self.get_ext_fullname(ext.name))) 23962686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling try: 240af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson imp.load_dynamic(ext.name, ext_filename) 2416e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz except ImportError, why: 242d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro self.failed.append(ext.name) 2436e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz self.announce('*** WARNING: renaming "%s" since importing it' 2446e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz ' failed: %s' % (ext.name, why), level=3) 2456e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz assert not self.inplace 2466e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz basename, tail = os.path.splitext(ext_filename) 2476e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz newname = basename + "_failed" + tail 2486e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz if os.path.exists(newname): 2496e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz os.remove(newname) 2506e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz os.rename(ext_filename, newname) 2516e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz 2526e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz # XXX -- This relies on a Vile HACK in 2536e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz # distutils.command.build_ext.build_extension(). The 2546e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz # _built_objects attribute is stored there strictly for 2556e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz # use here. 2566e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz # If there is a failure, _built_objects may not be there, 2576e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz # so catch the AttributeError and move on. 2586e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz try: 2596e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz for filename in self._built_objects: 2606e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz os.remove(filename) 2616e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz except AttributeError: 2626e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz self.announce('unable to remove files (ignored)') 2633f5fcc8acce9fa620fe29d15980850e433f1d5c9Neal Norwitz except: 2643f5fcc8acce9fa620fe29d15980850e433f1d5c9Neal Norwitz exc_type, why, tb = sys.exc_info() 2656e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz self.announce('*** WARNING: importing extension "%s" ' 2666e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz 'failed with %s: %s' % (ext.name, exc_type, why), 2676e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz level=3) 268d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro self.failed.append(ext.name) 2699028d0a52529a8bc76868ade697511f29614b207Fred Drake 27051dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz def get_platform(self): 271ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # Get value of sys.platform 27251dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']: 27351dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz if sys.platform.startswith(platform): 27451dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz return platform 27551dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz return sys.platform 27634febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling 27700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling def detect_modules(self): 278ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # Ensure that /usr/local is always used 27939230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') 28039230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') 28139230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson 282516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon # Add paths specified in the environment variables LDFLAGS and 2834810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # CPPFLAGS for header and library files. 2845399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon # We must get the values from the Makefile and not the environment 2855399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon # directly since an inconsistently reproducible issue comes up where 2865399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon # the environment variable is not set even though the value were passed 2874810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # into configure and stored in the Makefile (issue found on OS X 10.3). 288516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon for env_var, arg_name, dir_list in ( 289516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon ('LDFLAGS', '-L', self.compiler.library_dirs), 290516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon ('CPPFLAGS', '-I', self.compiler.include_dirs)): 2915399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon env_val = sysconfig.get_config_var(env_var) 292516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon if env_val: 2934810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # To prevent optparse from raising an exception about any 2944810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # options in env_val that is doesn't know about we strip out 2954810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # all double dashes and any dashes followed by a character 2964810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # that is not for the option we are dealing with. 2974810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # 2984810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # Please note that order of the regex is important! We must 2994810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # strip out double-dashes first so that we don't end up with 3004810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # substituting "--Long" to "-Long" and thus lead to "ong" being 3014810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # used for a library directory. 3024810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1], '', env_val) 30384667c063a1e93a985134f7cef376edf82941c02Brett Cannon parser = optparse.OptionParser() 3044810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # Make sure that allowing args interspersed with options is 3054810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon # allowed 3064810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon parser.allow_interspersed_args = True 3074810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon parser.error = lambda msg: None 30884667c063a1e93a985134f7cef376edf82941c02Brett Cannon parser.add_option(arg_name, dest="dirs", action="append") 30984667c063a1e93a985134f7cef376edf82941c02Brett Cannon options = parser.parse_args(env_val.split())[0] 31044837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon if options.dirs: 31144837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon for directory in options.dirs: 31244837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon add_dir_to_list(dir_list, directory) 313decc6a47df823a988845d3753a4cfb7a85b80828Skip Montanaro 31490b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson if os.path.normpath(sys.prefix) != '/usr': 31590b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson add_dir_to_list(self.compiler.library_dirs, 31690b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson sysconfig.get_config_var("LIBDIR")) 31790b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson add_dir_to_list(self.compiler.include_dirs, 31890b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson sysconfig.get_config_var("INCLUDEDIR")) 319fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 320339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis try: 321339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis have_unicode = unicode 322339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis except NameError: 323339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis have_unicode = 0 324339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis 325fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # lib_dirs and inc_dirs are used to search for files; 326fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # if a file is found in one of those directories, it can 327fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # be assumed that no additional -I,-L directives are needed. 328fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis lib_dirs = self.compiler.library_dirs + [ 329fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis '/lib64', '/usr/lib64', 330fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis '/lib', '/usr/lib', 331fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis ] 3325b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson inc_dirs = self.compiler.include_dirs + ['/usr/include'] 33300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts = [] 334d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing = [] 33500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 3364454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon config_h = sysconfig.get_config_h_filename() 3374454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon config_h_vars = sysconfig.parse_config_h(open(config_h)) 3384454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon 339ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh platform = self.get_platform() 3408301256a440fdd98fd500d225dac20ebb192e08fMartin v. Löwis (srcdir,) = sysconfig.get_config_vars('srcdir') 3415b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 342f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis # Check for AtheOS which has libraries in non-standard locations 343f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis if platform == 'atheos': 344f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis lib_dirs += ['/system/libs', '/atheos/autolnk/lib'] 345f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep) 346f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis inc_dirs += ['/system/include', '/atheos/autolnk/include'] 347f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) 348f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis 3497883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) 3507883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling if platform in ['osf1', 'unixware7', 'openunix8']: 35122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro lib_dirs += ['/usr/ccs/lib'] 35222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro 35339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren if platform == 'darwin': 35439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # This should work on any unixy platform ;-) 35539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # If the user has bothered specifying additional -I and -L flags 35639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # in OPT and LDFLAGS we might as well use them here. 35739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # NOTE: using shlex.split would technically be more correct, but 35839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # also gives a bootstrap problem. Let's hope nobody uses directories 35939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # with whitespace in the name to store libraries. 36039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren cflags, ldflags = sysconfig.get_config_vars( 36139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 'CFLAGS', 'LDFLAGS') 36239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren for item in cflags.split(): 36339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren if item.startswith('-I'): 36439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren inc_dirs.append(item[2:]) 36539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 36639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren for item in ldflags.split(): 36739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren if item.startswith('-L'): 36839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren lib_dirs.append(item[2:]) 36939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 370ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # Check for MacOS X, which doesn't need libm.a at all 371ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh math_libs = ['m'] 3724439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen if platform in ['darwin', 'beos', 'mac']: 373ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh math_libs = [] 3745b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 37500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # XXX Omitted modules: gl, pure, dl, SGI-specific modules 37600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 37700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # 37800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # The following modules are all pretty straightforward, and compile 37900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # on pretty much any POSIXish platform. 38000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # 381ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 38200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Some modules that are normally always on: 3832de7471d69b950a64e52a950675d59d9f4071da1Fred Drake exts.append( Extension('_weakref', ['_weakref.c']) ) 38400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 38500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # array objects 38600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('array', ['arraymodule.c']) ) 38700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # complex math library functions 3885ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling exts.append( Extension('cmath', ['cmathmodule.c'], 3895ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling libraries=math_libs) ) 390ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 39100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # math library functions, e.g. sin() 3925ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling exts.append( Extension('math', ['mathmodule.c'], 3935ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling libraries=math_libs) ) 39400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # fast string operations implemented in C 39500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('strop', ['stropmodule.c']) ) 39600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # time operations and variables 3975ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling exts.append( Extension('time', ['timemodule.c'], 3985ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling libraries=math_libs) ) 399057e7200d1c300f3c914dbc84eca327c10bf7751Brett Cannon exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'], 400a29d508ec4f29f73a9569e27402f159b8efa57caGuido van Rossum libraries=math_libs) ) 40140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger # random number generator implemented in C 4022c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters exts.append( Extension("_random", ["_randommodule.c"]) ) 40396ef8115dd6ed006f5fc44fa1b577db23485224cRaymond Hettinger # fast iterator tools implemented in C 40496ef8115dd6ed006f5fc44fa1b577db23485224cRaymond Hettinger exts.append( Extension("itertools", ["itertoolsmodule.c"]) ) 405756b3f3c15bd314ffa25299ca25465ae21e62a30Raymond Hettinger # high-performance collections 406eb9798892d7ed54762ae006e39db0a84f671cfd3Raymond Hettinger exts.append( Extension("_collections", ["_collectionsmodule.c"]) ) 4070c4102760c440af3e7b575b0fd27fe25549641a2Raymond Hettinger # bisect 4080c4102760c440af3e7b575b0fd27fe25549641a2Raymond Hettinger exts.append( Extension("_bisect", ["_bisectmodule.c"]) ) 409b3af1813eb5cf99766f55a0dfc0d566e9bd7c3c1Raymond Hettinger # heapq 410c46cb2a1a92c26e01ddb3921aa6828bcd3576f3eRaymond Hettinger exts.append( Extension("_heapq", ["_heapqmodule.c"]) ) 41100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # operator.add() and similar goodies 41200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('operator', ['operator.c']) ) 413c649ec5b69bd864914e02a2a9ec73c23bd307448Nick Coghlan # _functools 414c649ec5b69bd864914e02a2a9ec73c23bd307448Nick Coghlan exts.append( Extension("_functools", ["_functoolsmodule.c"]) ) 415261b8e26f199b8e548d9cf81fc4a94820a5a83dbMarc-André Lemburg # Python C API test module 416d66595fe423227f3bf8ea4867df5d27c6d2764e1Tim Peters exts.append( Extension('_testcapi', ['_testcapimodule.c']) ) 417a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo # profilers (_lsprof is for cProfile.py) 418a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo exts.append( Extension('_hotshot', ['_hotshot.c']) ) 419a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) ) 42000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # static Unicode character database 421339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis if have_unicode: 422339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis exts.append( Extension('unicodedata', ['unicodedata.c']) ) 423d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 424d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('unicodedata') 42500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # access to ISO C locale support 42619d173486b2263a269260343d65ac3929c89297eMartin v. Löwis data = open('pyconfig.h').read() 42719d173486b2263a269260343d65ac3929c89297eMartin v. Löwis m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data) 42819d173486b2263a269260343d65ac3929c89297eMartin v. Löwis if m is not None: 429d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler locale_libs = ['intl'] 430d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler else: 431d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler locale_libs = [] 43284b744775206eceefc9c94ba3e23f18332ac062bJack Jansen if platform == 'darwin': 43384b744775206eceefc9c94ba3e23f18332ac062bJack Jansen locale_extra_link_args = ['-framework', 'CoreFoundation'] 43484b744775206eceefc9c94ba3e23f18332ac062bJack Jansen else: 43584b744775206eceefc9c94ba3e23f18332ac062bJack Jansen locale_extra_link_args = [] 436e6ddc8b20b493fef2e7cffb2e1351fe1d238857eTim Peters 43784b744775206eceefc9c94ba3e23f18332ac062bJack Jansen 438d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler exts.append( Extension('_locale', ['_localemodule.c'], 43984b744775206eceefc9c94ba3e23f18332ac062bJack Jansen libraries=locale_libs, 44084b744775206eceefc9c94ba3e23f18332ac062bJack Jansen extra_link_args=locale_extra_link_args) ) 44100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 44200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Modules with some UNIX dependencies -- on by default: 44300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # (If you have a really backward UNIX, select and socket may not be 44400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # supported...) 44500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 44600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # fcntl(2) and ioctl(2) 44700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('fcntl', ['fcntlmodule.c']) ) 44873aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen if platform not in ['mac']: 44946d9623875893be9e2bcbb804b82cfd7f8ed05dfBrett Cannon # pwd(3) 4502c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters exts.append( Extension('pwd', ['pwdmodule.c']) ) 4512c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters # grp(3) 4522c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters exts.append( Extension('grp', ['grpmodule.c']) ) 453c300175547ced0af17857a29462b0f9294e8c31cMartin v. Löwis # spwd, shadow passwords 4544454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon if (config_h_vars.get('HAVE_GETSPNAM', False) or 4554454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon config_h_vars.get('HAVE_GETSPENT', False)): 45646d9623875893be9e2bcbb804b82cfd7f8ed05dfBrett Cannon exts.append( Extension('spwd', ['spwdmodule.c']) ) 457d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 458d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('spwd') 459d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 460d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.extend(['pwd', 'grp', 'spwd']) 461d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 46200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # select(2); not on ancient System V 46300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('select', ['selectmodule.c']) ) 46400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 46500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Helper module for various ascii-encoders 46600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('binascii', ['binascii.c']) ) 46700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 46800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Fred Drake's interface to the Python parser 46900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('parser', ['parsermodule.c']) ) 47000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 4712e1c09c1fd06531a3ce1de5b12ec5c8f771e78e0Guido van Rossum # cStringIO and cPickle 47200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('cStringIO', ['cStringIO.c']) ) 47300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('cPickle', ['cPickle.c']) ) 47400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 47500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Memory-mapped files (also works on Win32). 47673aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen if platform not in ['atheos', 'mac']: 477f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis exts.append( Extension('mmap', ['mmapmodule.c']) ) 478d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 479d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('mmap') 48000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 48157269d0c7c7a6fc989fcbef5b82853aa36fb44caAndrew M. Kuchling # Lance Ellinghaus's syslog module 48273aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen if platform not in ['mac']: 4832c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters # syslog daemon interface 4842c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters exts.append( Extension('syslog', ['syslogmodule.c']) ) 485d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 486d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('syslog') 48700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 48800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # George Neville-Neil's timing module: 4896143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html 4906143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz # http://mail.python.org/pipermail/python-dev/2006-January/060023.html 4916143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz #exts.append( Extension('timing', ['timingmodule.c']) ) 49200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 49300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # 4945bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # Here ends the simple stuff. From here on, modules need certain 4955bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling # libraries, are platform-specific, or present other surprises. 49600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # 49700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 49800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Multimedia modules 49900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # These don't work for 64-bit platforms!!! 50000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # These represent audio samples or images as strings: 50100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 5025e4a3b86b359952dc6ba3da2f48594179a811319Neal Norwitz # Operations on audio samples 503f9cbf211578c3d5a7d5fe2ac3bf09b1b5a2dd5e2Tim Peters # According to #993173, this one should actually work fine on 5048fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis # 64-bit platforms. 5058fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis exts.append( Extension('audioop', ['audioop.c']) ) 5068fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis 507ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # Disabled on 64-bit platforms 50800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling if sys.maxint != 9223372036854775807L: 50900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Operations on images 51000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('imageop', ['imageop.c']) ) 51100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Read SGI RGB image files (but coded portably) 51200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('rgbimg', ['rgbimgmodule.c']) ) 513d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 514d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.extend(['imageop', 'rgbimg']) 51500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 51600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # readline 51781ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen do_readline = self.compiler.find_library_file(lib_dirs, 'readline') 51881ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen if platform == 'darwin': 51981ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen # MacOSX 10.4 has a broken readline. Don't try to build 52081ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen # the readline module unless the user has installed a fixed 52181ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen # readline package 5222086eaf79c9dc2992fef64392a9813e25f60696fMartin v. Löwis if find_file('readline/rlconf.h', inc_dirs, []) is None: 52381ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen do_readline = False 52481ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen if do_readline: 52539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren if sys.platform == 'darwin': 52639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # In every directory on the search path search for a dynamic 52739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # library and then a static library, instead of first looking 52839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # for dynamic libraries on the entiry path. 52939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # This way a staticly linked custom readline gets picked up 53039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # before the (broken) dynamic library in /usr/lib. 53139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren readline_extra_link_args = ('-Wl,-search_paths_first',) 53239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren else: 53339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren readline_extra_link_args = () 53439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 5352efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg readline_libs = ['readline'] 5365aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling if self.compiler.find_library_file(lib_dirs, 537a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis 'ncursesw'): 538a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis readline_libs.append('ncursesw') 539a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis elif self.compiler.find_library_file(lib_dirs, 5405aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling 'ncurses'): 5415aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling readline_libs.append('ncurses') 5420b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz elif self.compiler.find_library_file(lib_dirs, 'curses'): 5430b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz readline_libs.append('curses') 5445aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling elif self.compiler.find_library_file(lib_dirs + 5452efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg ['/usr/lib/termcap'], 5462efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg 'termcap'): 5472efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg readline_libs.append('termcap') 54800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('readline', ['readline.c'], 5497c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg library_dirs=['/usr/lib/termcap'], 55039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren extra_link_args=readline_extra_link_args, 5512efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg libraries=readline_libs) ) 552d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 553d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('readline') 554d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 55573aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen if platform not in ['mac']: 5567883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling # crypt module. 5572c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters 5582c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters if self.compiler.find_library_file(lib_dirs, 'crypt'): 5592c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters libs = ['crypt'] 5602c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters else: 5612c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters libs = [] 5622c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) ) 563d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 564d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('crypt') 56500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 566ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro # CSV files 567ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro exts.append( Extension('_csv', ['_csv.c']) ) 568ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro 56900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # socket(2) 57047d3a7afdaf52887d1bbd1a8cbcd717893c6d480Guido van Rossum exts.append( Extension('_socket', ['socketmodule.c'], 571340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton depends = ['socketmodule.h']) ) 572a5d2b4cb180ec87d006d63f838860fba785bcad0Marc-André Lemburg # Detect SSL support for the socket module (via _ssl) 573ade97338016947bad1d0def339328963fca09685Gregory P. Smith search_for_ssl_incs_in = [ 574ade97338016947bad1d0def339328963fca09685Gregory P. Smith '/usr/local/ssl/include', 575e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling '/usr/contrib/ssl/include/' 576e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling ] 577ade97338016947bad1d0def339328963fca09685Gregory P. Smith ssl_incs = find_file('openssl/ssl.h', inc_dirs, 578ade97338016947bad1d0def339328963fca09685Gregory P. Smith search_for_ssl_incs_in 579fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling ) 580a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis if ssl_incs is not None: 581a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis krb5_h = find_file('krb5.h', inc_dirs, 582a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis ['/usr/kerberos/include']) 583a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis if krb5_h: 584a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis ssl_incs += krb5_h 585fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs, 586e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling ['/usr/local/ssl/lib', 587e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling '/usr/contrib/ssl/lib/' 588e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling ] ) 589ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 590fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling if (ssl_incs is not None and 591fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling ssl_libs is not None): 592a5d2b4cb180ec87d006d63f838860fba785bcad0Marc-André Lemburg exts.append( Extension('_ssl', ['_ssl.c'], 593fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs = ssl_incs, 594ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh library_dirs = ssl_libs, 59547d3a7afdaf52887d1bbd1a8cbcd717893c6d480Guido van Rossum libraries = ['ssl', 'crypto'], 596340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton depends = ['socketmodule.h']), ) 597d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 598d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_ssl') 59900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 600ade97338016947bad1d0def339328963fca09685Gregory P. Smith # find out which version of OpenSSL we have 601ade97338016947bad1d0def339328963fca09685Gregory P. Smith openssl_ver = 0 602ade97338016947bad1d0def339328963fca09685Gregory P. Smith openssl_ver_re = re.compile( 603ade97338016947bad1d0def339328963fca09685Gregory P. Smith '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' ) 604ade97338016947bad1d0def339328963fca09685Gregory P. Smith for ssl_inc_dir in inc_dirs + search_for_ssl_incs_in: 605ade97338016947bad1d0def339328963fca09685Gregory P. Smith name = os.path.join(ssl_inc_dir, 'openssl', 'opensslv.h') 606ade97338016947bad1d0def339328963fca09685Gregory P. Smith if os.path.isfile(name): 607ade97338016947bad1d0def339328963fca09685Gregory P. Smith try: 608ade97338016947bad1d0def339328963fca09685Gregory P. Smith incfile = open(name, 'r') 609ade97338016947bad1d0def339328963fca09685Gregory P. Smith for line in incfile: 610ade97338016947bad1d0def339328963fca09685Gregory P. Smith m = openssl_ver_re.match(line) 611ade97338016947bad1d0def339328963fca09685Gregory P. Smith if m: 612ade97338016947bad1d0def339328963fca09685Gregory P. Smith openssl_ver = eval(m.group(1)) 613ade97338016947bad1d0def339328963fca09685Gregory P. Smith break 614ade97338016947bad1d0def339328963fca09685Gregory P. Smith except IOError: 615ade97338016947bad1d0def339328963fca09685Gregory P. Smith pass 616ade97338016947bad1d0def339328963fca09685Gregory P. Smith 617ade97338016947bad1d0def339328963fca09685Gregory P. Smith # first version found is what we'll use (as the compiler should) 618ade97338016947bad1d0def339328963fca09685Gregory P. Smith if openssl_ver: 619ade97338016947bad1d0def339328963fca09685Gregory P. Smith break 620ade97338016947bad1d0def339328963fca09685Gregory P. Smith 621ade97338016947bad1d0def339328963fca09685Gregory P. Smith #print 'openssl_ver = 0x%08x' % openssl_ver 622ade97338016947bad1d0def339328963fca09685Gregory P. Smith 623f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith if (ssl_incs is not None and 624ade97338016947bad1d0def339328963fca09685Gregory P. Smith ssl_libs is not None and 625ade97338016947bad1d0def339328963fca09685Gregory P. Smith openssl_ver >= 0x00907000): 626f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith # The _hashlib module wraps optimized implementations 627f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith # of hash functions from the OpenSSL library. 628f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith exts.append( Extension('_hashlib', ['_hashopenssl.c'], 629f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith include_dirs = ssl_incs, 630f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith library_dirs = ssl_libs, 631f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith libraries = ['ssl', 'crypto']) ) 632d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.extend(['_sha', '_md5']) 633f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith else: 634f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith # The _sha module implements the SHA1 hash algorithm. 635f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith exts.append( Extension('_sha', ['shamodule.c']) ) 636f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith # The _md5 module implements the RSA Data Security, Inc. MD5 637f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith # Message-Digest Algorithm, described in RFC 1321. The 6388e39ec78bcede7291e0573fc522425221eb05475Matthias Klose # necessary files md5.c and md5.h are included here. 639d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith exts.append( Extension('_md5', 640d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith sources = ['md5module.c', 'md5.c'], 641d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith depends = ['md5.h']) ) 642d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_hashlib') 643f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith 644ade97338016947bad1d0def339328963fca09685Gregory P. Smith if (openssl_ver < 0x00908000): 645ade97338016947bad1d0def339328963fca09685Gregory P. Smith # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash 646ade97338016947bad1d0def339328963fca09685Gregory P. Smith exts.append( Extension('_sha256', ['sha256module.c']) ) 647ade97338016947bad1d0def339328963fca09685Gregory P. Smith exts.append( Extension('_sha512', ['sha512module.c']) ) 648d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 649d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.extend(['_sha256', '_sha512']) 650f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith 65100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Modules that provide persistent dictionary-like semantics. You will 65200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # probably want to arrange for at least one of them to be available on 65300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # your machine, though none are defined by default because of library 65400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # dependencies. The Python module anydbm.py provides an 65500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # implementation independent wrapper for these; dumbdbm.py provides 65600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # similar functionality (but slower of course) implemented in Python. 65700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 65840819d551545db13cdfd46c773ffe3bc4f1f9ca0Barry Warsaw # Sleepycat Berkeley DB interface. http://www.sleepycat.com 65957454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro # 6603adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith # This requires the Sleepycat DB code. The supported versions 6613adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith # are set below. Visit http://www.sleepycat.com/ to download 6623adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith # a release. Most open source OSes come with one or more 6633adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith # versions of BerkeleyDB already installed. 66457454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro 6658b96a35d14c0ec5db5f32321e544269a5b0a8759Gregory P. Smith max_db_ver = (4, 5) 6663adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith min_db_ver = (3, 3) 667e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_setup_debug = False # verbose debug prints from this script? 668e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 669e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # construct a list of paths to look for the header file in on 670e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # top of the normal inc_dirs. 671e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths = [ 672e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/usr/include/db4', 673e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/usr/local/include/db4', 674e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/opt/sfw/include/db4', 675e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/usr/include/db3', 676e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/usr/local/include/db3', 677e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/opt/sfw/include/db3', 67800c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro # Fink defaults (http://fink.sourceforge.net/) 67900c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro '/sw/include/db4', 680e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith '/sw/include/db3', 681e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith ] 682e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # 4.x minor number specific paths 6838b96a35d14c0ec5db5f32321e544269a5b0a8759Gregory P. Smith for x in (0,1,2,3,4,5): 684e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/usr/include/db4%d' % x) 6858f40171b6734250008e68f79ae64308e37902dfaNeal Norwitz db_inc_paths.append('/usr/include/db4.%d' % x) 686e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x) 687e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/usr/local/include/db4%d' % x) 688e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/pkg/db-4.%d/include' % x) 68929602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith db_inc_paths.append('/opt/db-4.%d/include' % x) 69000c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro # MacPorts default (http://www.macports.org/) 69100c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro db_inc_paths.append('/opt/local/include/db4%d' % x) 692e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # 3.x minor number specific paths 6938b96a35d14c0ec5db5f32321e544269a5b0a8759Gregory P. Smith for x in (3,): 694e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/usr/include/db3%d' % x) 695e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x) 696e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/usr/local/include/db3%d' % x) 697e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_inc_paths.append('/pkg/db-3.%d/include' % x) 69829602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith db_inc_paths.append('/opt/db-3.%d/include' % x) 699e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 7009b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren # Add some common subdirectories for Sleepycat DB to the list, 7019b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren # based on the standard include directories. This way DB3/4 gets 7029b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren # picked up when it is installed in a non-standard prefix and 7039b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren # the user has added that prefix into inc_dirs. 7049b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants = [] 7059b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren for dn in inc_dirs: 7069b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants.append(os.path.join(dn, 'db3')) 7079b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants.append(os.path.join(dn, 'db4')) 7089b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren for x in (0,1,2,3,4): 7099b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants.append(os.path.join(dn, "db4%d"%x)) 7109b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants.append(os.path.join(dn, "db4.%d"%x)) 7119b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren for x in (2,3): 7129b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants.append(os.path.join(dn, "db3%d"%x)) 7139b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren std_variants.append(os.path.join(dn, "db3.%d"%x)) 7149b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren 71538ff36c4ccde02b104553ef1ed979c1261196b48Tim Peters db_inc_paths = std_variants + db_inc_paths 71600c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)] 7179b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren 718e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_ver_inc_map = {} 719e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 720e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith class db_found(Exception): pass 72157454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro try: 72205d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis # See whether there is a Sleepycat header in the standard 72305d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis # search path. 724e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith for d in inc_dirs + db_inc_paths: 72505d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis f = os.path.join(d, "db.h") 726e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith if db_setup_debug: print "db: looking for db.h in", f 72705d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis if os.path.exists(f): 72805d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis f = open(f).read() 729e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f) 73005d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis if m: 731e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_major = int(m.group(1)) 732e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f) 733e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_minor = int(m.group(1)) 734e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_ver = (db_major, db_minor) 735e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 736e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith if ( (not db_ver_inc_map.has_key(db_ver)) and 737e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith (db_ver <= max_db_ver and db_ver >= min_db_ver) ): 738e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # save the include directory with the db.h version 73900c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro # (first occurrence only) 740e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_ver_inc_map[db_ver] = d 741738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling if db_setup_debug: 742738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling print "db.h: found", db_ver, "in", d 743e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith else: 744e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # we already found a header for this library version 745e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith if db_setup_debug: print "db.h: ignoring", d 746e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith else: 747e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # ignore this header, it didn't contain a version number 74800c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro if db_setup_debug: 74900c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro print "db.h: no version number version in", d 750e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 751e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_found_vers = db_ver_inc_map.keys() 752e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_found_vers.sort() 753e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 754e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith while db_found_vers: 755e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_ver = db_found_vers.pop() 756e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_incdir = db_ver_inc_map[db_ver] 757e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 758e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # check lib directories parallel to the location of the header 759e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_dirs_to_check = [ 76000c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro db_incdir.replace("include", 'lib64'), 76100c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro db_incdir.replace("include", 'lib'), 762e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith ] 763e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check) 764e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 765e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # Look for a version specific db-X.Y before an ambiguoius dbX 766e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # XXX should we -ever- look for a dbX name? Do any 767e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # systems really not name their library by version and 768e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # symlink to more general names? 769953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre for dblib in (('db-%d.%d' % db_ver), 770953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre ('db%d%d' % db_ver), 771953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre ('db%d' % db_ver[0])): 772e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith dblib_file = self.compiler.find_library_file( 773e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_dirs_to_check + lib_dirs, dblib ) 774e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith if dblib_file: 775e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ] 776e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith raise db_found 777e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith else: 778e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith if db_setup_debug: print "db lib: ", dblib, "not found" 779e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith 780e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith except db_found: 781738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling if db_setup_debug: 782738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling print "db lib: using", db_ver, dblib 783738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling print "db: lib dir", dblib_dir, "inc dir", db_incdir 784e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith db_incs = [db_incdir] 785d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen dblibs = [dblib] 786e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # We add the runtime_library_dirs argument because the 787e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # BerkeleyDB lib we're linking against often isn't in the 788e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # system dynamic library search path. This is usually 789e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # correct and most trouble free, but may cause problems in 790e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # some unusual system configurations (e.g. the directory 791e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith # is on an NFS server that goes away). 7926aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis exts.append(Extension('_bsddb', ['_bsddb.c'], 79305d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis library_dirs=dblib_dir, 79405d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis runtime_library_dirs=dblib_dir, 7956aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis include_dirs=db_incs, 7966aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis libraries=dblibs)) 79757454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro else: 798e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith if db_setup_debug: print "db: no appropriate library found" 79957454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro db_incs = None 80057454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro dblibs = [] 80157454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro dblib_dir = None 802d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_bsddb') 80357454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro 804c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter # The sqlite interface 805738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling sqlite_setup_debug = False # verbose debug prints from this script? 806c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter 8073dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter # We hunt for #define SQLITE_VERSION "n.n.n" 8083dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter # We need to find >= sqlite version 3.0.8 809c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_incdir = sqlite_libdir = None 8103dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter sqlite_inc_paths = [ '/usr/include', 811c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '/usr/include/sqlite', 812c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '/usr/include/sqlite3', 813c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '/usr/local/include', 814c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '/usr/local/include/sqlite', 815c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '/usr/local/include/sqlite3', 816c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter ] 8173dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter MIN_SQLITE_VERSION_NUMBER = (3, 0, 8) 8183dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter MIN_SQLITE_VERSION = ".".join([str(x) 8193dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter for x in MIN_SQLITE_VERSION_NUMBER]) 82039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 82139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # Scan the default include directories before the SQLite specific 82239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # ones. This allows one to override the copy of sqlite on OSX, 82339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # where /usr/include contains an old version of sqlite. 82439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren for d in inc_dirs + sqlite_inc_paths: 825c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter f = os.path.join(d, "sqlite3.h") 826c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter if os.path.exists(f): 82707f5b35e190ab9be85143c6e8e1217d96bbf75caAnthony Baxter if sqlite_setup_debug: print "sqlite: found %s"%f 8283dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter incf = open(f).read() 8293dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter m = re.search( 8303dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf) 831c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter if m: 8323dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter sqlite_version = m.group(1) 8333dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter sqlite_version_tuple = tuple([int(x) 8343dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter for x in sqlite_version.split(".")]) 8353dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER: 836c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter # we win! 837738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling if sqlite_setup_debug: 838738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling print "%s/sqlite3.h: version %s"%(d, sqlite_version) 839c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_incdir = d 840c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter break 841c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter else: 8423dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter if sqlite_setup_debug: 843c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter print "%s: version %d is too old, need >= %s"%(d, 844c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_version, MIN_SQLITE_VERSION) 8453dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter elif sqlite_setup_debug: 8463dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter print "sqlite: %s had no SQLITE_VERSION"%(f,) 8473dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter 848c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter if sqlite_incdir: 849c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_dirs_to_check = [ 850c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter os.path.join(sqlite_incdir, '..', 'lib64'), 851c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter os.path.join(sqlite_incdir, '..', 'lib'), 852c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter os.path.join(sqlite_incdir, '..', '..', 'lib64'), 853c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter os.path.join(sqlite_incdir, '..', '..', 'lib'), 854c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter ] 855c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_libfile = self.compiler.find_library_file( 856c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_dirs_to_check + lib_dirs, 'sqlite3') 857c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))] 858c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter 859c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter if sqlite_incdir and sqlite_libdir: 8603e99c0ad649de0393d9a8af17f34d9d1f55f4ab2Gerhard Häring sqlite_srcs = ['_sqlite/cache.c', 861c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/connection.c', 862c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/cursor.c', 863c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/microprotocols.c', 864c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/module.c', 865c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/prepare_protocol.c', 866c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/row.c', 867c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/statement.c', 868c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter '_sqlite/util.c', ] 869c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter 870c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_defines = [] 871c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter if sys.platform != "win32": 8728e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter sqlite_defines.append(('MODULE_NAME', '"sqlite3"')) 873c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter else: 8748e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"')) 8758e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter 87639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 87739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren if sys.platform == 'darwin': 87839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # In every directory on the search path search for a dynamic 87939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # library and then a static library, instead of first looking 88039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # for dynamic libraries on the entiry path. 88139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # This way a staticly linked custom sqlite gets picked up 88239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren # before the dynamic library in /usr/lib. 88339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren sqlite_extra_link_args = ('-Wl,-search_paths_first',) 88439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren else: 88539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren sqlite_extra_link_args = () 88639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren 887c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter exts.append(Extension('_sqlite3', sqlite_srcs, 888c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter define_macros=sqlite_defines, 8893dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter include_dirs=["Modules/_sqlite", 890c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter sqlite_incdir], 891c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter library_dirs=sqlite_libdir, 892c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter runtime_library_dirs=sqlite_libdir, 89339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren extra_link_args=sqlite_extra_link_args, 894c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter libraries=["sqlite3",])) 895d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 896d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_sqlite3') 89722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro 89822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # Look for Berkeley db 1.85. Note that it is built as a different 89922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # module name so it can be included even when later versions are 90022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # available. A very restrictive search is performed to avoid 90122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # accidentally building this module with a later version of the 90222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # underlying db library. May BSD-ish Unixes incorporate db 1.85 90322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # symbols into libc and place the include file in /usr/include. 90422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro f = "/usr/include/db.h" 90522e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro if os.path.exists(f): 90622e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro data = open(f).read() 90722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data) 90822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro if m is not None: 90922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro # bingo - old version used hash file format version 2 91022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro ### XXX this should be fixed to not be platform-dependent 91122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro ### but I don't have direct access to an osf1 platform and 91222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro ### seemed to be muffing the search somehow 91322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro libraries = platform == "osf1" and ['db'] or None 91422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro if libraries is not None: 91522e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro exts.append(Extension('bsddb185', ['bsddbmodule.c'], 91622e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro libraries=libraries)) 91722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro else: 91822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro exts.append(Extension('bsddb185', ['bsddbmodule.c'])) 919d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 920d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('bsddb185') 921d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 922d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('bsddb185') 92322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro 92400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # The standard Unix dbm module: 925d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen if platform not in ['cygwin']: 926a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis if find_file("ndbm.h", inc_dirs, []) is not None: 927a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis # Some systems have -lndbm, others don't 928a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis if self.compiler.find_library_file(lib_dirs, 'ndbm'): 929a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis ndbm_libs = ['ndbm'] 930a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis else: 931a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis ndbm_libs = [] 93234febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling exts.append( Extension('dbm', ['dbmmodule.c'], 933d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen define_macros=[('HAVE_NDBM_H',None)], 934a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis libraries = ndbm_libs ) ) 935d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen elif (self.compiler.find_library_file(lib_dirs, 'gdbm') 936d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen and find_file("gdbm/ndbm.h", inc_dirs, []) is not None): 937d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen exts.append( Extension('dbm', ['dbmmodule.c'], 938d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen define_macros=[('HAVE_GDBM_NDBM_H',None)], 93957454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro libraries = ['gdbm'] ) ) 94057454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro elif db_incs is not None: 94157454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro exts.append( Extension('dbm', ['dbmmodule.c'], 942a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis library_dirs=dblib_dir, 943a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis runtime_library_dirs=dblib_dir, 94457454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro include_dirs=db_incs, 945d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen define_macros=[('HAVE_BERKDB_H',None), 946d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen ('DB_DBM_HSEARCH',None)], 94757454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro libraries=dblibs)) 948d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 949d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('dbm') 950ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 95100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm: 95200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling if (self.compiler.find_library_file(lib_dirs, 'gdbm')): 95300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('gdbm', ['gdbmmodule.c'], 95400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling libraries = ['gdbm'] ) ) 955d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 956d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('gdbm') 95700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 95800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Unix-only modules 95934febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling if platform not in ['mac', 'win32']: 96000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Steen Lumholt's termios module 96100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('termios', ['termios.c']) ) 96200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Jeremy Hylton's rlimit interface 9632c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters if platform not in ['atheos']: 964f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis exts.append( Extension('resource', ['resource.c']) ) 965d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 966d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('resource') 96700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 968cf393f3fd9759ffac71c816f97ea01780848512cAndrew M. Kuchling # Sun yellow pages. Some systems have the functions in libc. 969f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis if platform not in ['cygwin', 'atheos']: 9706efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling if (self.compiler.find_library_file(lib_dirs, 'nsl')): 9716efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling libs = ['nsl'] 9726efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling else: 9736efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling libs = [] 9746efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling exts.append( Extension('nis', ['nismodule.c'], 9756efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling libraries = libs) ) 976d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 977d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('nis') 978d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 979d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.extend(['nis', 'resource', 'termios']) 98000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 98172092941125cb0a3577fbf63294d14a02bb5dd2aSkip Montanaro # Curses support, requiring the System V version of curses, often 982ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # provided by the ncurses library. 98386070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling panel_library = 'panel' 984a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis if (self.compiler.find_library_file(lib_dirs, 'ncursesw')): 985a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis curses_libs = ['ncursesw'] 98686070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling # Bug 1464056: If _curses.so links with ncursesw, 98786070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling # _curses_panel.so must link with panelw. 98886070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling panel_library = 'panelw' 989a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis exts.append( Extension('_curses', ['_cursesmodule.c'], 990a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis libraries = curses_libs) ) 991a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis elif (self.compiler.find_library_file(lib_dirs, 'ncurses')): 99200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling curses_libs = ['ncurses'] 99300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('_curses', ['_cursesmodule.c'], 99400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling libraries = curses_libs) ) 99538419c003c7f162d937320d01edce0c97ef502c3Fred Drake elif (self.compiler.find_library_file(lib_dirs, 'curses') 99638419c003c7f162d937320d01edce0c97ef502c3Fred Drake and platform != 'darwin'): 9975b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson # OSX has an old Berkeley curses, not good enough for 9985b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson # the _curses module. 99900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling if (self.compiler.find_library_file(lib_dirs, 'terminfo')): 100000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling curses_libs = ['curses', 'terminfo'] 10010b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz elif (self.compiler.find_library_file(lib_dirs, 'termcap')): 100200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling curses_libs = ['curses', 'termcap'] 10030b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz else: 10040b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz curses_libs = ['curses'] 1005ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 100600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('_curses', ['_cursesmodule.c'], 100700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling libraries = curses_libs) ) 1008d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1009d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_curses') 1010ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 101100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # If the curses module is enabled, check for the panel module 1012e7ffbb24e80800de3667a88af96d03f8c9717039Andrew M. Kuchling if (module_enabled(exts, '_curses') and 101386070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling self.compiler.find_library_file(lib_dirs, panel_library)): 101400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('_curses_panel', ['_curses_panel.c'], 101586070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling libraries = [panel_library] + curses_libs) ) 1016d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1017d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_curses_panel') 1018ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 1019259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # Andrew Kuchling's zlib module. Note that some versions of zlib 1020259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # 1.1.3 have security problems. See CERT Advisory CA-2002-07: 1021259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # http://www.cert.org/advisories/CA-2002-07.html 1022259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # 1023259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to 1024259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For 1025259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # now, we still accept 1.1.3, because we think it's difficult to 1026259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # exploit this in Python, and we'd rather make it RedHat's problem 1027259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # than our problem <wink>. 1028259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # 1029259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # You can upgrade zlib to version 1.1.4 yourself by going to 1030259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw # http://www.gzip.org/zlib/ 1031e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum zlib_inc = find_file('zlib.h', [], inc_dirs) 1032e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum if zlib_inc is not None: 1033e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum zlib_h = zlib_inc[0] + '/zlib.h' 1034e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum version = '"0.0.0"' 1035259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw version_req = '"1.1.3"' 1036e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum fp = open(zlib_h) 1037e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum while 1: 1038e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum line = fp.readline() 1039e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum if not line: 1040e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum break 10418cdc03dca571fd2847d68bfd220234c0153f8f47Guido van Rossum if line.startswith('#define ZLIB_VERSION'): 1042e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum version = line.split()[2] 1043e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum break 1044e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum if version >= version_req: 1045e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum if (self.compiler.find_library_file(lib_dirs, 'z')): 10469b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren if sys.platform == "darwin": 10479b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren zlib_extra_link_args = ('-Wl,-search_paths_first',) 10489b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren else: 10499b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren zlib_extra_link_args = () 1050e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum exts.append( Extension('zlib', ['zlibmodule.c'], 10519b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren libraries = ['z'], 10529b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren extra_link_args = zlib_extra_link_args)) 1053d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1054d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('zlib') 1055d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1056d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('zlib') 1057d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1058d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('zlib') 105900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 1060f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer # Gustavo Niemeyer's bz2 module. 1061f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer if (self.compiler.find_library_file(lib_dirs, 'bz2')): 10629b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren if sys.platform == "darwin": 10639b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren bz2_extra_link_args = ('-Wl,-search_paths_first',) 10649b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren else: 10659b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren bz2_extra_link_args = () 1066f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer exts.append( Extension('bz2', ['bz2module.c'], 10679b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren libraries = ['bz2'], 10689b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren extra_link_args = bz2_extra_link_args) ) 1069d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1070d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('bz2') 1071f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer 107200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Interface to the Expat XML parser 107300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # 1074fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # Expat was written by James Clark and is now maintained by a 1075fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # group of developers on SourceForge; see www.libexpat.org for 1076fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # more information. The pyexpat module was written by Paul 107799f3ba1648004af22ede20d09d567cb33dce3db8Andrew M. Kuchling # Prescod after a prototype by Jack Jansen. The Expat source 107899f3ba1648004af22ede20d09d567cb33dce3db8Andrew M. Kuchling # is included in Modules/expat/. Usage of a system 1079fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # shared libexpat.so/expat.dll is not advised. 1080fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # 1081fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # More information on Expat can be found at www.libexpat.org. 1082fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake # 10838301256a440fdd98fd500d225dac20ebb192e08fMartin v. Löwis expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat') 10842d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake define_macros = [ 1085988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren ('HAVE_EXPAT_CONFIG_H', '1'), 1086988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren ] 1087988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren 10882d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake exts.append(Extension('pyexpat', 10892d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake define_macros = define_macros, 10902d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake include_dirs = [expatinc], 10912d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake sources = ['pyexpat.c', 10922d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake 'expat/xmlparse.c', 10932d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake 'expat/xmlrole.c', 10942d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake 'expat/xmltok.c', 10952d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake ], 10962d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake )) 109700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 10984c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh # Fredrik Lundh's cElementTree module. Note that this also 10994c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh # uses expat (via the CAPI hook in pyexpat). 11004c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh 11016c403597954487e8129221351f72da3735c52c09Hye-Shik Chang if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')): 11024c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh define_macros.append(('USE_PYEXPAT_CAPI', None)) 11034c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh exts.append(Extension('_elementtree', 11044c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh define_macros = define_macros, 11054c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh include_dirs = [expatinc], 11064c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh sources = ['_elementtree.c'], 11074c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh )) 1108d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1109d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_elementtree') 11104c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh 11113e2a30692085d32ac63f72b35da39158a471fc68Hye-Shik Chang # Hye-Shik Chang's CJKCodecs modules. 1112e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis if have_unicode: 1113e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis exts.append(Extension('_multibytecodec', 1114e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis ['cjkcodecs/multibytecodec.c'])) 1115e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'): 1116d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro exts.append(Extension('_codecs_%s' % loc, 1117e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis ['cjkcodecs/_codecs_%s.c' % loc])) 1118d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1119d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_multibytecodec') 1120d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'): 1121d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_codecs_%s' % loc) 11223e2a30692085d32ac63f72b35da39158a471fc68Hye-Shik Chang 11235b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson # Dynamic loading module 1124770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum if sys.maxint == 0x7fffffff: 1125770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum # This requires sizeof(int) == sizeof(long) == sizeof(char*) 1126770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum dl_inc = find_file('dlfcn.h', [], inc_dirs) 11278220174489e3f28b874b3b45516585c30e5999daAnthony Baxter if (dl_inc is not None) and (platform not in ['atheos']): 1128770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum exts.append( Extension('dl', ['dlmodule.c']) ) 1129d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1130d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('dl') 1131d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1132d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('dl') 11335b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 1134cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller # Thomas Heller's _ctypes module 11359176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis self.detect_ctypes(inc_dirs, lib_dirs) 1136cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller 113700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Platform-specific libraries 113834febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling if platform == 'linux2': 113900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Linux-specific modules 114000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) 1141d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1142d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('linuxaudiodev') 11430a6355eb1fb5af03827a00e146c147c94efe78c9Greg Ward 11444e422817eb1bc5a6a42365001ad45683ae07e559Hye-Shik Chang if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', 11454e422817eb1bc5a6a42365001ad45683ae07e559Hye-Shik Chang 'freebsd7'): 11460c016a9590b3da47f19420d0616e0c72cae19abfGuido van Rossum exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) 1147d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1148d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('ossaudiodev') 114900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 115034febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling if platform == 'sunos5': 1151ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # SunOS specific modules 115200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) ) 1153d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro else: 1154d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('sunaudiodev') 11555b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 115666cb018c96e49b5e5cf1b8fc395171a223d86d8eTim Peters if platform == 'darwin' and ("--disable-toolbox-glue" not in 1157090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren sysconfig.get_config_var("CONFIG_ARGS")): 1158090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren 1159090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren if os.uname()[2] > '8.': 1160090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren # We're on Mac OS X 10.4 or later, the compiler should 1161090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren # support '-Wno-deprecated-declarations'. This will 1162090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren # surpress deprecation warnings for the Carbon extensions, 1163090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren # these extensions wrap the Carbon APIs and even those 1164090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren # parts that are deprecated. 1165090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren carbon_extra_compile_args = ['-Wno-deprecated-declarations'] 1166090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren else: 1167090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren carbon_extra_compile_args = [] 1168090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren 116905ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum # Mac OS X specific modules. 11703e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz def macSrcExists(name1, name2=''): 11713e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz if not name1: 11723e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz return None 11733e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz names = (name1,) 11743e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz if name2: 11753e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz names = (name1, name2) 11763e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz path = os.path.join(srcdir, 'Mac', 'Modules', *names) 11773e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz return os.path.exists(path) 11783e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 11793e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz def addMacExtension(name, kwds, extra_srcs=[]): 11803e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz dirname = '' 11813e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz if name[0] == '_': 11823e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz dirname = name[1:].lower() 11833e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz cname = name + '.c' 11843e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz cmodulename = name + 'module.c' 11853e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c 11863e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz if macSrcExists(cname): 11873e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz srcs = [cname] 11883e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz elif macSrcExists(cmodulename): 11893e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz srcs = [cmodulename] 11903e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz elif macSrcExists(dirname, cname): 11913e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # XXX(nnorwitz): If all the names ended with module, we 11923e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # wouldn't need this condition. ibcarbon is the only one. 11933e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz srcs = [os.path.join(dirname, cname)] 11943e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz elif macSrcExists(dirname, cmodulename): 11953e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz srcs = [os.path.join(dirname, cmodulename)] 11963e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz else: 11973e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz raise RuntimeError("%s not found" % name) 11983e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 11993e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # Here's the whole point: add the extension with sources 12003e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz exts.append(Extension(name, srcs + extra_srcs, **kwds)) 12013e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 12023e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # Core Foundation 12033e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz core_kwds = {'extra_compile_args': carbon_extra_compile_args, 12043e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 'extra_link_args': ['-framework', 'CoreFoundation'], 12053e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz } 12063e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c']) 12073e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz addMacExtension('autoGIL', core_kwds) 12083e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 12093e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # Carbon 12103e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz carbon_kwds = {'extra_compile_args': carbon_extra_compile_args, 12113e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 'extra_link_args': ['-framework', 'Carbon'], 12123e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz } 1213a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav', 1214a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter 'OSATerminology', 'icglue', 12153e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # All these are in subdirs 1216a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl', 12173e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm', 1218a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter '_Help', '_Icn', '_IBCarbon', '_List', 1219a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs', 12203e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz '_Scrap', '_Snd', '_TE', '_Win', 1221a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter ] 12223e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz for name in CARBON_EXTS: 12233e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz addMacExtension(name, carbon_kwds) 12243e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 12253e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz # Application Services & QuickTime 12263e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz app_kwds = {'extra_compile_args': carbon_extra_compile_args, 12273e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 'extra_link_args': ['-framework','ApplicationServices'], 12283e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz } 12293e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz addMacExtension('_Launch', app_kwds) 12303e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz addMacExtension('_CG', app_kwds) 12313e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 123205ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum exts.append( Extension('_Qt', ['qt/_Qtmodule.c'], 1233090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren extra_compile_args=carbon_extra_compile_args, 1234090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren extra_link_args=['-framework', 'QuickTime', 123505ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum '-framework', 'Carbon']) ) 12363e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz 12375b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 1238fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling self.extensions.extend(exts) 1239fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 1240fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Call the method for detecting whether _tkinter can be compiled 1241fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling self.detect_tkinter(inc_dirs, lib_dirs) 1242ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 1243d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro if '_tkinter' not in [e.name for e in self.extensions]: 1244d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro missing.append('_tkinter') 1245d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 1246d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro return missing 1247d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro 12480b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen def detect_tkinter_darwin(self, inc_dirs, lib_dirs): 12490b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # The _tkinter module, using frameworks. Since frameworks are quite 12500b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # different the UNIX search logic is not sharable. 12510b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen from os.path import join, exists 12520b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen framework_dirs = [ 12532c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters '/System/Library/Frameworks/', 12542c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters '/Library/Frameworks', 12550b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen join(os.getenv('HOME'), '/Library/Frameworks') 12560b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen ] 12570b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen 12580174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro # Find the directory that contains the Tcl.framework and Tk.framework 12590b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # bundles. 12600b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # XXX distutils should support -F! 12610b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen for F in framework_dirs: 12622c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters # both Tcl.framework and Tk.framework should be present 12630b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen for fw in 'Tcl', 'Tk': 12642c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters if not exists(join(F, fw + '.framework')): 12650b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen break 12660b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen else: 12670b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # ok, F is now directory with both frameworks. Continure 12680b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # building 12690b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen break 12700b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen else: 12710b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # Tk and Tcl frameworks not found. Normal "unix" tkinter search 12720b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # will now resume. 12730b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen return 0 12742c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters 12750b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # For 8.4a2, we must add -I options that point inside the Tcl and Tk 12760b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # frameworks. In later release we should hopefully be able to pass 12772c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters # the -F option to gcc, which specifies a framework lookup path. 12780b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # 12790b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen include_dirs = [ 12802c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters join(F, fw + '.framework', H) 12810b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen for fw in 'Tcl', 'Tk' 12820b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen for H in 'Headers', 'Versions/Current/PrivateHeaders' 12830b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen ] 12840b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen 12852c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters # For 8.4a2, the X11 headers are not included. Rather than include a 12860b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # complicated search, this is a hard-coded path. It could bail out 12870b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # if X11 libs are not found... 12880b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen include_dirs.append('/usr/X11R6/include') 12890b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] 12900b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen 12910b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], 12920b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen define_macros=[('WITH_APPINIT', 1)], 12930b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen include_dirs = include_dirs, 12940b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen libraries = [], 12950b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen extra_compile_args = frameworks, 12960b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen extra_link_args = frameworks, 12970b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen ) 12980b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen self.extensions.append(ext) 12990b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen return 1 13000b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen 13012c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters 1302fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling def detect_tkinter(self, inc_dirs, lib_dirs): 130300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # The _tkinter module. 13045b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 13050b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # Rather than complicate the code below, detecting and building 13060b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # AquaTk is a separate method. Only one Tkinter will be built on 13070b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen # Darwin - either AquaTk, if it is found, or X11 based Tk. 13080b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen platform = self.get_platform() 13090174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro if (platform == 'darwin' and 13100174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro self.detect_tkinter_darwin(inc_dirs, lib_dirs)): 13112c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters return 13120b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen 1313fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Assume we haven't found any of the libraries or include files 13143db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis # The versions with dots are used on Unix, and the versions without 13153db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis # dots on Windows, for detection by cygwin. 1316fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling tcllib = tklib = tcl_includes = tk_includes = None 13174c4a45de8f992bb0c5cf35910d34ed6c63fa9d14Andrew M. Kuchling for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', 13183db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis '82', '8.1', '81', '8.0', '80']: 1319cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) 1320cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) 13215b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson if tklib and tcllib: 132200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # Exit the loop when we've found the Tcl/Tk libraries 132300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling break 1324fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 1325ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # Now check for the header files 1326fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling if tklib and tcllib: 13273c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling # Check for the include files on Debian and {Free,Open}BSD, where 1328fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # they're put in /usr/include/{tcl,tk}X.Y 13293c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling dotversion = version 13303c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling if '.' not in dotversion and "bsd" in sys.platform.lower(): 13313c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a, 13323c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling # but the include subdirs are named like .../include/tcl8.3. 13333c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling dotversion = dotversion[:-1] + '.' + dotversion[-1] 13343c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tcl_include_sub = [] 13353c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tk_include_sub = [] 13363c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling for dir in inc_dirs: 13373c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tcl_include_sub += [dir + os.sep + "tcl" + dotversion] 13383c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tk_include_sub += [dir + os.sep + "tk" + dotversion] 13393c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tk_include_sub += tcl_include_sub 13403c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub) 13413c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling tk_includes = find_file('tk.h', inc_dirs, tk_include_sub) 1342fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 1343e86a59af886d6c0f58f53e42878a25e48627fed1Martin v. Löwis if (tcllib is None or tklib is None or 1344fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling tcl_includes is None or tk_includes is None): 13453c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2) 1346fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling return 1347ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 1348fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # OK... everything seems to be present for Tcl/Tk. 1349fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 1350fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = [] 1351fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling for dir in tcl_includes + tk_includes: 1352fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling if dir not in include_dirs: 1353fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs.append(dir) 1354ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 1355fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Check for various platform-specific directories 135634febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling if platform == 'sunos5': 1357fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs.append('/usr/openwin/include') 1358fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling added_lib_dirs.append('/usr/openwin/lib') 1359fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling elif os.path.exists('/usr/X11R6/include'): 1360fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs.append('/usr/X11R6/include') 1361fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis added_lib_dirs.append('/usr/X11R6/lib64') 1362fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling added_lib_dirs.append('/usr/X11R6/lib') 1363fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling elif os.path.exists('/usr/X11R5/include'): 1364fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs.append('/usr/X11R5/include') 1365fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling added_lib_dirs.append('/usr/X11R5/lib') 1366fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling else: 1367ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # Assume default location for X11 1368fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs.append('/usr/X11/include') 1369fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling added_lib_dirs.append('/usr/X11/lib') 1370fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 13719181c94e05250b8f69615a96634d55afe532e406Jason Tishler # If Cygwin, then verify that X is installed before proceeding 13729181c94e05250b8f69615a96634d55afe532e406Jason Tishler if platform == 'cygwin': 13739181c94e05250b8f69615a96634d55afe532e406Jason Tishler x11_inc = find_file('X11/Xlib.h', [], include_dirs) 13749181c94e05250b8f69615a96634d55afe532e406Jason Tishler if x11_inc is None: 13759181c94e05250b8f69615a96634d55afe532e406Jason Tishler return 13769181c94e05250b8f69615a96634d55afe532e406Jason Tishler 1377fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Check for BLT extension 137838419c003c7f162d937320d01edce0c97ef502c3Fred Drake if self.compiler.find_library_file(lib_dirs + added_lib_dirs, 137938419c003c7f162d937320d01edce0c97ef502c3Fred Drake 'BLT8.0'): 1380fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling defs.append( ('WITH_BLT', 1) ) 1381fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling libs.append('BLT8.0') 1382427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis elif self.compiler.find_library_file(lib_dirs + added_lib_dirs, 1383427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis 'BLT'): 1384427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis defs.append( ('WITH_BLT', 1) ) 1385427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis libs.append('BLT') 1386fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 1387fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # Add the Tcl/Tk libraries 1388cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler libs.append('tk'+ version) 1389cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler libs.append('tcl'+ version) 1390ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 139134febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling if platform in ['aix3', 'aix4']: 1392fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling libs.append('ld') 1393fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 13943db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis # Finally, link with the X11 libraries (not appropriate on cygwin) 13953db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis if platform != "cygwin": 13963db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis libs.append('X11') 1397fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling 1398fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], 1399fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling define_macros=[('WITH_APPINIT', 1)] + defs, 1400fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling include_dirs = include_dirs, 1401fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling libraries = libs, 1402fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling library_dirs = added_lib_dirs, 1403fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling ) 1404fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling self.extensions.append(ext) 1405ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 14066c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum## # Uncomment these lines if you want to play with xxmodule.c 14076c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum## ext = Extension('xx', ['xxmodule.c']) 14086c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum## self.extensions.append(ext) 14096c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum 1410fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling # XXX handle these, but how to detect? 141100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # *** Uncomment and edit for PIL (TkImaging) extension only: 1412ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \ 141300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # *** Uncomment and edit for TOGL extension only: 1414ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # -DWITH_TOGL togl.c \ 141500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # *** Uncomment these for TOGL extension only: 1416ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh # -lGL -lGLU -lXext -lXmu \ 141700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling 1418eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller def configure_ctypes(self, ext): 14199176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if not self.use_system_libffi: 14209176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis (srcdir,) = sysconfig.get_config_vars('srcdir') 14219176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_builddir = os.path.join(self.build_temp, 'libffi') 14229176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', 14239176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis '_ctypes', 'libffi')) 14249176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py') 14259176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14265e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller from distutils.dep_util import newer_group 14275e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller 14285e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller config_sources = [os.path.join(ffi_srcdir, fname) 1429f1a4aa340ea3794a6cc2d54fb6647b4d7b61f275Martin v. Löwis for fname in os.listdir(ffi_srcdir) 1430f1a4aa340ea3794a6cc2d54fb6647b4d7b61f275Martin v. Löwis if os.path.isfile(os.path.join(ffi_srcdir, fname))] 14315e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller if self.force or newer_group(config_sources, 14325e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller ffi_configfile): 14339176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis from distutils.dir_util import mkpath 14349176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis mkpath(ffi_builddir) 14359176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis config_args = [] 14369176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14379176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis # Pass empty CFLAGS because we'll just append the resulting 14389176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis # CFLAGS to Python's; -g or -O2 is to be avoided. 14399176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \ 14409176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis % (ffi_builddir, ffi_srcdir, " ".join(config_args)) 14419176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14429176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis res = os.system(cmd) 14439176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if res or not os.path.exists(ffi_configfile): 14449176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis print "Failed to configure _ctypes module" 14459176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis return False 14469176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14479176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis fficonfig = {} 14489176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis execfile(ffi_configfile, globals(), fficonfig) 14499176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src') 14509176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14519176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis # Add .S (preprocessed assembly) to C compiler source extensions. 14529176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis self.compiler.src_extensions.append('.S') 14539176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14549176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis include_dirs = [os.path.join(ffi_builddir, 'include'), 14559176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_builddir, ffi_srcdir] 14569176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis extra_compile_args = fficonfig['ffi_cflags'].split() 14579176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 14589176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ext.sources.extend(fficonfig['ffi_sources']) 14599176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ext.include_dirs.extend(include_dirs) 14609176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ext.extra_compile_args.extend(extra_compile_args) 1461795246cf9937f088f8d98253f38da4a093c08300Thomas Heller return True 1462eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller 14639176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis def detect_ctypes(self, inc_dirs, lib_dirs): 14649176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis self.use_system_libffi = False 1465eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller include_dirs = [] 1466eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller extra_compile_args = [] 14671798489547a259876c495280dcd5d649269967f3Thomas Heller extra_link_args = [] 1468cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller sources = ['_ctypes/_ctypes.c', 1469cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller '_ctypes/callbacks.c', 1470cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller '_ctypes/callproc.c', 1471cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller '_ctypes/stgdict.c', 1472cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller '_ctypes/cfield.c', 1473eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller '_ctypes/malloc_closure.c'] 1474cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller depends = ['_ctypes/ctypes.h'] 1475cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller 1476cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller if sys.platform == 'darwin': 1477cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller sources.append('_ctypes/darwin/dlfcn_simple.c') 1478cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller include_dirs.append('_ctypes/darwin') 1479cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller# XXX Is this still needed? 1480cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller## extra_link_args.extend(['-read_only_relocs', 'warning']) 1481cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller 14821798489547a259876c495280dcd5d649269967f3Thomas Heller elif sys.platform == 'sunos5': 148373f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # XXX This shouldn't be necessary; it appears that some 148473f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # of the assembler code is non-PIC (i.e. it has relocations 148573f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # when it shouldn't. The proper fix would be to rewrite 148673f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # the assembler code to be PIC. 148773f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # This only works with GCC; the Sun compiler likely refuses 148873f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # this option. If you want to compile ctypes with the Sun 148973f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # compiler, please research a proper solution, instead of 149073f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis # finding some -z option for the Sun compiler. 14911798489547a259876c495280dcd5d649269967f3Thomas Heller extra_link_args.append('-mimpure-text') 14921798489547a259876c495280dcd5d649269967f3Thomas Heller 1493cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller ext = Extension('_ctypes', 1494cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller include_dirs=include_dirs, 1495cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller extra_compile_args=extra_compile_args, 14961798489547a259876c495280dcd5d649269967f3Thomas Heller extra_link_args=extra_link_args, 14979176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis libraries=[], 1498cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller sources=sources, 1499cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller depends=depends) 1500cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller ext_test = Extension('_ctypes_test', 1501cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller sources=['_ctypes/_ctypes_test.c']) 1502cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller self.extensions.extend([ext, ext_test]) 1503cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller 15049176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): 15059176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis return 15069176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 15079176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_inc = find_file('ffi.h', [], inc_dirs) 15089176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if ffi_inc is not None: 15099176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_h = ffi_inc[0] + '/ffi.h' 15109176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis fp = open(ffi_h) 15119176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis while 1: 15129176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis line = fp.readline() 15139176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if not line: 15149176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_inc = None 15159176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis break 15169176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if line.startswith('#define LIBFFI_H'): 15179176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis break 15189176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_lib = None 15199176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if ffi_inc is not None: 15209176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): 15219176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if (self.compiler.find_library_file(lib_dirs, lib_name)): 15229176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ffi_lib = lib_name 15239176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis break 15249176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 15259176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis if ffi_inc and ffi_lib: 15269176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ext.include_dirs.extend(ffi_inc) 15279176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis ext.libraries.append(ffi_lib) 15289176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis self.use_system_libffi = True 15299176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 15309176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis 1531f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchlingclass PyBuildInstall(install): 1532f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling # Suppress the warning about installation into the lib_dynload 1533f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling # directory, which is not in sys.path when running Python during 1534f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling # installation: 1535f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling def initialize_options (self): 1536f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling install.initialize_options(self) 1537f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling self.warn_dir=0 15385b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson 1539529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonclass PyBuildInstallLib(install_lib): 1540529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson # Do exactly what install_lib does but make sure correct access modes get 1541529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson # set on installed directories and files. All installed files with get 1542529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson # mode 644 unless they are a shared library in which case they will get 1543529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson # mode 755. All installed directories will get mode 755. 1544529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1545529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson so_ext = sysconfig.get_config_var("SO") 1546529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1547529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson def install(self): 1548529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson outfiles = install_lib.install(self) 1549529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson self.set_file_modes(outfiles, 0644, 0755) 1550529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson self.set_dir_modes(self.install_dir, 0755) 1551529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson return outfiles 1552529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1553529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson def set_file_modes(self, files, defaultMode, sharedLibMode): 1554529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if not self.is_chmod_supported(): return 1555529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if not files: return 1556529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1557529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson for filename in files: 1558529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if os.path.islink(filename): continue 1559529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson mode = defaultMode 1560529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if filename.endswith(self.so_ext): mode = sharedLibMode 1561529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson log.info("changing mode of %s to %o", filename, mode) 1562529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if not self.dry_run: os.chmod(filename, mode) 1563529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1564529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson def set_dir_modes(self, dirname, mode): 1565529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if not self.is_chmod_supported(): return 1566529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson os.path.walk(dirname, self.set_dir_modes_visitor, mode) 1567529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1568529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson def set_dir_modes_visitor(self, mode, dirname, names): 1569529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if os.path.islink(dirname): return 1570529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson log.info("changing mode of %s to %o", dirname, mode) 1571529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson if not self.dry_run: os.chmod(dirname, mode) 1572529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 1573529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson def is_chmod_supported(self): 1574529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson return hasattr(os, 'chmod') 1575529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 157614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumSUMMARY = """ 157714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumPython is an interpreted, interactive, object-oriented programming 157814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlanguage. It is often compared to Tcl, Perl, Scheme or Java. 157914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum 158014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumPython combines remarkable power with very clear syntax. It has 158114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossummodules, classes, exceptions, very high level dynamic data types, and 158214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumdynamic typing. There are interfaces to many system calls and 158314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlibraries, as well as to various windowing systems (X11, Motif, Tk, 158414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumMac, MFC). New built-in modules are easily written in C or C++. Python 158514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumis also usable as an extension language for applications that need a 158614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumprogrammable interface. 158714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum 158814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumThe Python implementation is portable: it runs on many brands of UNIX, 158914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumon Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't 159014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlisted here, it may still be supported, if there's a C compiler for 159114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumit. Ask around on comp.lang.python -- or just try compiling Python 159214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumyourself. 159314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum""" 159414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum 159514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumCLASSIFIERS = """ 159614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumDevelopment Status :: 3 - Alpha 159714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumDevelopment Status :: 6 - Mature 159814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumLicense :: OSI Approved :: Python Software Foundation License 159914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumNatural Language :: English 160014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumProgramming Language :: C 160114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumProgramming Language :: Python 160214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumTopic :: Software Development 160314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum""" 160414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum 160500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdef main(): 160662686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling # turn off warnings when deprecated modules are imported 160762686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling import warnings 160862686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling warnings.filterwarnings("ignore",category=DeprecationWarning) 160914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum setup(# PyPI Metadata (PEP 301) 161014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum name = "Python", 161114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum version = sys.version.split()[0], 161214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum url = "http://www.python.org/%s" % sys.version[:3], 161314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum maintainer = "Guido van Rossum and the Python community", 161414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum maintainer_email = "python-dev@python.org", 161514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum description = "A high-level object-oriented programming language", 161614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum long_description = SUMMARY.strip(), 161714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum license = "PSF license", 161814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum classifiers = filter(None, CLASSIFIERS.split("\n")), 161914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum platforms = ["Many"], 162014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum 162114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum # Build info 1622529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall, 1623529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson 'install_lib':PyBuildInstallLib}, 162400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # The struct module is defined here, because build_ext won't be 162500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling # called unless there's at least one extension module defined. 16267ccc95a315315568dd0660b5fb915f9e2e38f9daBob Ippolito ext_modules=[Extension('_struct', ['_struct.c'])], 1627aece4270b1de4777eef3f2aadd7aaf3ac9b69ceeAndrew M. Kuchling 1628aece4270b1de4777eef3f2aadd7aaf3ac9b69ceeAndrew M. Kuchling # Scripts to install 1629852f79993f8d04f00f54a94e7275550a72454f5fSkip Montanaro scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle', 1630852f79993f8d04f00f54a94e7275550a72454f5fSkip Montanaro 'Lib/smtpd.py'] 163100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling ) 1632ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh 163300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling# --install-platlib 163400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingif __name__ == '__main__': 163500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling main() 1636