| Andrew M. Kuchling | 66012fe | 2001-01-26 21:56:58 +0000 | [diff] [blame] | 1 | # Autodetecting setup.py script for building the Python extensions | 
 | 2 | # | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 3 |  | 
| Andrew M. Kuchling | 66012fe | 2001-01-26 21:56:58 +0000 | [diff] [blame] | 4 | __version__ = "$Revision$" | 
 | 5 |  | 
| Brett Cannon | 84667c0 | 2004-12-07 03:25:18 +0000 | [diff] [blame] | 6 | import sys, os, imp, re, optparse | 
| Christian Heimes | 8608d91 | 2008-01-25 15:52:11 +0000 | [diff] [blame] | 7 | from glob import glob | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 8 | from platform import machine as platform_machine | 
| Michael W. Hudson | 529a505 | 2002-12-17 16:47:17 +0000 | [diff] [blame] | 9 |  | 
 | 10 | from distutils import log | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 11 | from distutils import sysconfig | 
| Andrew M. Kuchling | 8d7f086 | 2001-02-23 16:32:32 +0000 | [diff] [blame] | 12 | from distutils import text_file | 
| Marc-André Lemburg | 7c6fcda | 2001-01-26 18:03:24 +0000 | [diff] [blame] | 13 | from distutils.errors import * | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 14 | from distutils.core import Extension, setup | 
 | 15 | from distutils.command.build_ext import build_ext | 
| Andrew M. Kuchling | f52d27e | 2001-05-21 20:29:27 +0000 | [diff] [blame] | 16 | from distutils.command.install import install | 
| Michael W. Hudson | 529a505 | 2002-12-17 16:47:17 +0000 | [diff] [blame] | 17 | from distutils.command.install_lib import install_lib | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 18 |  | 
 | 19 | # This global variable is used to hold the list of modules to be disabled. | 
 | 20 | disabled_module_list = [] | 
 | 21 |  | 
| Michael W. Hudson | 39230b3 | 2002-01-16 15:26:48 +0000 | [diff] [blame] | 22 | def add_dir_to_list(dirlist, dir): | 
 | 23 |     """Add the directory 'dir' to the list 'dirlist' (at the front) if | 
 | 24 |     1) 'dir' is not already in 'dirlist' | 
 | 25 |     2) 'dir' actually exists, and is a directory.""" | 
| Jack Jansen | 4439b7c | 2002-06-26 15:44:30 +0000 | [diff] [blame] | 26 |     if dir is not None and os.path.isdir(dir) and dir not in dirlist: | 
| Michael W. Hudson | 39230b3 | 2002-01-16 15:26:48 +0000 | [diff] [blame] | 27 |         dirlist.insert(0, dir) | 
 | 28 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 29 | def find_file(filename, std_dirs, paths): | 
 | 30 |     """Searches for the directory where a given file is located, | 
 | 31 |     and returns a possibly-empty list of additional directories, or None | 
 | 32 |     if the file couldn't be found at all. | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 33 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 34 |     'filename' is the name of a file, such as readline.h or libcrypto.a. | 
 | 35 |     'std_dirs' is the list of standard system directories; if the | 
 | 36 |         file is found in one of them, no additional directives are needed. | 
 | 37 |     'paths' is a list of additional locations to check; if the file is | 
 | 38 |         found in one of them, the resulting list will contain the directory. | 
 | 39 |     """ | 
 | 40 |  | 
 | 41 |     # Check the standard locations | 
 | 42 |     for dir in std_dirs: | 
 | 43 |         f = os.path.join(dir, filename) | 
 | 44 |         if os.path.exists(f): return [] | 
 | 45 |  | 
 | 46 |     # Check the additional directories | 
 | 47 |     for dir in paths: | 
 | 48 |         f = os.path.join(dir, filename) | 
 | 49 |         if os.path.exists(f): | 
 | 50 |             return [dir] | 
 | 51 |  | 
 | 52 |     # Not found anywhere | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 53 |     return None | 
 | 54 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 55 | def find_library_file(compiler, libname, std_dirs, paths): | 
| Andrew M. Kuchling | a246d9f | 2002-11-27 13:43:46 +0000 | [diff] [blame] | 56 |     result = compiler.find_library_file(std_dirs + paths, libname) | 
 | 57 |     if result is None: | 
 | 58 |         return None | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 59 |  | 
| Andrew M. Kuchling | a246d9f | 2002-11-27 13:43:46 +0000 | [diff] [blame] | 60 |     # Check whether the found file is in one of the standard directories | 
 | 61 |     dirname = os.path.dirname(result) | 
 | 62 |     for p in std_dirs: | 
 | 63 |         # Ensure path doesn't end with path separator | 
| Skip Montanaro | 9f5178a | 2003-05-06 20:59:57 +0000 | [diff] [blame] | 64 |         p = p.rstrip(os.sep) | 
| Andrew M. Kuchling | a246d9f | 2002-11-27 13:43:46 +0000 | [diff] [blame] | 65 |         if p == dirname: | 
 | 66 |             return [ ] | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 67 |  | 
| Andrew M. Kuchling | a246d9f | 2002-11-27 13:43:46 +0000 | [diff] [blame] | 68 |     # Otherwise, it must have been in one of the additional directories, | 
 | 69 |     # so we have to figure out which one. | 
 | 70 |     for p in paths: | 
 | 71 |         # Ensure path doesn't end with path separator | 
| Skip Montanaro | 9f5178a | 2003-05-06 20:59:57 +0000 | [diff] [blame] | 72 |         p = p.rstrip(os.sep) | 
| Andrew M. Kuchling | a246d9f | 2002-11-27 13:43:46 +0000 | [diff] [blame] | 73 |         if p == dirname: | 
 | 74 |             return [p] | 
 | 75 |     else: | 
 | 76 |         assert False, "Internal error: Path not found in std_dirs or paths" | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 77 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 78 | def module_enabled(extlist, modname): | 
 | 79 |     """Returns whether the module 'modname' is present in the list | 
 | 80 |     of extensions 'extlist'.""" | 
 | 81 |     extlist = [ext for ext in extlist if ext.name == modname] | 
 | 82 |     return len(extlist) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 83 |  | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 84 | def find_module_file(module, dirlist): | 
 | 85 |     """Find a module in a set of possible folders. If it is not found | 
 | 86 |     return the unadorned filename""" | 
 | 87 |     list = find_file(module, [], dirlist) | 
 | 88 |     if not list: | 
 | 89 |         return module | 
 | 90 |     if len(list) > 1: | 
| Guido van Rossum | 12471d6 | 2003-02-20 02:11:43 +0000 | [diff] [blame] | 91 |         log.info("WARNING: multiple copies of %s found"%module) | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 92 |     return os.path.join(list[0], module) | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 93 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 94 | class PyBuildExt(build_ext): | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 95 |  | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 96 |     def __init__(self, dist): | 
 | 97 |         build_ext.__init__(self, dist) | 
 | 98 |         self.failed = [] | 
 | 99 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 100 |     def build_extensions(self): | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 101 |  | 
 | 102 |         # Detect which modules should be compiled | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 103 |         missing = self.detect_modules() | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 104 |  | 
 | 105 |         # Remove modules that are present on the disabled list | 
| Christian Heimes | b222bbc | 2008-01-18 09:51:43 +0000 | [diff] [blame] | 106 |         extensions = [ext for ext in self.extensions | 
 | 107 |                       if ext.name not in disabled_module_list] | 
 | 108 |         # move ctypes to the end, it depends on other modules | 
 | 109 |         ext_map = dict((ext.name, i) for i, ext in enumerate(extensions)) | 
 | 110 |         if "_ctypes" in ext_map: | 
 | 111 |             ctypes = extensions.pop(ext_map["_ctypes"]) | 
 | 112 |             extensions.append(ctypes) | 
 | 113 |         self.extensions = extensions | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 114 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 115 |         # Fix up the autodetected modules, prefixing all the source files | 
 | 116 |         # with Modules/ and adding Python's include directory to the path. | 
 | 117 |         (srcdir,) = sysconfig.get_config_vars('srcdir') | 
| Guido van Rossum | e0fea6c | 2002-10-14 20:48:09 +0000 | [diff] [blame] | 118 |         if not srcdir: | 
 | 119 |             # Maybe running on Windows but not using CYGWIN? | 
 | 120 |             raise ValueError("No source directory; cannot proceed.") | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 121 |  | 
| Neil Schemenauer | 726b78e | 2001-01-24 17:18:21 +0000 | [diff] [blame] | 122 |         # Figure out the location of the source code for extension modules | 
| Thomas Wouters | 2fab8f1 | 2008-04-05 23:39:15 +0000 | [diff] [blame] | 123 |         # (This logic is copied in distutils.test.test_sysconfig, | 
 | 124 |         # so building in a separate directory does not break test_distutils.) | 
| Neil Schemenauer | 726b78e | 2001-01-24 17:18:21 +0000 | [diff] [blame] | 125 |         moddir = os.path.join(os.getcwd(), srcdir, 'Modules') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 126 |         moddir = os.path.normpath(moddir) | 
 | 127 |         srcdir, tail = os.path.split(moddir) | 
 | 128 |         srcdir = os.path.normpath(srcdir) | 
 | 129 |         moddir = os.path.normpath(moddir) | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 130 |  | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 131 |         moddirlist = [moddir] | 
 | 132 |         incdirlist = ['./Include'] | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 133 |  | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 134 |         # Platform-dependent module source and include directories | 
 | 135 |         platform = self.get_platform() | 
| Tim Peters | 66cb018 | 2004-08-26 05:23:19 +0000 | [diff] [blame] | 136 |         if platform in ('darwin', 'mac') and ("--disable-toolbox-glue" not in | 
| Brett Cannon | cc8a4f6 | 2004-08-26 01:44:07 +0000 | [diff] [blame] | 137 |             sysconfig.get_config_var("CONFIG_ARGS")): | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 138 |             # Mac OS X also includes some mac-specific modules | 
 | 139 |             macmoddir = os.path.join(os.getcwd(), srcdir, 'Mac/Modules') | 
 | 140 |             moddirlist.append(macmoddir) | 
 | 141 |             incdirlist.append('./Mac/Include') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 142 |  | 
| Jeremy Hylton | 340043e | 2002-06-13 17:38:11 +0000 | [diff] [blame] | 143 |         alldirlist = moddirlist + incdirlist | 
 | 144 |  | 
| Andrew M. Kuchling | 3da989c | 2001-02-28 22:49:26 +0000 | [diff] [blame] | 145 |         # Fix up the paths for scripts, too | 
 | 146 |         self.distribution.scripts = [os.path.join(srcdir, filename) | 
 | 147 |                                      for filename in self.distribution.scripts] | 
 | 148 |  | 
| Christian Heimes | 8608d91 | 2008-01-25 15:52:11 +0000 | [diff] [blame] | 149 |         # Python header files | 
 | 150 |         headers = glob("Include/*.h") + ["pyconfig.h"] | 
 | 151 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 152 |         for ext in self.extensions[:]: | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 153 |             ext.sources = [ find_module_file(filename, moddirlist) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 154 |                             for filename in ext.sources ] | 
| Jeremy Hylton | 340043e | 2002-06-13 17:38:11 +0000 | [diff] [blame] | 155 |             if ext.depends is not None: | 
 | 156 |                 ext.depends = [find_module_file(filename, alldirlist) | 
 | 157 |                                for filename in ext.depends] | 
| Christian Heimes | 8608d91 | 2008-01-25 15:52:11 +0000 | [diff] [blame] | 158 |             else: | 
 | 159 |                 ext.depends = [] | 
 | 160 |             # re-compile extensions if a header file has been changed | 
 | 161 |             ext.depends.extend(headers) | 
 | 162 |  | 
| Jack Jansen | 144ebcc | 2001-08-05 22:31:19 +0000 | [diff] [blame] | 163 |             ext.include_dirs.append( '.' ) # to get config.h | 
 | 164 |             for incdir in incdirlist: | 
 | 165 |                 ext.include_dirs.append( os.path.join(srcdir, incdir) ) | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 166 |  | 
| Andrew M. Kuchling | e7c8732 | 2001-01-19 16:58:21 +0000 | [diff] [blame] | 167 |             # If a module has already been built statically, | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 168 |             # don't build it here | 
| Andrew M. Kuchling | e7c8732 | 2001-01-19 16:58:21 +0000 | [diff] [blame] | 169 |             if ext.name in sys.builtin_module_names: | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 170 |                 self.extensions.remove(ext) | 
| Andrew M. Kuchling | 5bbc7b9 | 2001-01-18 20:39:34 +0000 | [diff] [blame] | 171 |  | 
| Jack Jansen | 4439b7c | 2002-06-26 15:44:30 +0000 | [diff] [blame] | 172 |         if platform != 'mac': | 
| Georg Brandl | e08fa29 | 2005-12-27 18:24:27 +0000 | [diff] [blame] | 173 |             # Parse Modules/Setup and Modules/Setup.local to figure out which | 
 | 174 |             # modules are turned on in the file. | 
| Jack Jansen | 4439b7c | 2002-06-26 15:44:30 +0000 | [diff] [blame] | 175 |             remove_modules = [] | 
| Georg Brandl | e08fa29 | 2005-12-27 18:24:27 +0000 | [diff] [blame] | 176 |             for filename in ('Modules/Setup', 'Modules/Setup.local'): | 
 | 177 |                 input = text_file.TextFile(filename, join_lines=1) | 
 | 178 |                 while 1: | 
 | 179 |                     line = input.readline() | 
 | 180 |                     if not line: break | 
 | 181 |                     line = line.split() | 
 | 182 |                     remove_modules.append(line[0]) | 
 | 183 |                 input.close() | 
| Tim Peters | 1b27f86 | 2005-12-30 18:42:42 +0000 | [diff] [blame] | 184 |  | 
| Jack Jansen | 4439b7c | 2002-06-26 15:44:30 +0000 | [diff] [blame] | 185 |             for ext in self.extensions[:]: | 
 | 186 |                 if ext.name in remove_modules: | 
 | 187 |                     self.extensions.remove(ext) | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 188 |  | 
| Andrew M. Kuchling | 5bbc7b9 | 2001-01-18 20:39:34 +0000 | [diff] [blame] | 189 |         # When you run "make CC=altcc" or something similar, you really want | 
 | 190 |         # those environment variables passed into the setup.py phase.  Here's | 
 | 191 |         # a small set of useful ones. | 
 | 192 |         compiler = os.environ.get('CC') | 
| Andrew M. Kuchling | 5bbc7b9 | 2001-01-18 20:39:34 +0000 | [diff] [blame] | 193 |         args = {} | 
 | 194 |         # unfortunately, distutils doesn't let us provide separate C and C++ | 
 | 195 |         # compilers | 
 | 196 |         if compiler is not None: | 
| Martin v. Löwis | d7c795e | 2005-04-25 07:14:03 +0000 | [diff] [blame] | 197 |             (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS') | 
 | 198 |             args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags | 
| Andrew M. Kuchling | 5bbc7b9 | 2001-01-18 20:39:34 +0000 | [diff] [blame] | 199 |         self.compiler.set_executables(**args) | 
 | 200 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 201 |         build_ext.build_extensions(self) | 
 | 202 |  | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 203 |         longest = max([len(e.name) for e in self.extensions]) | 
 | 204 |         if self.failed: | 
 | 205 |             longest = max(longest, max([len(name) for name in self.failed])) | 
 | 206 |  | 
 | 207 |         def print_three_column(lst): | 
| Georg Brandl | e95cf1c | 2007-03-06 17:49:14 +0000 | [diff] [blame] | 208 |             lst.sort(key=str.lower) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 209 |             # guarantee zip() doesn't drop anything | 
 | 210 |             while len(lst) % 3: | 
 | 211 |                 lst.append("") | 
 | 212 |             for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]): | 
 | 213 |                 print "%-*s   %-*s   %-*s" % (longest, e, longest, f, | 
 | 214 |                                               longest, g) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 215 |  | 
 | 216 |         if missing: | 
 | 217 |             print | 
 | 218 |             print "Failed to find the necessary bits to build these modules:" | 
 | 219 |             print_three_column(missing) | 
| Jeffrey Yasskin | 8799756 | 2007-08-22 23:14:27 +0000 | [diff] [blame] | 220 |             print ("To find the necessary bits, look in setup.py in" | 
 | 221 |                    " detect_modules() for the module's name.") | 
 | 222 |             print | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 223 |  | 
 | 224 |         if self.failed: | 
 | 225 |             failed = self.failed[:] | 
 | 226 |             print | 
 | 227 |             print "Failed to build these modules:" | 
 | 228 |             print_three_column(failed) | 
| Jeffrey Yasskin | 8799756 | 2007-08-22 23:14:27 +0000 | [diff] [blame] | 229 |             print | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 230 |  | 
| Marc-André Lemburg | 7c6fcda | 2001-01-26 18:03:24 +0000 | [diff] [blame] | 231 |     def build_extension(self, ext): | 
 | 232 |  | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 233 |         if ext.name == '_ctypes': | 
| Thomas Heller | 795246c | 2006-04-07 19:27:56 +0000 | [diff] [blame] | 234 |             if not self.configure_ctypes(ext): | 
 | 235 |                 return | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 236 |  | 
| Marc-André Lemburg | 7c6fcda | 2001-01-26 18:03:24 +0000 | [diff] [blame] | 237 |         try: | 
 | 238 |             build_ext.build_extension(self, ext) | 
 | 239 |         except (CCompilerError, DistutilsError), why: | 
 | 240 |             self.announce('WARNING: building of extension "%s" failed: %s' % | 
 | 241 |                           (ext.name, sys.exc_info()[1])) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 242 |             self.failed.append(ext.name) | 
| Andrew M. Kuchling | 6268669 | 2001-05-21 20:48:09 +0000 | [diff] [blame] | 243 |             return | 
| Jack Jansen | f49c6f9 | 2001-11-01 14:44:15 +0000 | [diff] [blame] | 244 |         # Workaround for Mac OS X: The Carbon-based modules cannot be | 
 | 245 |         # reliably imported into a command-line Python | 
 | 246 |         if 'Carbon' in ext.extra_link_args: | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 247 |             self.announce( | 
 | 248 |                 'WARNING: skipping import check for Carbon-based "%s"' % | 
 | 249 |                 ext.name) | 
 | 250 |             return | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 251 |  | 
 | 252 |         if self.get_platform() == 'darwin' and ( | 
 | 253 |                 sys.maxint > 2**32 and '-arch' in ext.extra_link_args): | 
 | 254 |             # Don't bother doing an import check when an extension was | 
 | 255 |             # build with an explicit '-arch' flag on OSX. That's currently | 
 | 256 |             # only used to build 32-bit only extensions in a 4-way | 
 | 257 |             # universal build and loading 32-bit code into a 64-bit | 
 | 258 |             # process will fail. | 
 | 259 |             self.announce( | 
 | 260 |                 'WARNING: skipping import check for "%s"' % | 
 | 261 |                 ext.name) | 
 | 262 |             return | 
 | 263 |  | 
| Jason Tishler | 24cf776 | 2002-05-22 16:46:15 +0000 | [diff] [blame] | 264 |         # Workaround for Cygwin: Cygwin currently has fork issues when many | 
 | 265 |         # modules have been imported | 
 | 266 |         if self.get_platform() == 'cygwin': | 
 | 267 |             self.announce('WARNING: skipping import check for Cygwin-based "%s"' | 
 | 268 |                 % ext.name) | 
 | 269 |             return | 
| Michael W. Hudson | af14289 | 2002-01-23 15:07:46 +0000 | [diff] [blame] | 270 |         ext_filename = os.path.join( | 
 | 271 |             self.build_lib, | 
 | 272 |             self.get_ext_filename(self.get_ext_fullname(ext.name))) | 
| Andrew M. Kuchling | 6268669 | 2001-05-21 20:48:09 +0000 | [diff] [blame] | 273 |         try: | 
| Michael W. Hudson | af14289 | 2002-01-23 15:07:46 +0000 | [diff] [blame] | 274 |             imp.load_dynamic(ext.name, ext_filename) | 
| Neal Norwitz | 6e2d1c7 | 2003-02-28 17:39:42 +0000 | [diff] [blame] | 275 |         except ImportError, why: | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 276 |             self.failed.append(ext.name) | 
| Neal Norwitz | 6e2d1c7 | 2003-02-28 17:39:42 +0000 | [diff] [blame] | 277 |             self.announce('*** WARNING: renaming "%s" since importing it' | 
 | 278 |                           ' failed: %s' % (ext.name, why), level=3) | 
 | 279 |             assert not self.inplace | 
 | 280 |             basename, tail = os.path.splitext(ext_filename) | 
 | 281 |             newname = basename + "_failed" + tail | 
 | 282 |             if os.path.exists(newname): | 
 | 283 |                 os.remove(newname) | 
 | 284 |             os.rename(ext_filename, newname) | 
 | 285 |  | 
 | 286 |             # XXX -- This relies on a Vile HACK in | 
 | 287 |             # distutils.command.build_ext.build_extension().  The | 
 | 288 |             # _built_objects attribute is stored there strictly for | 
 | 289 |             # use here. | 
 | 290 |             # If there is a failure, _built_objects may not be there, | 
 | 291 |             # so catch the AttributeError and move on. | 
 | 292 |             try: | 
 | 293 |                 for filename in self._built_objects: | 
 | 294 |                     os.remove(filename) | 
 | 295 |             except AttributeError: | 
 | 296 |                 self.announce('unable to remove files (ignored)') | 
| Neal Norwitz | 3f5fcc8 | 2003-02-28 17:21:39 +0000 | [diff] [blame] | 297 |         except: | 
| Neal Norwitz | 3f5fcc8 | 2003-02-28 17:21:39 +0000 | [diff] [blame] | 298 |             exc_type, why, tb = sys.exc_info() | 
| Neal Norwitz | 6e2d1c7 | 2003-02-28 17:39:42 +0000 | [diff] [blame] | 299 |             self.announce('*** WARNING: importing extension "%s" ' | 
 | 300 |                           'failed with %s: %s' % (ext.name, exc_type, why), | 
 | 301 |                           level=3) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 302 |             self.failed.append(ext.name) | 
| Fred Drake | 9028d0a | 2001-12-06 22:59:54 +0000 | [diff] [blame] | 303 |  | 
| Neal Norwitz | 51dead7 | 2003-06-17 02:51:28 +0000 | [diff] [blame] | 304 |     def get_platform(self): | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 305 |         # Get value of sys.platform | 
| Neal Norwitz | 51dead7 | 2003-06-17 02:51:28 +0000 | [diff] [blame] | 306 |         for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']: | 
 | 307 |             if sys.platform.startswith(platform): | 
 | 308 |                 return platform | 
 | 309 |         return sys.platform | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 310 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 311 |     def detect_modules(self): | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 312 |         # Ensure that /usr/local is always used | 
| Michael W. Hudson | 39230b3 | 2002-01-16 15:26:48 +0000 | [diff] [blame] | 313 |         add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib') | 
 | 314 |         add_dir_to_list(self.compiler.include_dirs, '/usr/local/include') | 
 | 315 |  | 
| Brett Cannon | 516592f | 2004-12-07 00:42:59 +0000 | [diff] [blame] | 316 |         # Add paths specified in the environment variables LDFLAGS and | 
| Brett Cannon | 4810eb9 | 2004-12-31 08:11:21 +0000 | [diff] [blame] | 317 |         # CPPFLAGS for header and library files. | 
| Brett Cannon | 5399c6d | 2004-12-18 20:48:09 +0000 | [diff] [blame] | 318 |         # We must get the values from the Makefile and not the environment | 
 | 319 |         # directly since an inconsistently reproducible issue comes up where | 
 | 320 |         # the environment variable is not set even though the value were passed | 
| Brett Cannon | 4810eb9 | 2004-12-31 08:11:21 +0000 | [diff] [blame] | 321 |         # into configure and stored in the Makefile (issue found on OS X 10.3). | 
| Brett Cannon | 516592f | 2004-12-07 00:42:59 +0000 | [diff] [blame] | 322 |         for env_var, arg_name, dir_list in ( | 
| Skip Montanaro | 593e66f | 2008-10-07 02:04:16 +0000 | [diff] [blame] | 323 |                 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs), | 
| Brett Cannon | 516592f | 2004-12-07 00:42:59 +0000 | [diff] [blame] | 324 |                 ('LDFLAGS', '-L', self.compiler.library_dirs), | 
 | 325 |                 ('CPPFLAGS', '-I', self.compiler.include_dirs)): | 
| Brett Cannon | 5399c6d | 2004-12-18 20:48:09 +0000 | [diff] [blame] | 326 |             env_val = sysconfig.get_config_var(env_var) | 
| Brett Cannon | 516592f | 2004-12-07 00:42:59 +0000 | [diff] [blame] | 327 |             if env_val: | 
| Brett Cannon | 4810eb9 | 2004-12-31 08:11:21 +0000 | [diff] [blame] | 328 |                 # To prevent optparse from raising an exception about any | 
| Skip Montanaro | 593e66f | 2008-10-07 02:04:16 +0000 | [diff] [blame] | 329 |                 # options in env_val that it doesn't know about we strip out | 
| Brett Cannon | 4810eb9 | 2004-12-31 08:11:21 +0000 | [diff] [blame] | 330 |                 # all double dashes and any dashes followed by a character | 
 | 331 |                 # that is not for the option we are dealing with. | 
 | 332 |                 # | 
 | 333 |                 # Please note that order of the regex is important!  We must | 
 | 334 |                 # strip out double-dashes first so that we don't end up with | 
 | 335 |                 # substituting "--Long" to "-Long" and thus lead to "ong" being | 
 | 336 |                 # used for a library directory. | 
| Georg Brandl | 915c87d | 2007-08-24 11:47:37 +0000 | [diff] [blame] | 337 |                 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1], | 
 | 338 |                                  ' ', env_val) | 
| Brett Cannon | 84667c0 | 2004-12-07 03:25:18 +0000 | [diff] [blame] | 339 |                 parser = optparse.OptionParser() | 
| Brett Cannon | 4810eb9 | 2004-12-31 08:11:21 +0000 | [diff] [blame] | 340 |                 # Make sure that allowing args interspersed with options is | 
 | 341 |                 # allowed | 
 | 342 |                 parser.allow_interspersed_args = True | 
 | 343 |                 parser.error = lambda msg: None | 
| Brett Cannon | 84667c0 | 2004-12-07 03:25:18 +0000 | [diff] [blame] | 344 |                 parser.add_option(arg_name, dest="dirs", action="append") | 
 | 345 |                 options = parser.parse_args(env_val.split())[0] | 
| Brett Cannon | 4483771 | 2005-01-02 21:54:07 +0000 | [diff] [blame] | 346 |                 if options.dirs: | 
| Brett Cannon | 861e396 | 2008-02-03 02:08:45 +0000 | [diff] [blame] | 347 |                     for directory in reversed(options.dirs): | 
| Brett Cannon | 4483771 | 2005-01-02 21:54:07 +0000 | [diff] [blame] | 348 |                         add_dir_to_list(dir_list, directory) | 
| Skip Montanaro | decc6a4 | 2003-01-01 20:07:49 +0000 | [diff] [blame] | 349 |  | 
| Michael W. Hudson | 90b8e4d | 2002-08-02 13:55:50 +0000 | [diff] [blame] | 350 |         if os.path.normpath(sys.prefix) != '/usr': | 
 | 351 |             add_dir_to_list(self.compiler.library_dirs, | 
 | 352 |                             sysconfig.get_config_var("LIBDIR")) | 
 | 353 |             add_dir_to_list(self.compiler.include_dirs, | 
 | 354 |                             sysconfig.get_config_var("INCLUDEDIR")) | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 355 |  | 
| Martin v. Löwis | 339d0f7 | 2001-08-17 18:39:25 +0000 | [diff] [blame] | 356 |         try: | 
 | 357 |             have_unicode = unicode | 
 | 358 |         except NameError: | 
 | 359 |             have_unicode = 0 | 
 | 360 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 361 |         # lib_dirs and inc_dirs are used to search for files; | 
 | 362 |         # if a file is found in one of those directories, it can | 
 | 363 |         # be assumed that no additional -I,-L directives are needed. | 
| Martin v. Löwis | fba7369 | 2004-11-13 11:13:35 +0000 | [diff] [blame] | 364 |         lib_dirs = self.compiler.library_dirs + [ | 
 | 365 |             '/lib64', '/usr/lib64', | 
 | 366 |             '/lib', '/usr/lib', | 
 | 367 |             ] | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 368 |         inc_dirs = self.compiler.include_dirs + ['/usr/include'] | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 369 |         exts = [] | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 370 |         missing = [] | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 371 |  | 
| Brett Cannon | 4454a1f | 2005-04-15 20:32:39 +0000 | [diff] [blame] | 372 |         config_h = sysconfig.get_config_h_filename() | 
 | 373 |         config_h_vars = sysconfig.parse_config_h(open(config_h)) | 
 | 374 |  | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 375 |         platform = self.get_platform() | 
| Martin v. Löwis | 8301256 | 2002-02-14 01:25:37 +0000 | [diff] [blame] | 376 |         (srcdir,) = sysconfig.get_config_vars('srcdir') | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 377 |  | 
| Martin v. Löwis | f90ae20 | 2002-06-11 06:22:31 +0000 | [diff] [blame] | 378 |         # Check for AtheOS which has libraries in non-standard locations | 
 | 379 |         if platform == 'atheos': | 
 | 380 |             lib_dirs += ['/system/libs', '/atheos/autolnk/lib'] | 
 | 381 |             lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep) | 
 | 382 |             inc_dirs += ['/system/include', '/atheos/autolnk/include'] | 
 | 383 |             inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep) | 
 | 384 |  | 
| Andrew M. Kuchling | 7883dc8 | 2003-10-24 18:26:26 +0000 | [diff] [blame] | 385 |         # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb) | 
 | 386 |         if platform in ['osf1', 'unixware7', 'openunix8']: | 
| Skip Montanaro | 22e00c4 | 2003-05-06 20:43:34 +0000 | [diff] [blame] | 387 |             lib_dirs += ['/usr/ccs/lib'] | 
 | 388 |  | 
| Ronald Oussoren | 39be38c | 2006-05-26 11:38:39 +0000 | [diff] [blame] | 389 |         if platform == 'darwin': | 
 | 390 |             # This should work on any unixy platform ;-) | 
 | 391 |             # If the user has bothered specifying additional -I and -L flags | 
 | 392 |             # in OPT and LDFLAGS we might as well use them here. | 
 | 393 |             #   NOTE: using shlex.split would technically be more correct, but | 
 | 394 |             # also gives a bootstrap problem. Let's hope nobody uses directories | 
 | 395 |             # with whitespace in the name to store libraries. | 
 | 396 |             cflags, ldflags = sysconfig.get_config_vars( | 
 | 397 |                     'CFLAGS', 'LDFLAGS') | 
 | 398 |             for item in cflags.split(): | 
 | 399 |                 if item.startswith('-I'): | 
 | 400 |                     inc_dirs.append(item[2:]) | 
 | 401 |  | 
 | 402 |             for item in ldflags.split(): | 
 | 403 |                 if item.startswith('-L'): | 
 | 404 |                     lib_dirs.append(item[2:]) | 
 | 405 |  | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 406 |         # Check for MacOS X, which doesn't need libm.a at all | 
 | 407 |         math_libs = ['m'] | 
| Jack Jansen | 4439b7c | 2002-06-26 15:44:30 +0000 | [diff] [blame] | 408 |         if platform in ['darwin', 'beos', 'mac']: | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 409 |             math_libs = [] | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 410 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 411 |         # XXX Omitted modules: gl, pure, dl, SGI-specific modules | 
 | 412 |  | 
 | 413 |         # | 
 | 414 |         # The following modules are all pretty straightforward, and compile | 
 | 415 |         # on pretty much any POSIXish platform. | 
 | 416 |         # | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 417 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 418 |         # Some modules that are normally always on: | 
| Fred Drake | 2de7471 | 2001-02-01 05:26:54 +0000 | [diff] [blame] | 419 |         exts.append( Extension('_weakref', ['_weakref.c']) ) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 420 |  | 
 | 421 |         # array objects | 
 | 422 |         exts.append( Extension('array', ['arraymodule.c']) ) | 
 | 423 |         # complex math library functions | 
| Andrew M. Kuchling | 5ddb25f | 2001-01-23 22:21:11 +0000 | [diff] [blame] | 424 |         exts.append( Extension('cmath', ['cmathmodule.c'], | 
 | 425 |                                libraries=math_libs) ) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 426 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 427 |         # math library functions, e.g. sin() | 
| Andrew M. Kuchling | 5ddb25f | 2001-01-23 22:21:11 +0000 | [diff] [blame] | 428 |         exts.append( Extension('math',  ['mathmodule.c'], | 
 | 429 |                                libraries=math_libs) ) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 430 |         # fast string operations implemented in C | 
 | 431 |         exts.append( Extension('strop', ['stropmodule.c']) ) | 
 | 432 |         # time operations and variables | 
| Andrew M. Kuchling | 5ddb25f | 2001-01-23 22:21:11 +0000 | [diff] [blame] | 433 |         exts.append( Extension('time', ['timemodule.c'], | 
 | 434 |                                libraries=math_libs) ) | 
| Brett Cannon | 057e720 | 2004-06-24 01:38:47 +0000 | [diff] [blame] | 435 |         exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'], | 
| Guido van Rossum | a29d508 | 2002-12-16 20:31:57 +0000 | [diff] [blame] | 436 |                                libraries=math_libs) ) | 
| Neal Norwitz | 0d2192b | 2008-03-23 06:13:25 +0000 | [diff] [blame] | 437 |         # fast iterator tools implemented in C | 
 | 438 |         exts.append( Extension("itertools", ["itertoolsmodule.c"]) ) | 
| Eric Smith | a73fbe7 | 2008-02-23 03:09:44 +0000 | [diff] [blame] | 439 |         # code that will be builtins in the future, but conflict with the | 
 | 440 |         #  current builtins | 
 | 441 |         exts.append( Extension('future_builtins', ['future_builtins.c']) ) | 
| Raymond Hettinger | 40f6217 | 2002-12-29 23:03:38 +0000 | [diff] [blame] | 442 |         # random number generator implemented in C | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 443 |         exts.append( Extension("_random", ["_randommodule.c"]) ) | 
| Raymond Hettinger | 756b3f3 | 2004-01-29 06:37:52 +0000 | [diff] [blame] | 444 |         # high-performance collections | 
| Raymond Hettinger | eb97988 | 2007-02-28 18:37:52 +0000 | [diff] [blame] | 445 |         exts.append( Extension("_collections", ["_collectionsmodule.c"]) ) | 
| Raymond Hettinger | 0c41027 | 2004-01-05 10:13:35 +0000 | [diff] [blame] | 446 |         # bisect | 
 | 447 |         exts.append( Extension("_bisect", ["_bisectmodule.c"]) ) | 
| Raymond Hettinger | b3af181 | 2003-11-08 10:24:38 +0000 | [diff] [blame] | 448 |         # heapq | 
| Raymond Hettinger | c46cb2a | 2004-04-19 19:06:21 +0000 | [diff] [blame] | 449 |         exts.append( Extension("_heapq", ["_heapqmodule.c"]) ) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 450 |         # operator.add() and similar goodies | 
 | 451 |         exts.append( Extension('operator', ['operator.c']) ) | 
| Christian Heimes | 7f39c9f | 2008-01-25 12:18:43 +0000 | [diff] [blame] | 452 |         # Python 3.0 _fileio module | 
 | 453 |         exts.append( Extension("_fileio", ["_fileio.c"]) ) | 
| Alexandre Vassalotti | 1aed624 | 2008-05-09 21:49:43 +0000 | [diff] [blame] | 454 |         # Python 3.0 _bytesio module | 
 | 455 |         exts.append( Extension("_bytesio", ["_bytesio.c"]) ) | 
| Nick Coghlan | c649ec5 | 2006-05-29 12:43:05 +0000 | [diff] [blame] | 456 |         # _functools | 
 | 457 |         exts.append( Extension("_functools", ["_functoolsmodule.c"]) ) | 
| Brett Cannon | 4b964f9 | 2008-05-05 20:21:38 +0000 | [diff] [blame] | 458 |         # _json speedups | 
 | 459 |         exts.append( Extension("_json", ["_json.c"]) ) | 
| Marc-André Lemburg | 261b8e2 | 2001-02-02 12:12:44 +0000 | [diff] [blame] | 460 |         # Python C API test module | 
| Mark Dickinson | 5e050d8 | 2009-02-10 16:23:27 +0000 | [diff] [blame] | 461 |         exts.append( Extension('_testcapi', ['_testcapimodule.c'], | 
 | 462 |                                depends=['testcapi_long.h']) ) | 
| Armin Rigo | a871ef2 | 2006-02-08 12:53:56 +0000 | [diff] [blame] | 463 |         # profilers (_lsprof is for cProfile.py) | 
 | 464 |         exts.append( Extension('_hotshot', ['_hotshot.c']) ) | 
 | 465 |         exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) ) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 466 |         # static Unicode character database | 
| Martin v. Löwis | 339d0f7 | 2001-08-17 18:39:25 +0000 | [diff] [blame] | 467 |         if have_unicode: | 
 | 468 |             exts.append( Extension('unicodedata', ['unicodedata.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 469 |         else: | 
 | 470 |             missing.append('unicodedata') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 471 |         # access to ISO C locale support | 
| Martin v. Löwis | 19d1734 | 2003-06-14 21:03:05 +0000 | [diff] [blame] | 472 |         data = open('pyconfig.h').read() | 
 | 473 |         m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data) | 
 | 474 |         if m is not None: | 
| Jason Tishler | d28216b | 2002-08-14 11:13:52 +0000 | [diff] [blame] | 475 |             locale_libs = ['intl'] | 
 | 476 |         else: | 
 | 477 |             locale_libs = [] | 
| Jack Jansen | 84b7447 | 2004-07-15 19:56:25 +0000 | [diff] [blame] | 478 |         if platform == 'darwin': | 
 | 479 |             locale_extra_link_args = ['-framework', 'CoreFoundation'] | 
 | 480 |         else: | 
 | 481 |             locale_extra_link_args = [] | 
| Tim Peters | e6ddc8b | 2004-07-18 05:56:09 +0000 | [diff] [blame] | 482 |  | 
| Jack Jansen | 84b7447 | 2004-07-15 19:56:25 +0000 | [diff] [blame] | 483 |  | 
| Jason Tishler | d28216b | 2002-08-14 11:13:52 +0000 | [diff] [blame] | 484 |         exts.append( Extension('_locale', ['_localemodule.c'], | 
| Jack Jansen | 84b7447 | 2004-07-15 19:56:25 +0000 | [diff] [blame] | 485 |                                libraries=locale_libs, | 
 | 486 |                                extra_link_args=locale_extra_link_args) ) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 487 |  | 
 | 488 |         # Modules with some UNIX dependencies -- on by default: | 
 | 489 |         # (If you have a really backward UNIX, select and socket may not be | 
 | 490 |         # supported...) | 
 | 491 |  | 
 | 492 |         # fcntl(2) and ioctl(2) | 
 | 493 |         exts.append( Extension('fcntl', ['fcntlmodule.c']) ) | 
| Jack Jansen | 73aa1ff | 2002-06-27 22:06:49 +0000 | [diff] [blame] | 494 |         if platform not in ['mac']: | 
| Brett Cannon | 46d9623 | 2005-02-16 00:07:19 +0000 | [diff] [blame] | 495 |             # pwd(3) | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 496 |             exts.append( Extension('pwd', ['pwdmodule.c']) ) | 
 | 497 |             # grp(3) | 
 | 498 |             exts.append( Extension('grp', ['grpmodule.c']) ) | 
| Martin v. Löwis | c300175 | 2005-01-23 09:27:24 +0000 | [diff] [blame] | 499 |             # spwd, shadow passwords | 
| Brett Cannon | 4454a1f | 2005-04-15 20:32:39 +0000 | [diff] [blame] | 500 |             if (config_h_vars.get('HAVE_GETSPNAM', False) or | 
 | 501 |                     config_h_vars.get('HAVE_GETSPENT', False)): | 
| Brett Cannon | 46d9623 | 2005-02-16 00:07:19 +0000 | [diff] [blame] | 502 |                 exts.append( Extension('spwd', ['spwdmodule.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 503 |             else: | 
 | 504 |                 missing.append('spwd') | 
 | 505 |         else: | 
 | 506 |             missing.extend(['pwd', 'grp', 'spwd']) | 
 | 507 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 508 |         # select(2); not on ancient System V | 
 | 509 |         exts.append( Extension('select', ['selectmodule.c']) ) | 
 | 510 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 511 |         # Fred Drake's interface to the Python parser | 
 | 512 |         exts.append( Extension('parser', ['parsermodule.c']) ) | 
 | 513 |  | 
| Guido van Rossum | 2e1c09c | 2002-04-04 17:52:50 +0000 | [diff] [blame] | 514 |         # cStringIO and cPickle | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 515 |         exts.append( Extension('cStringIO', ['cStringIO.c']) ) | 
 | 516 |         exts.append( Extension('cPickle', ['cPickle.c']) ) | 
 | 517 |  | 
 | 518 |         # Memory-mapped files (also works on Win32). | 
| Jack Jansen | 73aa1ff | 2002-06-27 22:06:49 +0000 | [diff] [blame] | 519 |         if platform not in ['atheos', 'mac']: | 
| Martin v. Löwis | f90ae20 | 2002-06-11 06:22:31 +0000 | [diff] [blame] | 520 |             exts.append( Extension('mmap', ['mmapmodule.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 521 |         else: | 
 | 522 |             missing.append('mmap') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 523 |  | 
| Andrew M. Kuchling | 57269d0 | 2004-08-31 13:37:25 +0000 | [diff] [blame] | 524 |         # Lance Ellinghaus's syslog module | 
| Jack Jansen | 73aa1ff | 2002-06-27 22:06:49 +0000 | [diff] [blame] | 525 |         if platform not in ['mac']: | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 526 |             # syslog daemon interface | 
 | 527 |             exts.append( Extension('syslog', ['syslogmodule.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 528 |         else: | 
 | 529 |             missing.append('syslog') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 530 |  | 
 | 531 |         # George Neville-Neil's timing module: | 
| Neal Norwitz | 6143c54 | 2006-03-03 00:48:46 +0000 | [diff] [blame] | 532 |         # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html | 
 | 533 |         # http://mail.python.org/pipermail/python-dev/2006-January/060023.html | 
 | 534 |         #exts.append( Extension('timing', ['timingmodule.c']) ) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 535 |  | 
 | 536 |         # | 
| Andrew M. Kuchling | 5bbc7b9 | 2001-01-18 20:39:34 +0000 | [diff] [blame] | 537 |         # Here ends the simple stuff.  From here on, modules need certain | 
 | 538 |         # libraries, are platform-specific, or present other surprises. | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 539 |         # | 
 | 540 |  | 
 | 541 |         # Multimedia modules | 
 | 542 |         # These don't work for 64-bit platforms!!! | 
 | 543 |         # These represent audio samples or images as strings: | 
 | 544 |  | 
| Neal Norwitz | 5e4a3b8 | 2004-07-19 16:55:07 +0000 | [diff] [blame] | 545 |         # Operations on audio samples | 
| Tim Peters | f9cbf21 | 2004-07-23 02:50:10 +0000 | [diff] [blame] | 546 |         # According to #993173, this one should actually work fine on | 
| Martin v. Löwis | 8fbefe2 | 2004-07-19 16:42:20 +0000 | [diff] [blame] | 547 |         # 64-bit platforms. | 
 | 548 |         exts.append( Extension('audioop', ['audioop.c']) ) | 
 | 549 |  | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 550 |         # Disabled on 64-bit platforms | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 551 |         if sys.maxint != 9223372036854775807L: | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 552 |             # Operations on images | 
 | 553 |             exts.append( Extension('imageop', ['imageop.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 554 |         else: | 
| Brett Cannon | dc48b74 | 2007-05-20 07:09:50 +0000 | [diff] [blame] | 555 |             missing.extend(['imageop']) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 556 |  | 
 | 557 |         # readline | 
| Jack Jansen | 81ae235 | 2006-02-23 15:02:23 +0000 | [diff] [blame] | 558 |         do_readline = self.compiler.find_library_file(lib_dirs, 'readline') | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 559 |         if platform == 'darwin': # and os.uname()[2] < '9.': | 
| Jack Jansen | 81ae235 | 2006-02-23 15:02:23 +0000 | [diff] [blame] | 560 |             # MacOSX 10.4 has a broken readline. Don't try to build | 
 | 561 |             # the readline module unless the user has installed a fixed | 
 | 562 |             # readline package | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 563 |             # FIXME: The readline emulation on 10.5 is better, but the | 
 | 564 |             # readline module doesn't compile out of the box. | 
| Martin v. Löwis | 2086eaf | 2006-02-27 15:16:21 +0000 | [diff] [blame] | 565 |             if find_file('readline/rlconf.h', inc_dirs, []) is None: | 
| Jack Jansen | 81ae235 | 2006-02-23 15:02:23 +0000 | [diff] [blame] | 566 |                 do_readline = False | 
 | 567 |         if do_readline: | 
| Ronald Oussoren | 39be38c | 2006-05-26 11:38:39 +0000 | [diff] [blame] | 568 |             if sys.platform == 'darwin': | 
 | 569 |                 # In every directory on the search path search for a dynamic | 
 | 570 |                 # library and then a static library, instead of first looking | 
 | 571 |                 # for dynamic libraries on the entiry path. | 
 | 572 |                 # This way a staticly linked custom readline gets picked up | 
 | 573 |                 # before the (broken) dynamic library in /usr/lib. | 
 | 574 |                 readline_extra_link_args = ('-Wl,-search_paths_first',) | 
 | 575 |             else: | 
 | 576 |                 readline_extra_link_args = () | 
 | 577 |  | 
| Marc-André Lemburg | 2efc323 | 2001-01-26 18:23:02 +0000 | [diff] [blame] | 578 |             readline_libs = ['readline'] | 
| Andrew M. Kuchling | 5aa3c4a | 2001-08-16 20:30:18 +0000 | [diff] [blame] | 579 |             if self.compiler.find_library_file(lib_dirs, | 
| Martin v. Löwis | a55e55e | 2006-02-11 15:55:14 +0000 | [diff] [blame] | 580 |                                                  'ncursesw'): | 
 | 581 |                 readline_libs.append('ncursesw') | 
 | 582 |             elif self.compiler.find_library_file(lib_dirs, | 
| Andrew M. Kuchling | 5aa3c4a | 2001-08-16 20:30:18 +0000 | [diff] [blame] | 583 |                                                  'ncurses'): | 
 | 584 |                 readline_libs.append('ncurses') | 
| Neal Norwitz | 0b27ff9 | 2003-03-31 15:53:49 +0000 | [diff] [blame] | 585 |             elif self.compiler.find_library_file(lib_dirs, 'curses'): | 
 | 586 |                 readline_libs.append('curses') | 
| Andrew M. Kuchling | 5aa3c4a | 2001-08-16 20:30:18 +0000 | [diff] [blame] | 587 |             elif self.compiler.find_library_file(lib_dirs + | 
| Marc-André Lemburg | 2efc323 | 2001-01-26 18:23:02 +0000 | [diff] [blame] | 588 |                                                ['/usr/lib/termcap'], | 
 | 589 |                                                'termcap'): | 
 | 590 |                 readline_libs.append('termcap') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 591 |             exts.append( Extension('readline', ['readline.c'], | 
| Marc-André Lemburg | 7c6fcda | 2001-01-26 18:03:24 +0000 | [diff] [blame] | 592 |                                    library_dirs=['/usr/lib/termcap'], | 
| Ronald Oussoren | 39be38c | 2006-05-26 11:38:39 +0000 | [diff] [blame] | 593 |                                    extra_link_args=readline_extra_link_args, | 
| Marc-André Lemburg | 2efc323 | 2001-01-26 18:23:02 +0000 | [diff] [blame] | 594 |                                    libraries=readline_libs) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 595 |         else: | 
 | 596 |             missing.append('readline') | 
 | 597 |  | 
| Jack Jansen | 73aa1ff | 2002-06-27 22:06:49 +0000 | [diff] [blame] | 598 |         if platform not in ['mac']: | 
| Andrew M. Kuchling | 7883dc8 | 2003-10-24 18:26:26 +0000 | [diff] [blame] | 599 |             # crypt module. | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 600 |  | 
 | 601 |             if self.compiler.find_library_file(lib_dirs, 'crypt'): | 
 | 602 |                 libs = ['crypt'] | 
 | 603 |             else: | 
 | 604 |                 libs = [] | 
 | 605 |             exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 606 |         else: | 
 | 607 |             missing.append('crypt') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 608 |  | 
| Skip Montanaro | ba9e978 | 2003-03-20 23:34:22 +0000 | [diff] [blame] | 609 |         # CSV files | 
 | 610 |         exts.append( Extension('_csv', ['_csv.c']) ) | 
 | 611 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 612 |         # socket(2) | 
| Guido van Rossum | 47d3a7a | 2002-06-13 14:41:32 +0000 | [diff] [blame] | 613 |         exts.append( Extension('_socket', ['socketmodule.c'], | 
| Jeremy Hylton | 340043e | 2002-06-13 17:38:11 +0000 | [diff] [blame] | 614 |                                depends = ['socketmodule.h']) ) | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 615 |         # Detect SSL support for the socket module (via _ssl) | 
| Gregory P. Smith | ade9733 | 2005-08-23 21:19:40 +0000 | [diff] [blame] | 616 |         search_for_ssl_incs_in = [ | 
 | 617 |                               '/usr/local/ssl/include', | 
| Andrew M. Kuchling | e7c8732 | 2001-01-19 16:58:21 +0000 | [diff] [blame] | 618 |                               '/usr/contrib/ssl/include/' | 
 | 619 |                              ] | 
| Gregory P. Smith | ade9733 | 2005-08-23 21:19:40 +0000 | [diff] [blame] | 620 |         ssl_incs = find_file('openssl/ssl.h', inc_dirs, | 
 | 621 |                              search_for_ssl_incs_in | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 622 |                              ) | 
| Martin v. Löwis | a950f7f | 2003-05-09 09:05:19 +0000 | [diff] [blame] | 623 |         if ssl_incs is not None: | 
 | 624 |             krb5_h = find_file('krb5.h', inc_dirs, | 
 | 625 |                                ['/usr/kerberos/include']) | 
 | 626 |             if krb5_h: | 
 | 627 |                 ssl_incs += krb5_h | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 628 |         ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs, | 
| Andrew M. Kuchling | e7c8732 | 2001-01-19 16:58:21 +0000 | [diff] [blame] | 629 |                                      ['/usr/local/ssl/lib', | 
 | 630 |                                       '/usr/contrib/ssl/lib/' | 
 | 631 |                                      ] ) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 632 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 633 |         if (ssl_incs is not None and | 
 | 634 |             ssl_libs is not None): | 
| Marc-André Lemburg | a5d2b4c | 2002-02-16 18:23:30 +0000 | [diff] [blame] | 635 |             exts.append( Extension('_ssl', ['_ssl.c'], | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 636 |                                    include_dirs = ssl_incs, | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 637 |                                    library_dirs = ssl_libs, | 
| Guido van Rossum | 47d3a7a | 2002-06-13 14:41:32 +0000 | [diff] [blame] | 638 |                                    libraries = ['ssl', 'crypto'], | 
| Jeremy Hylton | 340043e | 2002-06-13 17:38:11 +0000 | [diff] [blame] | 639 |                                    depends = ['socketmodule.h']), ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 640 |         else: | 
 | 641 |             missing.append('_ssl') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 642 |  | 
| Gregory P. Smith | ade9733 | 2005-08-23 21:19:40 +0000 | [diff] [blame] | 643 |         # find out which version of OpenSSL we have | 
 | 644 |         openssl_ver = 0 | 
 | 645 |         openssl_ver_re = re.compile( | 
 | 646 |             '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' ) | 
 | 647 |         for ssl_inc_dir in inc_dirs + search_for_ssl_incs_in: | 
 | 648 |             name = os.path.join(ssl_inc_dir, 'openssl', 'opensslv.h') | 
 | 649 |             if os.path.isfile(name): | 
 | 650 |                 try: | 
 | 651 |                     incfile = open(name, 'r') | 
 | 652 |                     for line in incfile: | 
 | 653 |                         m = openssl_ver_re.match(line) | 
 | 654 |                         if m: | 
 | 655 |                             openssl_ver = eval(m.group(1)) | 
 | 656 |                             break | 
 | 657 |                 except IOError: | 
 | 658 |                     pass | 
 | 659 |  | 
 | 660 |             # first version found is what we'll use (as the compiler should) | 
 | 661 |             if openssl_ver: | 
 | 662 |                 break | 
 | 663 |  | 
 | 664 |         #print 'openssl_ver = 0x%08x' % openssl_ver | 
 | 665 |  | 
| Gregory P. Smith | f21a5f7 | 2005-08-21 18:45:59 +0000 | [diff] [blame] | 666 |         if (ssl_incs is not None and | 
| Gregory P. Smith | ade9733 | 2005-08-23 21:19:40 +0000 | [diff] [blame] | 667 |             ssl_libs is not None and | 
 | 668 |             openssl_ver >= 0x00907000): | 
| Gregory P. Smith | f21a5f7 | 2005-08-21 18:45:59 +0000 | [diff] [blame] | 669 |             # The _hashlib module wraps optimized implementations | 
 | 670 |             # of hash functions from the OpenSSL library. | 
 | 671 |             exts.append( Extension('_hashlib', ['_hashopenssl.c'], | 
 | 672 |                                    include_dirs = ssl_incs, | 
 | 673 |                                    library_dirs = ssl_libs, | 
 | 674 |                                    libraries = ['ssl', 'crypto']) ) | 
| Gregory P. Smith | 4eb60e5 | 2007-08-26 00:26:00 +0000 | [diff] [blame] | 675 |             # these aren't strictly missing since they are unneeded. | 
 | 676 |             #missing.extend(['_sha', '_md5']) | 
| Gregory P. Smith | f21a5f7 | 2005-08-21 18:45:59 +0000 | [diff] [blame] | 677 |         else: | 
 | 678 |             # The _sha module implements the SHA1 hash algorithm. | 
 | 679 |             exts.append( Extension('_sha', ['shamodule.c']) ) | 
 | 680 |             # The _md5 module implements the RSA Data Security, Inc. MD5 | 
 | 681 |             # Message-Digest Algorithm, described in RFC 1321.  The | 
| Matthias Klose | 8e39ec7 | 2006-04-03 16:27:50 +0000 | [diff] [blame] | 682 |             # necessary files md5.c and md5.h are included here. | 
| Gregory P. Smith | d792392 | 2006-06-05 23:38:06 +0000 | [diff] [blame] | 683 |             exts.append( Extension('_md5', | 
 | 684 |                             sources = ['md5module.c', 'md5.c'], | 
 | 685 |                             depends = ['md5.h']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 686 |             missing.append('_hashlib') | 
| Gregory P. Smith | f21a5f7 | 2005-08-21 18:45:59 +0000 | [diff] [blame] | 687 |  | 
| Gregory P. Smith | ade9733 | 2005-08-23 21:19:40 +0000 | [diff] [blame] | 688 |         if (openssl_ver < 0x00908000): | 
 | 689 |             # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash | 
 | 690 |             exts.append( Extension('_sha256', ['sha256module.c']) ) | 
 | 691 |             exts.append( Extension('_sha512', ['sha512module.c']) ) | 
| Gregory P. Smith | f21a5f7 | 2005-08-21 18:45:59 +0000 | [diff] [blame] | 692 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 693 |         # Modules that provide persistent dictionary-like semantics.  You will | 
 | 694 |         # probably want to arrange for at least one of them to be available on | 
 | 695 |         # your machine, though none are defined by default because of library | 
 | 696 |         # dependencies.  The Python module anydbm.py provides an | 
 | 697 |         # implementation independent wrapper for these; dumbdbm.py provides | 
 | 698 |         # similar functionality (but slower of course) implemented in Python. | 
 | 699 |  | 
| Gregory P. Smith | 1475cd8 | 2007-10-06 07:51:59 +0000 | [diff] [blame] | 700 |         # Sleepycat^WOracle Berkeley DB interface. | 
 | 701 |         #  http://www.oracle.com/database/berkeley-db/db/index.html | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 702 |         # | 
| Gregory P. Smith | 4eb60e5 | 2007-08-26 00:26:00 +0000 | [diff] [blame] | 703 |         # This requires the Sleepycat^WOracle DB code. The supported versions | 
| Gregory P. Smith | e7f4d84 | 2007-10-09 18:26:02 +0000 | [diff] [blame] | 704 |         # are set below.  Visit the URL above to download | 
| Gregory P. Smith | 3adc4aa | 2006-04-13 19:19:01 +0000 | [diff] [blame] | 705 |         # a release.  Most open source OSes come with one or more | 
 | 706 |         # versions of BerkeleyDB already installed. | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 707 |  | 
| Gregory P. Smith | 8f1a4a6 | 2008-05-26 19:29:14 +0000 | [diff] [blame] | 708 |         max_db_ver = (4, 7) | 
| Gregory P. Smith | 3adc4aa | 2006-04-13 19:19:01 +0000 | [diff] [blame] | 709 |         min_db_ver = (3, 3) | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 710 |         db_setup_debug = False   # verbose debug prints from this script? | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 711 |  | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 712 |         def allow_db_ver(db_ver): | 
 | 713 |             """Returns a boolean if the given BerkeleyDB version is acceptable. | 
 | 714 |  | 
 | 715 |             Args: | 
 | 716 |               db_ver: A tuple of the version to verify. | 
 | 717 |             """ | 
 | 718 |             if not (min_db_ver <= db_ver <= max_db_ver): | 
 | 719 |                 return False | 
 | 720 |             # Use this function to filter out known bad configurations. | 
 | 721 |             if (4, 6) == db_ver[:2]: | 
 | 722 |                 # BerkeleyDB 4.6.x is not stable on many architectures. | 
 | 723 |                 arch = platform_machine() | 
 | 724 |                 if arch not in ('i386', 'i486', 'i586', 'i686', | 
 | 725 |                                 'x86_64', 'ia64'): | 
 | 726 |                     return False | 
 | 727 |             return True | 
 | 728 |  | 
 | 729 |         def gen_db_minor_ver_nums(major): | 
 | 730 |             if major == 4: | 
 | 731 |                 for x in range(max_db_ver[1]+1): | 
 | 732 |                     if allow_db_ver((4, x)): | 
 | 733 |                         yield x | 
 | 734 |             elif major == 3: | 
 | 735 |                 for x in (3,): | 
 | 736 |                     if allow_db_ver((3, x)): | 
 | 737 |                         yield x | 
 | 738 |             else: | 
 | 739 |                 raise ValueError("unknown major BerkeleyDB version", major) | 
 | 740 |  | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 741 |         # construct a list of paths to look for the header file in on | 
 | 742 |         # top of the normal inc_dirs. | 
 | 743 |         db_inc_paths = [ | 
 | 744 |             '/usr/include/db4', | 
 | 745 |             '/usr/local/include/db4', | 
 | 746 |             '/opt/sfw/include/db4', | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 747 |             '/usr/include/db3', | 
 | 748 |             '/usr/local/include/db3', | 
 | 749 |             '/opt/sfw/include/db3', | 
| Skip Montanaro | 00c5a01 | 2007-03-04 20:52:28 +0000 | [diff] [blame] | 750 |             # Fink defaults (http://fink.sourceforge.net/) | 
 | 751 |             '/sw/include/db4', | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 752 |             '/sw/include/db3', | 
 | 753 |         ] | 
 | 754 |         # 4.x minor number specific paths | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 755 |         for x in gen_db_minor_ver_nums(4): | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 756 |             db_inc_paths.append('/usr/include/db4%d' % x) | 
| Neal Norwitz | 8f40171 | 2005-10-20 05:28:29 +0000 | [diff] [blame] | 757 |             db_inc_paths.append('/usr/include/db4.%d' % x) | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 758 |             db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x) | 
 | 759 |             db_inc_paths.append('/usr/local/include/db4%d' % x) | 
 | 760 |             db_inc_paths.append('/pkg/db-4.%d/include' % x) | 
| Gregory P. Smith | 29602d2 | 2006-01-24 09:46:48 +0000 | [diff] [blame] | 761 |             db_inc_paths.append('/opt/db-4.%d/include' % x) | 
| Skip Montanaro | 00c5a01 | 2007-03-04 20:52:28 +0000 | [diff] [blame] | 762 |             # MacPorts default (http://www.macports.org/) | 
 | 763 |             db_inc_paths.append('/opt/local/include/db4%d' % x) | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 764 |         # 3.x minor number specific paths | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 765 |         for x in gen_db_minor_ver_nums(3): | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 766 |             db_inc_paths.append('/usr/include/db3%d' % x) | 
 | 767 |             db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x) | 
 | 768 |             db_inc_paths.append('/usr/local/include/db3%d' % x) | 
 | 769 |             db_inc_paths.append('/pkg/db-3.%d/include' % x) | 
| Gregory P. Smith | 29602d2 | 2006-01-24 09:46:48 +0000 | [diff] [blame] | 770 |             db_inc_paths.append('/opt/db-3.%d/include' % x) | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 771 |  | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 772 |         # Add some common subdirectories for Sleepycat DB to the list, | 
 | 773 |         # based on the standard include directories. This way DB3/4 gets | 
 | 774 |         # picked up when it is installed in a non-standard prefix and | 
 | 775 |         # the user has added that prefix into inc_dirs. | 
 | 776 |         std_variants = [] | 
 | 777 |         for dn in inc_dirs: | 
 | 778 |             std_variants.append(os.path.join(dn, 'db3')) | 
 | 779 |             std_variants.append(os.path.join(dn, 'db4')) | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 780 |             for x in gen_db_minor_ver_nums(4): | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 781 |                 std_variants.append(os.path.join(dn, "db4%d"%x)) | 
 | 782 |                 std_variants.append(os.path.join(dn, "db4.%d"%x)) | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 783 |             for x in gen_db_minor_ver_nums(3): | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 784 |                 std_variants.append(os.path.join(dn, "db3%d"%x)) | 
 | 785 |                 std_variants.append(os.path.join(dn, "db3.%d"%x)) | 
 | 786 |  | 
| Tim Peters | 38ff36c | 2006-06-30 06:18:39 +0000 | [diff] [blame] | 787 |         db_inc_paths = std_variants + db_inc_paths | 
| Skip Montanaro | 00c5a01 | 2007-03-04 20:52:28 +0000 | [diff] [blame] | 788 |         db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)] | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 789 |  | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 790 |         db_ver_inc_map = {} | 
 | 791 |  | 
 | 792 |         class db_found(Exception): pass | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 793 |         try: | 
| Martin v. Löwis | 05d4d56 | 2002-12-06 10:25:02 +0000 | [diff] [blame] | 794 |             # See whether there is a Sleepycat header in the standard | 
 | 795 |             # search path. | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 796 |             for d in inc_dirs + db_inc_paths: | 
| Martin v. Löwis | 05d4d56 | 2002-12-06 10:25:02 +0000 | [diff] [blame] | 797 |                 f = os.path.join(d, "db.h") | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 798 |                 if db_setup_debug: print "db: looking for db.h in", f | 
| Martin v. Löwis | 05d4d56 | 2002-12-06 10:25:02 +0000 | [diff] [blame] | 799 |                 if os.path.exists(f): | 
 | 800 |                     f = open(f).read() | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 801 |                     m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f) | 
| Martin v. Löwis | 05d4d56 | 2002-12-06 10:25:02 +0000 | [diff] [blame] | 802 |                     if m: | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 803 |                         db_major = int(m.group(1)) | 
 | 804 |                         m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f) | 
 | 805 |                         db_minor = int(m.group(1)) | 
 | 806 |                         db_ver = (db_major, db_minor) | 
 | 807 |  | 
| Gregory P. Smith | 1475cd8 | 2007-10-06 07:51:59 +0000 | [diff] [blame] | 808 |                         # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug | 
 | 809 |                         if db_ver == (4, 6): | 
 | 810 |                             m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f) | 
 | 811 |                             db_patch = int(m.group(1)) | 
 | 812 |                             if db_patch < 21: | 
 | 813 |                                 print "db.h:", db_ver, "patch", db_patch, | 
 | 814 |                                 print "being ignored (4.6.x must be >= 4.6.21)" | 
 | 815 |                                 continue | 
 | 816 |  | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 817 |                         if ( (not db_ver_inc_map.has_key(db_ver)) and | 
| Gregory P. Smith | 0902cac | 2008-05-27 08:40:09 +0000 | [diff] [blame] | 818 |                             allow_db_ver(db_ver) ): | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 819 |                             # save the include directory with the db.h version | 
| Skip Montanaro | 00c5a01 | 2007-03-04 20:52:28 +0000 | [diff] [blame] | 820 |                             # (first occurrence only) | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 821 |                             db_ver_inc_map[db_ver] = d | 
| Andrew M. Kuchling | 738446f4 | 2006-10-27 18:13:46 +0000 | [diff] [blame] | 822 |                             if db_setup_debug: | 
 | 823 |                                 print "db.h: found", db_ver, "in", d | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 824 |                         else: | 
 | 825 |                             # we already found a header for this library version | 
 | 826 |                             if db_setup_debug: print "db.h: ignoring", d | 
 | 827 |                     else: | 
 | 828 |                         # ignore this header, it didn't contain a version number | 
| Skip Montanaro | 00c5a01 | 2007-03-04 20:52:28 +0000 | [diff] [blame] | 829 |                         if db_setup_debug: | 
 | 830 |                             print "db.h: no version number version in", d | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 831 |  | 
 | 832 |             db_found_vers = db_ver_inc_map.keys() | 
 | 833 |             db_found_vers.sort() | 
 | 834 |  | 
 | 835 |             while db_found_vers: | 
 | 836 |                 db_ver = db_found_vers.pop() | 
 | 837 |                 db_incdir = db_ver_inc_map[db_ver] | 
 | 838 |  | 
 | 839 |                 # check lib directories parallel to the location of the header | 
 | 840 |                 db_dirs_to_check = [ | 
| Skip Montanaro | 00c5a01 | 2007-03-04 20:52:28 +0000 | [diff] [blame] | 841 |                     db_incdir.replace("include", 'lib64'), | 
 | 842 |                     db_incdir.replace("include", 'lib'), | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 843 |                 ] | 
 | 844 |                 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check) | 
 | 845 |  | 
 | 846 |                 # Look for a version specific db-X.Y before an ambiguoius dbX | 
 | 847 |                 # XXX should we -ever- look for a dbX name?  Do any | 
 | 848 |                 # systems really not name their library by version and | 
 | 849 |                 # symlink to more general names? | 
| Andrew MacIntyre | 953f98d | 2005-03-09 22:21:08 +0000 | [diff] [blame] | 850 |                 for dblib in (('db-%d.%d' % db_ver), | 
 | 851 |                               ('db%d%d' % db_ver), | 
 | 852 |                               ('db%d' % db_ver[0])): | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 853 |                     dblib_file = self.compiler.find_library_file( | 
 | 854 |                                     db_dirs_to_check + lib_dirs, dblib ) | 
 | 855 |                     if dblib_file: | 
 | 856 |                         dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ] | 
 | 857 |                         raise db_found | 
 | 858 |                     else: | 
 | 859 |                         if db_setup_debug: print "db lib: ", dblib, "not found" | 
 | 860 |  | 
 | 861 |         except db_found: | 
| Brett Cannon | ef3dab2 | 2008-05-29 21:23:33 +0000 | [diff] [blame] | 862 |             if db_setup_debug: | 
 | 863 |                 print "bsddb using BerkeleyDB lib:", db_ver, dblib | 
 | 864 |                 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 865 |             db_incs = [db_incdir] | 
| Jack Jansen | d1b2045 | 2002-07-08 21:39:36 +0000 | [diff] [blame] | 866 |             dblibs = [dblib] | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 867 |             # We add the runtime_library_dirs argument because the | 
 | 868 |             # BerkeleyDB lib we're linking against often isn't in the | 
 | 869 |             # system dynamic library search path.  This is usually | 
 | 870 |             # correct and most trouble free, but may cause problems in | 
 | 871 |             # some unusual system configurations (e.g. the directory | 
 | 872 |             # is on an NFS server that goes away). | 
| Martin v. Löwis | 6aa4a1f | 2002-11-19 08:09:52 +0000 | [diff] [blame] | 873 |             exts.append(Extension('_bsddb', ['_bsddb.c'], | 
| Gregory P. Smith | 3925053 | 2007-10-09 06:02:21 +0000 | [diff] [blame] | 874 |                                   depends = ['bsddb.h'], | 
| Martin v. Löwis | 05d4d56 | 2002-12-06 10:25:02 +0000 | [diff] [blame] | 875 |                                   library_dirs=dblib_dir, | 
 | 876 |                                   runtime_library_dirs=dblib_dir, | 
| Martin v. Löwis | 6aa4a1f | 2002-11-19 08:09:52 +0000 | [diff] [blame] | 877 |                                   include_dirs=db_incs, | 
 | 878 |                                   libraries=dblibs)) | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 879 |         else: | 
| Gregory P. Smith | e76c8c0 | 2004-12-13 12:01:24 +0000 | [diff] [blame] | 880 |             if db_setup_debug: print "db: no appropriate library found" | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 881 |             db_incs = None | 
 | 882 |             dblibs = [] | 
 | 883 |             dblib_dir = None | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 884 |             missing.append('_bsddb') | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 885 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 886 |         # The sqlite interface | 
| Andrew M. Kuchling | 738446f4 | 2006-10-27 18:13:46 +0000 | [diff] [blame] | 887 |         sqlite_setup_debug = False   # verbose debug prints from this script? | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 888 |  | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 889 |         # We hunt for #define SQLITE_VERSION "n.n.n" | 
 | 890 |         # We need to find >= sqlite version 3.0.8 | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 891 |         sqlite_incdir = sqlite_libdir = None | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 892 |         sqlite_inc_paths = [ '/usr/include', | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 893 |                              '/usr/include/sqlite', | 
 | 894 |                              '/usr/include/sqlite3', | 
 | 895 |                              '/usr/local/include', | 
 | 896 |                              '/usr/local/include/sqlite', | 
 | 897 |                              '/usr/local/include/sqlite3', | 
 | 898 |                            ] | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 899 |         MIN_SQLITE_VERSION_NUMBER = (3, 0, 8) | 
 | 900 |         MIN_SQLITE_VERSION = ".".join([str(x) | 
 | 901 |                                     for x in MIN_SQLITE_VERSION_NUMBER]) | 
| Ronald Oussoren | 39be38c | 2006-05-26 11:38:39 +0000 | [diff] [blame] | 902 |  | 
 | 903 |         # Scan the default include directories before the SQLite specific | 
 | 904 |         # ones. This allows one to override the copy of sqlite on OSX, | 
 | 905 |         # where /usr/include contains an old version of sqlite. | 
 | 906 |         for d in inc_dirs + sqlite_inc_paths: | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 907 |             f = os.path.join(d, "sqlite3.h") | 
 | 908 |             if os.path.exists(f): | 
| Anthony Baxter | 07f5b35 | 2006-04-01 08:36:27 +0000 | [diff] [blame] | 909 |                 if sqlite_setup_debug: print "sqlite: found %s"%f | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 910 |                 incf = open(f).read() | 
 | 911 |                 m = re.search( | 
 | 912 |                     r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf) | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 913 |                 if m: | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 914 |                     sqlite_version = m.group(1) | 
 | 915 |                     sqlite_version_tuple = tuple([int(x) | 
 | 916 |                                         for x in sqlite_version.split(".")]) | 
 | 917 |                     if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER: | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 918 |                         # we win! | 
| Andrew M. Kuchling | 738446f4 | 2006-10-27 18:13:46 +0000 | [diff] [blame] | 919 |                         if sqlite_setup_debug: | 
 | 920 |                             print "%s/sqlite3.h: version %s"%(d, sqlite_version) | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 921 |                         sqlite_incdir = d | 
 | 922 |                         break | 
 | 923 |                     else: | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 924 |                         if sqlite_setup_debug: | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 925 |                             print "%s: version %d is too old, need >= %s"%(d, | 
 | 926 |                                         sqlite_version, MIN_SQLITE_VERSION) | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 927 |                 elif sqlite_setup_debug: | 
 | 928 |                     print "sqlite: %s had no SQLITE_VERSION"%(f,) | 
 | 929 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 930 |         if sqlite_incdir: | 
 | 931 |             sqlite_dirs_to_check = [ | 
 | 932 |                 os.path.join(sqlite_incdir, '..', 'lib64'), | 
 | 933 |                 os.path.join(sqlite_incdir, '..', 'lib'), | 
 | 934 |                 os.path.join(sqlite_incdir, '..', '..', 'lib64'), | 
 | 935 |                 os.path.join(sqlite_incdir, '..', '..', 'lib'), | 
 | 936 |             ] | 
 | 937 |             sqlite_libfile = self.compiler.find_library_file( | 
 | 938 |                                 sqlite_dirs_to_check + lib_dirs, 'sqlite3') | 
| Benjamin Peterson | be2c0a9 | 2008-10-04 21:33:08 +0000 | [diff] [blame] | 939 |             if sqlite_libfile: | 
 | 940 |                 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))] | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 941 |  | 
 | 942 |         if sqlite_incdir and sqlite_libdir: | 
| Gerhard Häring | 3e99c0a | 2006-04-23 15:24:26 +0000 | [diff] [blame] | 943 |             sqlite_srcs = ['_sqlite/cache.c', | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 944 |                 '_sqlite/connection.c', | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 945 |                 '_sqlite/cursor.c', | 
 | 946 |                 '_sqlite/microprotocols.c', | 
 | 947 |                 '_sqlite/module.c', | 
 | 948 |                 '_sqlite/prepare_protocol.c', | 
 | 949 |                 '_sqlite/row.c', | 
 | 950 |                 '_sqlite/statement.c', | 
 | 951 |                 '_sqlite/util.c', ] | 
 | 952 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 953 |             sqlite_defines = [] | 
 | 954 |             if sys.platform != "win32": | 
| Anthony Baxter | 8e7b490 | 2006-04-05 18:25:33 +0000 | [diff] [blame] | 955 |                 sqlite_defines.append(('MODULE_NAME', '"sqlite3"')) | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 956 |             else: | 
| Anthony Baxter | 8e7b490 | 2006-04-05 18:25:33 +0000 | [diff] [blame] | 957 |                 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"')) | 
 | 958 |  | 
| Ronald Oussoren | 39be38c | 2006-05-26 11:38:39 +0000 | [diff] [blame] | 959 |  | 
 | 960 |             if sys.platform == 'darwin': | 
 | 961 |                 # In every directory on the search path search for a dynamic | 
 | 962 |                 # library and then a static library, instead of first looking | 
 | 963 |                 # for dynamic libraries on the entiry path. | 
 | 964 |                 # This way a staticly linked custom sqlite gets picked up | 
 | 965 |                 # before the dynamic library in /usr/lib. | 
 | 966 |                 sqlite_extra_link_args = ('-Wl,-search_paths_first',) | 
 | 967 |             else: | 
 | 968 |                 sqlite_extra_link_args = () | 
 | 969 |  | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 970 |             exts.append(Extension('_sqlite3', sqlite_srcs, | 
 | 971 |                                   define_macros=sqlite_defines, | 
| Anthony Baxter | 3dc6bb3 | 2006-04-03 02:20:49 +0000 | [diff] [blame] | 972 |                                   include_dirs=["Modules/_sqlite", | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 973 |                                                 sqlite_incdir], | 
 | 974 |                                   library_dirs=sqlite_libdir, | 
 | 975 |                                   runtime_library_dirs=sqlite_libdir, | 
| Ronald Oussoren | 39be38c | 2006-05-26 11:38:39 +0000 | [diff] [blame] | 976 |                                   extra_link_args=sqlite_extra_link_args, | 
| Anthony Baxter | c51ee69 | 2006-04-01 00:57:31 +0000 | [diff] [blame] | 977 |                                   libraries=["sqlite3",])) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 978 |         else: | 
 | 979 |             missing.append('_sqlite3') | 
| Skip Montanaro | 22e00c4 | 2003-05-06 20:43:34 +0000 | [diff] [blame] | 980 |  | 
 | 981 |         # Look for Berkeley db 1.85.   Note that it is built as a different | 
 | 982 |         # module name so it can be included even when later versions are | 
 | 983 |         # available.  A very restrictive search is performed to avoid | 
 | 984 |         # accidentally building this module with a later version of the | 
 | 985 |         # underlying db library.  May BSD-ish Unixes incorporate db 1.85 | 
 | 986 |         # symbols into libc and place the include file in /usr/include. | 
| Gregory P. Smith | 4eb60e5 | 2007-08-26 00:26:00 +0000 | [diff] [blame] | 987 |         # | 
 | 988 |         # If the better bsddb library can be built (db_incs is defined) | 
 | 989 |         # we do not build this one.  Otherwise this build will pick up | 
 | 990 |         # the more recent berkeleydb's db.h file first in the include path | 
 | 991 |         # when attempting to compile and it will fail. | 
| Skip Montanaro | 22e00c4 | 2003-05-06 20:43:34 +0000 | [diff] [blame] | 992 |         f = "/usr/include/db.h" | 
| Gregory P. Smith | 4eb60e5 | 2007-08-26 00:26:00 +0000 | [diff] [blame] | 993 |         if os.path.exists(f) and not db_incs: | 
| Skip Montanaro | 22e00c4 | 2003-05-06 20:43:34 +0000 | [diff] [blame] | 994 |             data = open(f).read() | 
 | 995 |             m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data) | 
 | 996 |             if m is not None: | 
 | 997 |                 # bingo - old version used hash file format version 2 | 
 | 998 |                 ### XXX this should be fixed to not be platform-dependent | 
 | 999 |                 ### but I don't have direct access to an osf1 platform and | 
 | 1000 |                 ### seemed to be muffing the search somehow | 
 | 1001 |                 libraries = platform == "osf1" and ['db'] or None | 
 | 1002 |                 if libraries is not None: | 
 | 1003 |                     exts.append(Extension('bsddb185', ['bsddbmodule.c'], | 
 | 1004 |                                           libraries=libraries)) | 
 | 1005 |                 else: | 
 | 1006 |                     exts.append(Extension('bsddb185', ['bsddbmodule.c'])) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1007 |             else: | 
 | 1008 |                 missing.append('bsddb185') | 
 | 1009 |         else: | 
 | 1010 |             missing.append('bsddb185') | 
| Skip Montanaro | 22e00c4 | 2003-05-06 20:43:34 +0000 | [diff] [blame] | 1011 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1012 |         # The standard Unix dbm module: | 
| Jack Jansen | d1b2045 | 2002-07-08 21:39:36 +0000 | [diff] [blame] | 1013 |         if platform not in ['cygwin']: | 
| Martin v. Löwis | a37d61f | 2002-12-07 14:41:17 +0000 | [diff] [blame] | 1014 |             if find_file("ndbm.h", inc_dirs, []) is not None: | 
 | 1015 |                 # Some systems have -lndbm, others don't | 
 | 1016 |                 if self.compiler.find_library_file(lib_dirs, 'ndbm'): | 
 | 1017 |                     ndbm_libs = ['ndbm'] | 
 | 1018 |                 else: | 
 | 1019 |                     ndbm_libs = [] | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 1020 |                 exts.append( Extension('dbm', ['dbmmodule.c'], | 
| Jack Jansen | d1b2045 | 2002-07-08 21:39:36 +0000 | [diff] [blame] | 1021 |                                        define_macros=[('HAVE_NDBM_H',None)], | 
| Martin v. Löwis | a37d61f | 2002-12-07 14:41:17 +0000 | [diff] [blame] | 1022 |                                        libraries = ndbm_libs ) ) | 
| Skip Montanaro | b7387a5 | 2008-12-06 17:39:54 +0000 | [diff] [blame] | 1023 |             elif self.compiler.find_library_file(lib_dirs, 'gdbm'): | 
 | 1024 |                 gdbm_libs = ['gdbm'] | 
 | 1025 |                 if self.compiler.find_library_file(lib_dirs, 'gdbm_compat'): | 
 | 1026 |                     gdbm_libs.append('gdbm_compat') | 
 | 1027 |                 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None: | 
 | 1028 |                     exts.append( Extension( | 
 | 1029 |                         'dbm', ['dbmmodule.c'], | 
 | 1030 |                         define_macros=[('HAVE_GDBM_NDBM_H',None)], | 
 | 1031 |                         libraries = gdbm_libs ) ) | 
 | 1032 |                 elif find_file("gdbm-ndbm.h", inc_dirs, []) is not None: | 
 | 1033 |                     exts.append( Extension( | 
 | 1034 |                         'dbm', ['dbmmodule.c'], | 
 | 1035 |                         define_macros=[('HAVE_GDBM_DASH_NDBM_H',None)], | 
 | 1036 |                         libraries = gdbm_libs ) ) | 
| Skip Montanaro | b9a80de | 2008-12-07 02:16:19 +0000 | [diff] [blame] | 1037 |                 else: | 
 | 1038 |                     missing.append('dbm') | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 1039 |             elif db_incs is not None: | 
 | 1040 |                 exts.append( Extension('dbm', ['dbmmodule.c'], | 
| Martin v. Löwis | a37d61f | 2002-12-07 14:41:17 +0000 | [diff] [blame] | 1041 |                                        library_dirs=dblib_dir, | 
 | 1042 |                                        runtime_library_dirs=dblib_dir, | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 1043 |                                        include_dirs=db_incs, | 
| Jack Jansen | d1b2045 | 2002-07-08 21:39:36 +0000 | [diff] [blame] | 1044 |                                        define_macros=[('HAVE_BERKDB_H',None), | 
 | 1045 |                                                       ('DB_DBM_HSEARCH',None)], | 
| Skip Montanaro | 57454e5 | 2002-06-14 20:30:31 +0000 | [diff] [blame] | 1046 |                                        libraries=dblibs)) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1047 |             else: | 
 | 1048 |                 missing.append('dbm') | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1049 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1050 |         # Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm: | 
 | 1051 |         if (self.compiler.find_library_file(lib_dirs, 'gdbm')): | 
 | 1052 |             exts.append( Extension('gdbm', ['gdbmmodule.c'], | 
 | 1053 |                                    libraries = ['gdbm'] ) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1054 |         else: | 
 | 1055 |             missing.append('gdbm') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1056 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1057 |         # Unix-only modules | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 1058 |         if platform not in ['mac', 'win32']: | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1059 |             # Steen Lumholt's termios module | 
 | 1060 |             exts.append( Extension('termios', ['termios.c']) ) | 
 | 1061 |             # Jeremy Hylton's rlimit interface | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1062 |             if platform not in ['atheos']: | 
| Martin v. Löwis | f90ae20 | 2002-06-11 06:22:31 +0000 | [diff] [blame] | 1063 |                 exts.append( Extension('resource', ['resource.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1064 |             else: | 
 | 1065 |                 missing.append('resource') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1066 |  | 
| Andrew M. Kuchling | cf393f3 | 2001-02-21 02:38:24 +0000 | [diff] [blame] | 1067 |             # Sun yellow pages. Some systems have the functions in libc. | 
| Martin v. Löwis | 8c255e4 | 2008-05-23 15:06:50 +0000 | [diff] [blame] | 1068 |             if platform not in ['cygwin', 'atheos', 'qnx6']: | 
| Andrew M. Kuchling | 6efc6e7 | 2001-02-27 20:54:23 +0000 | [diff] [blame] | 1069 |                 if (self.compiler.find_library_file(lib_dirs, 'nsl')): | 
 | 1070 |                     libs = ['nsl'] | 
 | 1071 |                 else: | 
 | 1072 |                     libs = [] | 
 | 1073 |                 exts.append( Extension('nis', ['nismodule.c'], | 
 | 1074 |                                        libraries = libs) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1075 |             else: | 
 | 1076 |                 missing.append('nis') | 
 | 1077 |         else: | 
 | 1078 |             missing.extend(['nis', 'resource', 'termios']) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1079 |  | 
| Skip Montanaro | 7209294 | 2004-02-07 12:50:19 +0000 | [diff] [blame] | 1080 |         # Curses support, requiring the System V version of curses, often | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1081 |         # provided by the ncurses library. | 
| Andrew M. Kuchling | 8607042 | 2006-08-06 22:07:04 +0000 | [diff] [blame] | 1082 |         panel_library = 'panel' | 
| Martin v. Löwis | a55e55e | 2006-02-11 15:55:14 +0000 | [diff] [blame] | 1083 |         if (self.compiler.find_library_file(lib_dirs, 'ncursesw')): | 
 | 1084 |             curses_libs = ['ncursesw'] | 
| Andrew M. Kuchling | 8607042 | 2006-08-06 22:07:04 +0000 | [diff] [blame] | 1085 |             # Bug 1464056: If _curses.so links with ncursesw, | 
 | 1086 |             # _curses_panel.so must link with panelw. | 
 | 1087 |             panel_library = 'panelw' | 
| Martin v. Löwis | a55e55e | 2006-02-11 15:55:14 +0000 | [diff] [blame] | 1088 |             exts.append( Extension('_curses', ['_cursesmodule.c'], | 
 | 1089 |                                    libraries = curses_libs) ) | 
 | 1090 |         elif (self.compiler.find_library_file(lib_dirs, 'ncurses')): | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1091 |             curses_libs = ['ncurses'] | 
 | 1092 |             exts.append( Extension('_curses', ['_cursesmodule.c'], | 
 | 1093 |                                    libraries = curses_libs) ) | 
| Fred Drake | 38419c0 | 2001-12-06 22:24:47 +0000 | [diff] [blame] | 1094 |         elif (self.compiler.find_library_file(lib_dirs, 'curses') | 
 | 1095 |               and platform != 'darwin'): | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1096 |                 # OSX has an old Berkeley curses, not good enough for | 
 | 1097 |                 # the _curses module. | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1098 |             if (self.compiler.find_library_file(lib_dirs, 'terminfo')): | 
 | 1099 |                 curses_libs = ['curses', 'terminfo'] | 
| Neal Norwitz | 0b27ff9 | 2003-03-31 15:53:49 +0000 | [diff] [blame] | 1100 |             elif (self.compiler.find_library_file(lib_dirs, 'termcap')): | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1101 |                 curses_libs = ['curses', 'termcap'] | 
| Neal Norwitz | 0b27ff9 | 2003-03-31 15:53:49 +0000 | [diff] [blame] | 1102 |             else: | 
 | 1103 |                 curses_libs = ['curses'] | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1104 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1105 |             exts.append( Extension('_curses', ['_cursesmodule.c'], | 
 | 1106 |                                    libraries = curses_libs) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1107 |         else: | 
 | 1108 |             missing.append('_curses') | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1109 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1110 |         # If the curses module is enabled, check for the panel module | 
| Andrew M. Kuchling | e7ffbb2 | 2001-12-06 15:57:16 +0000 | [diff] [blame] | 1111 |         if (module_enabled(exts, '_curses') and | 
| Andrew M. Kuchling | 8607042 | 2006-08-06 22:07:04 +0000 | [diff] [blame] | 1112 |             self.compiler.find_library_file(lib_dirs, panel_library)): | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1113 |             exts.append( Extension('_curses_panel', ['_curses_panel.c'], | 
| Andrew M. Kuchling | 8607042 | 2006-08-06 22:07:04 +0000 | [diff] [blame] | 1114 |                                    libraries = [panel_library] + curses_libs) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1115 |         else: | 
 | 1116 |             missing.append('_curses_panel') | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1117 |  | 
| Barry Warsaw | 259b1e1 | 2002-08-13 20:09:26 +0000 | [diff] [blame] | 1118 |         # Andrew Kuchling's zlib module.  Note that some versions of zlib | 
 | 1119 |         # 1.1.3 have security problems.  See CERT Advisory CA-2002-07: | 
 | 1120 |         # http://www.cert.org/advisories/CA-2002-07.html | 
 | 1121 |         # | 
 | 1122 |         # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to | 
 | 1123 |         # patch its zlib 1.1.3 package instead of upgrading to 1.1.4.  For | 
 | 1124 |         # now, we still accept 1.1.3, because we think it's difficult to | 
 | 1125 |         # exploit this in Python, and we'd rather make it RedHat's problem | 
 | 1126 |         # than our problem <wink>. | 
 | 1127 |         # | 
 | 1128 |         # You can upgrade zlib to version 1.1.4 yourself by going to | 
 | 1129 |         # http://www.gzip.org/zlib/ | 
| Guido van Rossum | e697091 | 2001-04-15 15:16:12 +0000 | [diff] [blame] | 1130 |         zlib_inc = find_file('zlib.h', [], inc_dirs) | 
| Gregory P. Smith | 440ca77 | 2008-03-24 00:08:01 +0000 | [diff] [blame] | 1131 |         have_zlib = False | 
| Guido van Rossum | e697091 | 2001-04-15 15:16:12 +0000 | [diff] [blame] | 1132 |         if zlib_inc is not None: | 
 | 1133 |             zlib_h = zlib_inc[0] + '/zlib.h' | 
 | 1134 |             version = '"0.0.0"' | 
| Barry Warsaw | 259b1e1 | 2002-08-13 20:09:26 +0000 | [diff] [blame] | 1135 |             version_req = '"1.1.3"' | 
| Guido van Rossum | e697091 | 2001-04-15 15:16:12 +0000 | [diff] [blame] | 1136 |             fp = open(zlib_h) | 
 | 1137 |             while 1: | 
 | 1138 |                 line = fp.readline() | 
 | 1139 |                 if not line: | 
 | 1140 |                     break | 
| Guido van Rossum | 8cdc03d | 2002-08-06 17:28:30 +0000 | [diff] [blame] | 1141 |                 if line.startswith('#define ZLIB_VERSION'): | 
| Guido van Rossum | e697091 | 2001-04-15 15:16:12 +0000 | [diff] [blame] | 1142 |                     version = line.split()[2] | 
 | 1143 |                     break | 
 | 1144 |             if version >= version_req: | 
 | 1145 |                 if (self.compiler.find_library_file(lib_dirs, 'z')): | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 1146 |                     if sys.platform == "darwin": | 
 | 1147 |                         zlib_extra_link_args = ('-Wl,-search_paths_first',) | 
 | 1148 |                     else: | 
 | 1149 |                         zlib_extra_link_args = () | 
| Guido van Rossum | e697091 | 2001-04-15 15:16:12 +0000 | [diff] [blame] | 1150 |                     exts.append( Extension('zlib', ['zlibmodule.c'], | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 1151 |                                            libraries = ['z'], | 
 | 1152 |                                            extra_link_args = zlib_extra_link_args)) | 
| Gregory P. Smith | 440ca77 | 2008-03-24 00:08:01 +0000 | [diff] [blame] | 1153 |                     have_zlib = True | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1154 |                 else: | 
 | 1155 |                     missing.append('zlib') | 
 | 1156 |             else: | 
 | 1157 |                 missing.append('zlib') | 
 | 1158 |         else: | 
 | 1159 |             missing.append('zlib') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1160 |  | 
| Gregory P. Smith | 440ca77 | 2008-03-24 00:08:01 +0000 | [diff] [blame] | 1161 |         # Helper module for various ascii-encoders.  Uses zlib for an optimized | 
 | 1162 |         # crc32 if we have it.  Otherwise binascii uses its own. | 
 | 1163 |         if have_zlib: | 
 | 1164 |             extra_compile_args = ['-DUSE_ZLIB_CRC32'] | 
 | 1165 |             libraries = ['z'] | 
 | 1166 |             extra_link_args = zlib_extra_link_args | 
 | 1167 |         else: | 
 | 1168 |             extra_compile_args = [] | 
 | 1169 |             libraries = [] | 
 | 1170 |             extra_link_args = [] | 
 | 1171 |         exts.append( Extension('binascii', ['binascii.c'], | 
 | 1172 |                                extra_compile_args = extra_compile_args, | 
 | 1173 |                                libraries = libraries, | 
 | 1174 |                                extra_link_args = extra_link_args) ) | 
 | 1175 |  | 
| Gustavo Niemeyer | f8ca836 | 2002-11-05 16:50:05 +0000 | [diff] [blame] | 1176 |         # Gustavo Niemeyer's bz2 module. | 
 | 1177 |         if (self.compiler.find_library_file(lib_dirs, 'bz2')): | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 1178 |             if sys.platform == "darwin": | 
 | 1179 |                 bz2_extra_link_args = ('-Wl,-search_paths_first',) | 
 | 1180 |             else: | 
 | 1181 |                 bz2_extra_link_args = () | 
| Gustavo Niemeyer | f8ca836 | 2002-11-05 16:50:05 +0000 | [diff] [blame] | 1182 |             exts.append( Extension('bz2', ['bz2module.c'], | 
| Ronald Oussoren | 9b8b619 | 2006-06-27 12:53:52 +0000 | [diff] [blame] | 1183 |                                    libraries = ['bz2'], | 
 | 1184 |                                    extra_link_args = bz2_extra_link_args) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1185 |         else: | 
 | 1186 |             missing.append('bz2') | 
| Gustavo Niemeyer | f8ca836 | 2002-11-05 16:50:05 +0000 | [diff] [blame] | 1187 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1188 |         # Interface to the Expat XML parser | 
 | 1189 |         # | 
| Fred Drake | fc8341d | 2002-06-17 17:55:30 +0000 | [diff] [blame] | 1190 |         # Expat was written by James Clark and is now maintained by a | 
 | 1191 |         # group of developers on SourceForge; see www.libexpat.org for | 
 | 1192 |         # more information.  The pyexpat module was written by Paul | 
| Andrew M. Kuchling | 99f3ba1 | 2003-09-15 12:27:18 +0000 | [diff] [blame] | 1193 |         # Prescod after a prototype by Jack Jansen.  The Expat source | 
 | 1194 |         # is included in Modules/expat/.  Usage of a system | 
| Fred Drake | fc8341d | 2002-06-17 17:55:30 +0000 | [diff] [blame] | 1195 |         # shared libexpat.so/expat.dll is not advised. | 
 | 1196 |         # | 
 | 1197 |         # More information on Expat can be found at www.libexpat.org. | 
 | 1198 |         # | 
| Martin v. Löwis | 8301256 | 2002-02-14 01:25:37 +0000 | [diff] [blame] | 1199 |         expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat') | 
| Fred Drake | 2d59a49 | 2003-10-21 15:41:15 +0000 | [diff] [blame] | 1200 |         define_macros = [ | 
| Ronald Oussoren | 988117f | 2006-04-29 11:31:35 +0000 | [diff] [blame] | 1201 |             ('HAVE_EXPAT_CONFIG_H', '1'), | 
 | 1202 |         ] | 
 | 1203 |  | 
| Fred Drake | 2d59a49 | 2003-10-21 15:41:15 +0000 | [diff] [blame] | 1204 |         exts.append(Extension('pyexpat', | 
 | 1205 |                               define_macros = define_macros, | 
 | 1206 |                               include_dirs = [expatinc], | 
 | 1207 |                               sources = ['pyexpat.c', | 
 | 1208 |                                          'expat/xmlparse.c', | 
 | 1209 |                                          'expat/xmlrole.c', | 
 | 1210 |                                          'expat/xmltok.c', | 
 | 1211 |                                          ], | 
 | 1212 |                               )) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1213 |  | 
| Fredrik Lundh | 4c86ec6 | 2005-12-14 18:46:16 +0000 | [diff] [blame] | 1214 |         # Fredrik Lundh's cElementTree module.  Note that this also | 
 | 1215 |         # uses expat (via the CAPI hook in pyexpat). | 
 | 1216 |  | 
| Hye-Shik Chang | 6c40359 | 2006-03-27 08:43:11 +0000 | [diff] [blame] | 1217 |         if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')): | 
| Fredrik Lundh | 4c86ec6 | 2005-12-14 18:46:16 +0000 | [diff] [blame] | 1218 |             define_macros.append(('USE_PYEXPAT_CAPI', None)) | 
 | 1219 |             exts.append(Extension('_elementtree', | 
 | 1220 |                                   define_macros = define_macros, | 
 | 1221 |                                   include_dirs = [expatinc], | 
 | 1222 |                                   sources = ['_elementtree.c'], | 
 | 1223 |                                   )) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1224 |         else: | 
 | 1225 |             missing.append('_elementtree') | 
| Fredrik Lundh | 4c86ec6 | 2005-12-14 18:46:16 +0000 | [diff] [blame] | 1226 |  | 
| Hye-Shik Chang | 3e2a306 | 2004-01-17 14:29:29 +0000 | [diff] [blame] | 1227 |         # Hye-Shik Chang's CJKCodecs modules. | 
| Martin v. Löwis | e2713be | 2005-03-08 15:03:08 +0000 | [diff] [blame] | 1228 |         if have_unicode: | 
 | 1229 |             exts.append(Extension('_multibytecodec', | 
 | 1230 |                                   ['cjkcodecs/multibytecodec.c'])) | 
 | 1231 |             for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'): | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1232 |                 exts.append(Extension('_codecs_%s' % loc, | 
| Martin v. Löwis | e2713be | 2005-03-08 15:03:08 +0000 | [diff] [blame] | 1233 |                                       ['cjkcodecs/_codecs_%s.c' % loc])) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1234 |         else: | 
 | 1235 |             missing.append('_multibytecodec') | 
 | 1236 |             for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'): | 
 | 1237 |                 missing.append('_codecs_%s' % loc) | 
| Hye-Shik Chang | 3e2a306 | 2004-01-17 14:29:29 +0000 | [diff] [blame] | 1238 |  | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1239 |         # Dynamic loading module | 
| Guido van Rossum | 770acd3 | 2002-09-12 14:41:20 +0000 | [diff] [blame] | 1240 |         if sys.maxint == 0x7fffffff: | 
 | 1241 |             # This requires sizeof(int) == sizeof(long) == sizeof(char*) | 
 | 1242 |             dl_inc = find_file('dlfcn.h', [], inc_dirs) | 
| Anthony Baxter | 8220174 | 2006-04-09 15:07:40 +0000 | [diff] [blame] | 1243 |             if (dl_inc is not None) and (platform not in ['atheos']): | 
| Guido van Rossum | 770acd3 | 2002-09-12 14:41:20 +0000 | [diff] [blame] | 1244 |                 exts.append( Extension('dl', ['dlmodule.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1245 |             else: | 
 | 1246 |                 missing.append('dl') | 
 | 1247 |         else: | 
 | 1248 |             missing.append('dl') | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1249 |  | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1250 |         # Thomas Heller's _ctypes module | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1251 |         self.detect_ctypes(inc_dirs, lib_dirs) | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1252 |  | 
| Benjamin Peterson | 190d56e | 2008-06-11 02:40:25 +0000 | [diff] [blame] | 1253 |         # Richard Oudkerk's multiprocessing module | 
 | 1254 |         if platform == 'win32':             # Windows | 
 | 1255 |             macros = dict() | 
 | 1256 |             libraries = ['ws2_32'] | 
 | 1257 |  | 
 | 1258 |         elif platform == 'darwin':          # Mac OSX | 
 | 1259 |             macros = dict( | 
 | 1260 |                 HAVE_SEM_OPEN=1, | 
 | 1261 |                 HAVE_SEM_TIMEDWAIT=0, | 
 | 1262 |                 HAVE_FD_TRANSFER=1, | 
 | 1263 |                 HAVE_BROKEN_SEM_GETVALUE=1 | 
 | 1264 |                 ) | 
 | 1265 |             libraries = [] | 
 | 1266 |  | 
 | 1267 |         elif platform == 'cygwin':          # Cygwin | 
 | 1268 |             macros = dict( | 
 | 1269 |                 HAVE_SEM_OPEN=1, | 
 | 1270 |                 HAVE_SEM_TIMEDWAIT=1, | 
 | 1271 |                 HAVE_FD_TRANSFER=0, | 
 | 1272 |                 HAVE_BROKEN_SEM_UNLINK=1 | 
 | 1273 |                 ) | 
 | 1274 |             libraries = [] | 
| Hye-Shik Chang | 99c48a8 | 2008-06-28 01:04:31 +0000 | [diff] [blame] | 1275 |  | 
| Martin v. Löwis | 7f08c1f | 2008-11-04 20:43:31 +0000 | [diff] [blame] | 1276 |         elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'): | 
| Hye-Shik Chang | 99c48a8 | 2008-06-28 01:04:31 +0000 | [diff] [blame] | 1277 |             # FreeBSD's P1003.1b semaphore support is very experimental | 
 | 1278 |             # and has many known problems. (as of June 2008) | 
 | 1279 |             macros = dict(                  # FreeBSD | 
 | 1280 |                 HAVE_SEM_OPEN=0, | 
 | 1281 |                 HAVE_SEM_TIMEDWAIT=0, | 
 | 1282 |                 HAVE_FD_TRANSFER=1, | 
 | 1283 |                 ) | 
 | 1284 |             libraries = [] | 
 | 1285 |  | 
| Jesse Noller | 37040cd | 2008-09-30 00:15:45 +0000 | [diff] [blame] | 1286 |         elif platform.startswith('openbsd'): | 
 | 1287 |             macros = dict(                  # OpenBSD | 
 | 1288 |                 HAVE_SEM_OPEN=0,            # Not implemented | 
 | 1289 |                 HAVE_SEM_TIMEDWAIT=0, | 
 | 1290 |                 HAVE_FD_TRANSFER=1, | 
 | 1291 |                 ) | 
 | 1292 |             libraries = [] | 
 | 1293 |  | 
| Jesse Noller | 040bc1b | 2009-03-31 18:20:48 +0000 | [diff] [blame] | 1294 |         elif platform.startswith('netbsd'): | 
 | 1295 |             macros = dict(                  # at least NetBSD 5 | 
 | 1296 |                 HAVE_SEM_OPEN=1, | 
 | 1297 |                 HAVE_SEM_TIMEDWAIT=0, | 
 | 1298 |                 HAVE_FD_TRANSFER=1, | 
 | 1299 |                 HAVE_BROKEN_SEM_GETVALUE=1 | 
 | 1300 |                 ) | 
 | 1301 |             libraries = [] | 
 | 1302 |  | 
| Benjamin Peterson | 190d56e | 2008-06-11 02:40:25 +0000 | [diff] [blame] | 1303 |         else:                                   # Linux and other unices | 
 | 1304 |             macros = dict( | 
 | 1305 |                 HAVE_SEM_OPEN=1, | 
 | 1306 |                 HAVE_SEM_TIMEDWAIT=1, | 
 | 1307 |                 HAVE_FD_TRANSFER=1 | 
 | 1308 |                 ) | 
 | 1309 |             libraries = ['rt'] | 
 | 1310 |  | 
 | 1311 |         if platform == 'win32': | 
 | 1312 |             multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c', | 
 | 1313 |                                      '_multiprocessing/semaphore.c', | 
 | 1314 |                                      '_multiprocessing/pipe_connection.c', | 
 | 1315 |                                      '_multiprocessing/socket_connection.c', | 
 | 1316 |                                      '_multiprocessing/win32_functions.c' | 
 | 1317 |                                    ] | 
 | 1318 |  | 
 | 1319 |         else: | 
 | 1320 |             multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c', | 
 | 1321 |                                      '_multiprocessing/socket_connection.c' | 
 | 1322 |                                    ] | 
 | 1323 |  | 
 | 1324 |             if macros.get('HAVE_SEM_OPEN', False): | 
 | 1325 |                 multiprocessing_srcs.append('_multiprocessing/semaphore.c') | 
 | 1326 |  | 
 | 1327 |         exts.append ( Extension('_multiprocessing', multiprocessing_srcs, | 
 | 1328 |                                  define_macros=macros.items(), | 
 | 1329 |                                  include_dirs=["Modules/_multiprocessing"])) | 
 | 1330 |         # End multiprocessing | 
 | 1331 |  | 
 | 1332 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1333 |         # Platform-specific libraries | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 1334 |         if platform == 'linux2': | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1335 |             # Linux-specific modules | 
 | 1336 |             exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1337 |         else: | 
 | 1338 |             missing.append('linuxaudiodev') | 
| Greg Ward | 0a6355e | 2003-01-08 01:37:41 +0000 | [diff] [blame] | 1339 |  | 
| Hye-Shik Chang | 4e42281 | 2005-07-17 02:36:59 +0000 | [diff] [blame] | 1340 |         if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6', | 
| Hye-Shik Chang | ea68474 | 2007-10-28 12:38:09 +0000 | [diff] [blame] | 1341 |                         'freebsd7', 'freebsd8'): | 
| Guido van Rossum | 0c016a9 | 2003-02-13 16:12:21 +0000 | [diff] [blame] | 1342 |             exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1343 |         else: | 
 | 1344 |             missing.append('ossaudiodev') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1345 |  | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 1346 |         if platform == 'sunos5': | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1347 |             # SunOS specific modules | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1348 |             exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) ) | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1349 |         else: | 
 | 1350 |             missing.append('sunaudiodev') | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1351 |  | 
| Tim Peters | 66cb018 | 2004-08-26 05:23:19 +0000 | [diff] [blame] | 1352 |         if platform == 'darwin' and ("--disable-toolbox-glue" not in | 
| Ronald Oussoren | 090f815 | 2006-03-30 20:18:33 +0000 | [diff] [blame] | 1353 |                 sysconfig.get_config_var("CONFIG_ARGS")): | 
 | 1354 |  | 
 | 1355 |             if os.uname()[2] > '8.': | 
 | 1356 |                 # We're on Mac OS X 10.4 or later, the compiler should | 
 | 1357 |                 # support '-Wno-deprecated-declarations'. This will | 
 | 1358 |                 # surpress deprecation warnings for the Carbon extensions, | 
 | 1359 |                 # these extensions wrap the Carbon APIs and even those | 
 | 1360 |                 # parts that are deprecated. | 
 | 1361 |                 carbon_extra_compile_args = ['-Wno-deprecated-declarations'] | 
 | 1362 |             else: | 
 | 1363 |                 carbon_extra_compile_args = [] | 
 | 1364 |  | 
| Just van Rossum | 05ced6a | 2002-11-24 23:15:57 +0000 | [diff] [blame] | 1365 |             # Mac OS X specific modules. | 
| Neal Norwitz | 3e1ec3a | 2006-04-03 04:52:05 +0000 | [diff] [blame] | 1366 |             def macSrcExists(name1, name2=''): | 
 | 1367 |                 if not name1: | 
 | 1368 |                     return None | 
 | 1369 |                 names = (name1,) | 
 | 1370 |                 if name2: | 
 | 1371 |                     names = (name1, name2) | 
 | 1372 |                 path = os.path.join(srcdir, 'Mac', 'Modules', *names) | 
 | 1373 |                 return os.path.exists(path) | 
 | 1374 |  | 
 | 1375 |             def addMacExtension(name, kwds, extra_srcs=[]): | 
 | 1376 |                 dirname = '' | 
 | 1377 |                 if name[0] == '_': | 
 | 1378 |                     dirname = name[1:].lower() | 
 | 1379 |                 cname = name + '.c' | 
 | 1380 |                 cmodulename = name + 'module.c' | 
 | 1381 |                 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c | 
 | 1382 |                 if macSrcExists(cname): | 
 | 1383 |                     srcs = [cname] | 
 | 1384 |                 elif macSrcExists(cmodulename): | 
 | 1385 |                     srcs = [cmodulename] | 
 | 1386 |                 elif macSrcExists(dirname, cname): | 
 | 1387 |                     # XXX(nnorwitz): If all the names ended with module, we | 
 | 1388 |                     # wouldn't need this condition.  ibcarbon is the only one. | 
 | 1389 |                     srcs = [os.path.join(dirname, cname)] | 
 | 1390 |                 elif macSrcExists(dirname, cmodulename): | 
 | 1391 |                     srcs = [os.path.join(dirname, cmodulename)] | 
 | 1392 |                 else: | 
 | 1393 |                     raise RuntimeError("%s not found" % name) | 
 | 1394 |  | 
 | 1395 |                 # Here's the whole point:  add the extension with sources | 
 | 1396 |                 exts.append(Extension(name, srcs + extra_srcs, **kwds)) | 
 | 1397 |  | 
 | 1398 |             # Core Foundation | 
 | 1399 |             core_kwds = {'extra_compile_args': carbon_extra_compile_args, | 
 | 1400 |                          'extra_link_args': ['-framework', 'CoreFoundation'], | 
 | 1401 |                         } | 
 | 1402 |             addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c']) | 
 | 1403 |             addMacExtension('autoGIL', core_kwds) | 
 | 1404 |  | 
 | 1405 |             # Carbon | 
 | 1406 |             carbon_kwds = {'extra_compile_args': carbon_extra_compile_args, | 
 | 1407 |                            'extra_link_args': ['-framework', 'Carbon'], | 
 | 1408 |                           } | 
| Anthony Baxter | a2a26b9 | 2006-04-05 17:30:38 +0000 | [diff] [blame] | 1409 |             CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav', | 
 | 1410 |                            'OSATerminology', 'icglue', | 
| Neal Norwitz | 3e1ec3a | 2006-04-03 04:52:05 +0000 | [diff] [blame] | 1411 |                            # All these are in subdirs | 
| Anthony Baxter | a2a26b9 | 2006-04-05 17:30:38 +0000 | [diff] [blame] | 1412 |                            '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl', | 
| Neal Norwitz | 3e1ec3a | 2006-04-03 04:52:05 +0000 | [diff] [blame] | 1413 |                            '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm', | 
| Anthony Baxter | a2a26b9 | 2006-04-05 17:30:38 +0000 | [diff] [blame] | 1414 |                            '_Help', '_Icn', '_IBCarbon', '_List', | 
 | 1415 |                            '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs', | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 1416 |                            '_Scrap', '_Snd', '_TE', | 
| Anthony Baxter | a2a26b9 | 2006-04-05 17:30:38 +0000 | [diff] [blame] | 1417 |                           ] | 
| Neal Norwitz | 3e1ec3a | 2006-04-03 04:52:05 +0000 | [diff] [blame] | 1418 |             for name in CARBON_EXTS: | 
 | 1419 |                 addMacExtension(name, carbon_kwds) | 
 | 1420 |  | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 1421 |             # Workaround for a bug in the version of gcc shipped with Xcode 3. | 
 | 1422 |             # The _Win extension should build just like the other Carbon extensions, but | 
 | 1423 |             # this actually results in a hard crash of the linker. | 
 | 1424 |             # | 
 | 1425 |             if '-arch ppc64' in cflags and '-arch ppc' in cflags: | 
 | 1426 |                 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'], | 
 | 1427 |                                'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'], | 
 | 1428 |                            } | 
 | 1429 |                 addMacExtension('_Win', win_kwds) | 
 | 1430 |             else: | 
 | 1431 |                 addMacExtension('_Win', carbon_kwds) | 
 | 1432 |  | 
 | 1433 |  | 
| Neal Norwitz | 3e1ec3a | 2006-04-03 04:52:05 +0000 | [diff] [blame] | 1434 |             # Application Services & QuickTime | 
 | 1435 |             app_kwds = {'extra_compile_args': carbon_extra_compile_args, | 
 | 1436 |                         'extra_link_args': ['-framework','ApplicationServices'], | 
 | 1437 |                        } | 
 | 1438 |             addMacExtension('_Launch', app_kwds) | 
 | 1439 |             addMacExtension('_CG', app_kwds) | 
 | 1440 |  | 
| Just van Rossum | 05ced6a | 2002-11-24 23:15:57 +0000 | [diff] [blame] | 1441 |             exts.append( Extension('_Qt', ['qt/_Qtmodule.c'], | 
| Ronald Oussoren | 090f815 | 2006-03-30 20:18:33 +0000 | [diff] [blame] | 1442 |                         extra_compile_args=carbon_extra_compile_args, | 
 | 1443 |                         extra_link_args=['-framework', 'QuickTime', | 
| Just van Rossum | 05ced6a | 2002-11-24 23:15:57 +0000 | [diff] [blame] | 1444 |                                      '-framework', 'Carbon']) ) | 
| Neal Norwitz | 3e1ec3a | 2006-04-03 04:52:05 +0000 | [diff] [blame] | 1445 |  | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1446 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1447 |         self.extensions.extend(exts) | 
 | 1448 |  | 
 | 1449 |         # Call the method for detecting whether _tkinter can be compiled | 
 | 1450 |         self.detect_tkinter(inc_dirs, lib_dirs) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1451 |  | 
| Skip Montanaro | d128732 | 2007-03-06 15:41:38 +0000 | [diff] [blame] | 1452 |         if '_tkinter' not in [e.name for e in self.extensions]: | 
 | 1453 |             missing.append('_tkinter') | 
 | 1454 |  | 
 | 1455 |         return missing | 
 | 1456 |  | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1457 |     def detect_tkinter_darwin(self, inc_dirs, lib_dirs): | 
 | 1458 |         # The _tkinter module, using frameworks. Since frameworks are quite | 
 | 1459 |         # different the UNIX search logic is not sharable. | 
 | 1460 |         from os.path import join, exists | 
 | 1461 |         framework_dirs = [ | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1462 |             '/Library/Frameworks', | 
| Ronald Oussoren | 5302a30 | 2009-03-04 21:30:52 +0000 | [diff] [blame] | 1463 |             '/System/Library/Frameworks/', | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1464 |             join(os.getenv('HOME'), '/Library/Frameworks') | 
 | 1465 |         ] | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1466 |  | 
| Skip Montanaro | 0174ddd | 2005-12-30 05:01:26 +0000 | [diff] [blame] | 1467 |         # Find the directory that contains the Tcl.framework and Tk.framework | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1468 |         # bundles. | 
 | 1469 |         # XXX distutils should support -F! | 
 | 1470 |         for F in framework_dirs: | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1471 |             # both Tcl.framework and Tk.framework should be present | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1472 |             for fw in 'Tcl', 'Tk': | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1473 |                 if not exists(join(F, fw + '.framework')): | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1474 |                     break | 
 | 1475 |             else: | 
 | 1476 |                 # ok, F is now directory with both frameworks. Continure | 
 | 1477 |                 # building | 
 | 1478 |                 break | 
 | 1479 |         else: | 
 | 1480 |             # Tk and Tcl frameworks not found. Normal "unix" tkinter search | 
 | 1481 |             # will now resume. | 
 | 1482 |             return 0 | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1483 |  | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1484 |         # For 8.4a2, we must add -I options that point inside the Tcl and Tk | 
 | 1485 |         # frameworks. In later release we should hopefully be able to pass | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1486 |         # the -F option to gcc, which specifies a framework lookup path. | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1487 |         # | 
 | 1488 |         include_dirs = [ | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1489 |             join(F, fw + '.framework', H) | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1490 |             for fw in 'Tcl', 'Tk' | 
 | 1491 |             for H in 'Headers', 'Versions/Current/PrivateHeaders' | 
 | 1492 |         ] | 
 | 1493 |  | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1494 |         # For 8.4a2, the X11 headers are not included. Rather than include a | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1495 |         # complicated search, this is a hard-coded path. It could bail out | 
 | 1496 |         # if X11 libs are not found... | 
 | 1497 |         include_dirs.append('/usr/X11R6/include') | 
 | 1498 |         frameworks = ['-framework', 'Tcl', '-framework', 'Tk'] | 
 | 1499 |  | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 1500 |         # All existing framework builds of Tcl/Tk don't support 64-bit | 
 | 1501 |         # architectures. | 
 | 1502 |         cflags = sysconfig.get_config_vars('CFLAGS')[0] | 
 | 1503 |         archs = re.findall('-arch\s+(\w+)', cflags) | 
 | 1504 |         if 'x86_64' in archs or 'ppc64' in archs: | 
 | 1505 |             try: | 
 | 1506 |                 archs.remove('x86_64') | 
 | 1507 |             except ValueError: | 
 | 1508 |                 pass | 
 | 1509 |             try: | 
 | 1510 |                 archs.remove('ppc64') | 
 | 1511 |             except ValueError: | 
 | 1512 |                 pass | 
 | 1513 |  | 
 | 1514 |             for a in archs: | 
 | 1515 |                 frameworks.append('-arch') | 
 | 1516 |                 frameworks.append(a) | 
 | 1517 |  | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1518 |         ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], | 
 | 1519 |                         define_macros=[('WITH_APPINIT', 1)], | 
 | 1520 |                         include_dirs = include_dirs, | 
 | 1521 |                         libraries = [], | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 1522 |                         extra_compile_args = frameworks[2:], | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1523 |                         extra_link_args = frameworks, | 
 | 1524 |                         ) | 
 | 1525 |         self.extensions.append(ext) | 
 | 1526 |         return 1 | 
 | 1527 |  | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1528 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1529 |     def detect_tkinter(self, inc_dirs, lib_dirs): | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1530 |         # The _tkinter module. | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1531 |  | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1532 |         # Rather than complicate the code below, detecting and building | 
 | 1533 |         # AquaTk is a separate method. Only one Tkinter will be built on | 
 | 1534 |         # Darwin - either AquaTk, if it is found, or X11 based Tk. | 
 | 1535 |         platform = self.get_platform() | 
| Skip Montanaro | 0174ddd | 2005-12-30 05:01:26 +0000 | [diff] [blame] | 1536 |         if (platform == 'darwin' and | 
 | 1537 |             self.detect_tkinter_darwin(inc_dirs, lib_dirs)): | 
| Tim Peters | 2c60f7a | 2003-01-29 03:49:43 +0000 | [diff] [blame] | 1538 |             return | 
| Jack Jansen | 0b06be7 | 2002-06-21 14:48:38 +0000 | [diff] [blame] | 1539 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1540 |         # Assume we haven't found any of the libraries or include files | 
| Martin v. Löwis | 3db5b8c | 2001-07-24 06:54:01 +0000 | [diff] [blame] | 1541 |         # The versions with dots are used on Unix, and the versions without | 
 | 1542 |         # dots on Windows, for detection by cygwin. | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1543 |         tcllib = tklib = tcl_includes = tk_includes = None | 
| Andrew M. Kuchling | 4c4a45d | 2004-03-21 18:59:46 +0000 | [diff] [blame] | 1544 |         for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2', | 
| Martin v. Löwis | 3db5b8c | 2001-07-24 06:54:01 +0000 | [diff] [blame] | 1545 |                         '82', '8.1', '81', '8.0', '80']: | 
| Jason Tishler | cccac1a | 2003-02-05 15:06:46 +0000 | [diff] [blame] | 1546 |             tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version) | 
 | 1547 |             tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version) | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1548 |             if tklib and tcllib: | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1549 |                 # Exit the loop when we've found the Tcl/Tk libraries | 
 | 1550 |                 break | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1551 |  | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1552 |         # Now check for the header files | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1553 |         if tklib and tcllib: | 
| Andrew M. Kuchling | 3c0aa7e | 2004-03-21 18:57:35 +0000 | [diff] [blame] | 1554 |             # Check for the include files on Debian and {Free,Open}BSD, where | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1555 |             # they're put in /usr/include/{tcl,tk}X.Y | 
| Andrew M. Kuchling | 3c0aa7e | 2004-03-21 18:57:35 +0000 | [diff] [blame] | 1556 |             dotversion = version | 
 | 1557 |             if '.' not in dotversion and "bsd" in sys.platform.lower(): | 
 | 1558 |                 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a, | 
 | 1559 |                 # but the include subdirs are named like .../include/tcl8.3. | 
 | 1560 |                 dotversion = dotversion[:-1] + '.' + dotversion[-1] | 
 | 1561 |             tcl_include_sub = [] | 
 | 1562 |             tk_include_sub = [] | 
 | 1563 |             for dir in inc_dirs: | 
 | 1564 |                 tcl_include_sub += [dir + os.sep + "tcl" + dotversion] | 
 | 1565 |                 tk_include_sub += [dir + os.sep + "tk" + dotversion] | 
 | 1566 |             tk_include_sub += tcl_include_sub | 
 | 1567 |             tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub) | 
 | 1568 |             tk_includes = find_file('tk.h', inc_dirs, tk_include_sub) | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1569 |  | 
| Martin v. Löwis | e86a59a | 2003-05-03 08:45:51 +0000 | [diff] [blame] | 1570 |         if (tcllib is None or tklib is None or | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1571 |             tcl_includes is None or tk_includes is None): | 
| Andrew M. Kuchling | 3c0aa7e | 2004-03-21 18:57:35 +0000 | [diff] [blame] | 1572 |             self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2) | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1573 |             return | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1574 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1575 |         # OK... everything seems to be present for Tcl/Tk. | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1576 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1577 |         include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = [] | 
 | 1578 |         for dir in tcl_includes + tk_includes: | 
 | 1579 |             if dir not in include_dirs: | 
 | 1580 |                 include_dirs.append(dir) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1581 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1582 |         # Check for various platform-specific directories | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 1583 |         if platform == 'sunos5': | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1584 |             include_dirs.append('/usr/openwin/include') | 
 | 1585 |             added_lib_dirs.append('/usr/openwin/lib') | 
 | 1586 |         elif os.path.exists('/usr/X11R6/include'): | 
 | 1587 |             include_dirs.append('/usr/X11R6/include') | 
| Martin v. Löwis | fba7369 | 2004-11-13 11:13:35 +0000 | [diff] [blame] | 1588 |             added_lib_dirs.append('/usr/X11R6/lib64') | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1589 |             added_lib_dirs.append('/usr/X11R6/lib') | 
 | 1590 |         elif os.path.exists('/usr/X11R5/include'): | 
 | 1591 |             include_dirs.append('/usr/X11R5/include') | 
 | 1592 |             added_lib_dirs.append('/usr/X11R5/lib') | 
 | 1593 |         else: | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1594 |             # Assume default location for X11 | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1595 |             include_dirs.append('/usr/X11/include') | 
 | 1596 |             added_lib_dirs.append('/usr/X11/lib') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1597 |  | 
| Jason Tishler | 9181c94 | 2003-02-05 15:16:17 +0000 | [diff] [blame] | 1598 |         # If Cygwin, then verify that X is installed before proceeding | 
 | 1599 |         if platform == 'cygwin': | 
 | 1600 |             x11_inc = find_file('X11/Xlib.h', [], include_dirs) | 
 | 1601 |             if x11_inc is None: | 
 | 1602 |                 return | 
 | 1603 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1604 |         # Check for BLT extension | 
| Fred Drake | 38419c0 | 2001-12-06 22:24:47 +0000 | [diff] [blame] | 1605 |         if self.compiler.find_library_file(lib_dirs + added_lib_dirs, | 
 | 1606 |                                            'BLT8.0'): | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1607 |             defs.append( ('WITH_BLT', 1) ) | 
 | 1608 |             libs.append('BLT8.0') | 
| Martin v. Löwis | 427a290 | 2002-12-12 20:23:38 +0000 | [diff] [blame] | 1609 |         elif self.compiler.find_library_file(lib_dirs + added_lib_dirs, | 
 | 1610 |                                            'BLT'): | 
 | 1611 |             defs.append( ('WITH_BLT', 1) ) | 
 | 1612 |             libs.append('BLT') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1613 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1614 |         # Add the Tcl/Tk libraries | 
| Jason Tishler | cccac1a | 2003-02-05 15:06:46 +0000 | [diff] [blame] | 1615 |         libs.append('tk'+ version) | 
 | 1616 |         libs.append('tcl'+ version) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1617 |  | 
| Andrew M. Kuchling | 34febf5 | 2001-01-24 03:31:07 +0000 | [diff] [blame] | 1618 |         if platform in ['aix3', 'aix4']: | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1619 |             libs.append('ld') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1620 |  | 
| Martin v. Löwis | 3db5b8c | 2001-07-24 06:54:01 +0000 | [diff] [blame] | 1621 |         # Finally, link with the X11 libraries (not appropriate on cygwin) | 
 | 1622 |         if platform != "cygwin": | 
 | 1623 |             libs.append('X11') | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1624 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1625 |         ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'], | 
 | 1626 |                         define_macros=[('WITH_APPINIT', 1)] + defs, | 
 | 1627 |                         include_dirs = include_dirs, | 
 | 1628 |                         libraries = libs, | 
 | 1629 |                         library_dirs = added_lib_dirs, | 
 | 1630 |                         ) | 
 | 1631 |         self.extensions.append(ext) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1632 |  | 
| Guido van Rossum | 6c7438e | 2003-02-11 20:05:50 +0000 | [diff] [blame] | 1633 | ##         # Uncomment these lines if you want to play with xxmodule.c | 
 | 1634 | ##         ext = Extension('xx', ['xxmodule.c']) | 
 | 1635 | ##         self.extensions.append(ext) | 
 | 1636 |  | 
| Andrew M. Kuchling | fbe7376 | 2001-01-18 18:44:20 +0000 | [diff] [blame] | 1637 |         # XXX handle these, but how to detect? | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1638 |         # *** Uncomment and edit for PIL (TkImaging) extension only: | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1639 |         #       -DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \ | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1640 |         # *** Uncomment and edit for TOGL extension only: | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1641 |         #       -DWITH_TOGL togl.c \ | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1642 |         # *** Uncomment these for TOGL extension only: | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1643 |         #       -lGL -lGLU -lXext -lXmu \ | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1644 |  | 
| Thomas Heller | 8bdf81d | 2008-03-04 20:09:11 +0000 | [diff] [blame] | 1645 |     def configure_ctypes_darwin(self, ext): | 
 | 1646 |         # Darwin (OS X) uses preconfigured files, in | 
 | 1647 |         # the Modules/_ctypes/libffi_osx directory. | 
 | 1648 |         (srcdir,) = sysconfig.get_config_vars('srcdir') | 
 | 1649 |         ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', | 
 | 1650 |                                                   '_ctypes', 'libffi_osx')) | 
 | 1651 |         sources = [os.path.join(ffi_srcdir, p) | 
 | 1652 |                    for p in ['ffi.c', | 
| Ronald Oussoren | 5640ce2 | 2008-06-05 12:58:24 +0000 | [diff] [blame] | 1653 |                              'x86/darwin64.S', | 
| Thomas Heller | 8bdf81d | 2008-03-04 20:09:11 +0000 | [diff] [blame] | 1654 |                              'x86/x86-darwin.S', | 
 | 1655 |                              'x86/x86-ffi_darwin.c', | 
 | 1656 |                              'x86/x86-ffi64.c', | 
 | 1657 |                              'powerpc/ppc-darwin.S', | 
 | 1658 |                              'powerpc/ppc-darwin_closure.S', | 
 | 1659 |                              'powerpc/ppc-ffi_darwin.c', | 
 | 1660 |                              'powerpc/ppc64-darwin_closure.S', | 
 | 1661 |                              ]] | 
 | 1662 |  | 
 | 1663 |         # Add .S (preprocessed assembly) to C compiler source extensions. | 
 | 1664 |         self.compiler.src_extensions.append('.S') | 
 | 1665 |  | 
 | 1666 |         include_dirs = [os.path.join(ffi_srcdir, 'include'), | 
 | 1667 |                         os.path.join(ffi_srcdir, 'powerpc')] | 
 | 1668 |         ext.include_dirs.extend(include_dirs) | 
 | 1669 |         ext.sources.extend(sources) | 
 | 1670 |         return True | 
 | 1671 |  | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 1672 |     def configure_ctypes(self, ext): | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1673 |         if not self.use_system_libffi: | 
| Thomas Heller | 8bdf81d | 2008-03-04 20:09:11 +0000 | [diff] [blame] | 1674 |             if sys.platform == 'darwin': | 
 | 1675 |                 return self.configure_ctypes_darwin(ext) | 
 | 1676 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1677 |             (srcdir,) = sysconfig.get_config_vars('srcdir') | 
 | 1678 |             ffi_builddir = os.path.join(self.build_temp, 'libffi') | 
 | 1679 |             ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules', | 
 | 1680 |                                          '_ctypes', 'libffi')) | 
 | 1681 |             ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py') | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1682 |  | 
| Thomas Heller | 5e218b4 | 2006-04-27 15:50:42 +0000 | [diff] [blame] | 1683 |             from distutils.dep_util import newer_group | 
 | 1684 |  | 
 | 1685 |             config_sources = [os.path.join(ffi_srcdir, fname) | 
| Martin v. Löwis | f1a4aa3 | 2007-02-14 11:30:56 +0000 | [diff] [blame] | 1686 |                               for fname in os.listdir(ffi_srcdir) | 
 | 1687 |                               if os.path.isfile(os.path.join(ffi_srcdir, fname))] | 
| Thomas Heller | 5e218b4 | 2006-04-27 15:50:42 +0000 | [diff] [blame] | 1688 |             if self.force or newer_group(config_sources, | 
 | 1689 |                                          ffi_configfile): | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1690 |                 from distutils.dir_util import mkpath | 
 | 1691 |                 mkpath(ffi_builddir) | 
 | 1692 |                 config_args = [] | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1693 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1694 |                 # Pass empty CFLAGS because we'll just append the resulting | 
 | 1695 |                 # CFLAGS to Python's; -g or -O2 is to be avoided. | 
 | 1696 |                 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \ | 
 | 1697 |                       % (ffi_builddir, ffi_srcdir, " ".join(config_args)) | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1698 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1699 |                 res = os.system(cmd) | 
 | 1700 |                 if res or not os.path.exists(ffi_configfile): | 
 | 1701 |                     print "Failed to configure _ctypes module" | 
 | 1702 |                     return False | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1703 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1704 |             fficonfig = {} | 
 | 1705 |             execfile(ffi_configfile, globals(), fficonfig) | 
 | 1706 |             ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src') | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1707 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1708 |             # Add .S (preprocessed assembly) to C compiler source extensions. | 
 | 1709 |             self.compiler.src_extensions.append('.S') | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1710 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1711 |             include_dirs = [os.path.join(ffi_builddir, 'include'), | 
 | 1712 |                             ffi_builddir, ffi_srcdir] | 
 | 1713 |             extra_compile_args = fficonfig['ffi_cflags'].split() | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 1714 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1715 |             ext.sources.extend(fficonfig['ffi_sources']) | 
 | 1716 |             ext.include_dirs.extend(include_dirs) | 
 | 1717 |             ext.extra_compile_args.extend(extra_compile_args) | 
| Thomas Heller | 795246c | 2006-04-07 19:27:56 +0000 | [diff] [blame] | 1718 |         return True | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 1719 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1720 |     def detect_ctypes(self, inc_dirs, lib_dirs): | 
 | 1721 |         self.use_system_libffi = False | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 1722 |         include_dirs = [] | 
 | 1723 |         extra_compile_args = [] | 
| Thomas Heller | 1798489 | 2006-08-04 18:57:34 +0000 | [diff] [blame] | 1724 |         extra_link_args = [] | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1725 |         sources = ['_ctypes/_ctypes.c', | 
 | 1726 |                    '_ctypes/callbacks.c', | 
 | 1727 |                    '_ctypes/callproc.c', | 
 | 1728 |                    '_ctypes/stgdict.c', | 
 | 1729 |                    '_ctypes/cfield.c', | 
| Thomas Heller | eba43c1 | 2006-04-07 19:04:09 +0000 | [diff] [blame] | 1730 |                    '_ctypes/malloc_closure.c'] | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1731 |         depends = ['_ctypes/ctypes.h'] | 
 | 1732 |  | 
 | 1733 |         if sys.platform == 'darwin': | 
 | 1734 |             sources.append('_ctypes/darwin/dlfcn_simple.c') | 
| Thomas Heller | 8bdf81d | 2008-03-04 20:09:11 +0000 | [diff] [blame] | 1735 |             extra_compile_args.append('-DMACOSX') | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1736 |             include_dirs.append('_ctypes/darwin') | 
 | 1737 | # XXX Is this still needed? | 
 | 1738 | ##            extra_link_args.extend(['-read_only_relocs', 'warning']) | 
 | 1739 |  | 
| Thomas Heller | 1798489 | 2006-08-04 18:57:34 +0000 | [diff] [blame] | 1740 |         elif sys.platform == 'sunos5': | 
| Martin v. Löwis | 73f12a3 | 2006-08-09 23:42:18 +0000 | [diff] [blame] | 1741 |             # XXX This shouldn't be necessary; it appears that some | 
 | 1742 |             # of the assembler code is non-PIC (i.e. it has relocations | 
 | 1743 |             # when it shouldn't. The proper fix would be to rewrite | 
 | 1744 |             # the assembler code to be PIC. | 
 | 1745 |             # This only works with GCC; the Sun compiler likely refuses | 
 | 1746 |             # this option. If you want to compile ctypes with the Sun | 
 | 1747 |             # compiler, please research a proper solution, instead of | 
 | 1748 |             # finding some -z option for the Sun compiler. | 
| Thomas Heller | 1798489 | 2006-08-04 18:57:34 +0000 | [diff] [blame] | 1749 |             extra_link_args.append('-mimpure-text') | 
 | 1750 |  | 
| Thomas Heller | de2d78a | 2008-06-02 18:41:30 +0000 | [diff] [blame] | 1751 |         elif sys.platform.startswith('hp-ux'): | 
| Thomas Heller | 03b75dd | 2008-05-20 19:53:47 +0000 | [diff] [blame] | 1752 |             extra_link_args.append('-fPIC') | 
 | 1753 |  | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1754 |         ext = Extension('_ctypes', | 
 | 1755 |                         include_dirs=include_dirs, | 
 | 1756 |                         extra_compile_args=extra_compile_args, | 
| Thomas Heller | 1798489 | 2006-08-04 18:57:34 +0000 | [diff] [blame] | 1757 |                         extra_link_args=extra_link_args, | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1758 |                         libraries=[], | 
| Thomas Heller | cf567c1 | 2006-03-08 19:51:58 +0000 | [diff] [blame] | 1759 |                         sources=sources, | 
 | 1760 |                         depends=depends) | 
 | 1761 |         ext_test = Extension('_ctypes_test', | 
 | 1762 |                              sources=['_ctypes/_ctypes_test.c']) | 
 | 1763 |         self.extensions.extend([ext, ext_test]) | 
 | 1764 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1765 |         if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"): | 
 | 1766 |             return | 
 | 1767 |  | 
| Thomas Heller | 8bdf81d | 2008-03-04 20:09:11 +0000 | [diff] [blame] | 1768 |         if sys.platform == 'darwin': | 
 | 1769 |             # OS X 10.5 comes with libffi.dylib; the include files are | 
 | 1770 |             # in /usr/include/ffi | 
 | 1771 |             inc_dirs.append('/usr/include/ffi') | 
 | 1772 |  | 
| Martin v. Löwis | 9176fc1 | 2006-04-11 11:12:43 +0000 | [diff] [blame] | 1773 |         ffi_inc = find_file('ffi.h', [], inc_dirs) | 
 | 1774 |         if ffi_inc is not None: | 
 | 1775 |             ffi_h = ffi_inc[0] + '/ffi.h' | 
 | 1776 |             fp = open(ffi_h) | 
 | 1777 |             while 1: | 
 | 1778 |                 line = fp.readline() | 
 | 1779 |                 if not line: | 
 | 1780 |                     ffi_inc = None | 
 | 1781 |                     break | 
 | 1782 |                 if line.startswith('#define LIBFFI_H'): | 
 | 1783 |                     break | 
 | 1784 |         ffi_lib = None | 
 | 1785 |         if ffi_inc is not None: | 
 | 1786 |             for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'): | 
 | 1787 |                 if (self.compiler.find_library_file(lib_dirs, lib_name)): | 
 | 1788 |                     ffi_lib = lib_name | 
 | 1789 |                     break | 
 | 1790 |  | 
 | 1791 |         if ffi_inc and ffi_lib: | 
 | 1792 |             ext.include_dirs.extend(ffi_inc) | 
 | 1793 |             ext.libraries.append(ffi_lib) | 
 | 1794 |             self.use_system_libffi = True | 
 | 1795 |  | 
 | 1796 |  | 
| Andrew M. Kuchling | f52d27e | 2001-05-21 20:29:27 +0000 | [diff] [blame] | 1797 | class PyBuildInstall(install): | 
 | 1798 |     # Suppress the warning about installation into the lib_dynload | 
 | 1799 |     # directory, which is not in sys.path when running Python during | 
 | 1800 |     # installation: | 
 | 1801 |     def initialize_options (self): | 
 | 1802 |         install.initialize_options(self) | 
 | 1803 |         self.warn_dir=0 | 
| Michael W. Hudson | 5b10910 | 2002-01-23 15:04:41 +0000 | [diff] [blame] | 1804 |  | 
| Michael W. Hudson | 529a505 | 2002-12-17 16:47:17 +0000 | [diff] [blame] | 1805 | class PyBuildInstallLib(install_lib): | 
 | 1806 |     # Do exactly what install_lib does but make sure correct access modes get | 
 | 1807 |     # set on installed directories and files. All installed files with get | 
 | 1808 |     # mode 644 unless they are a shared library in which case they will get | 
 | 1809 |     # mode 755. All installed directories will get mode 755. | 
 | 1810 |  | 
 | 1811 |     so_ext = sysconfig.get_config_var("SO") | 
 | 1812 |  | 
 | 1813 |     def install(self): | 
 | 1814 |         outfiles = install_lib.install(self) | 
 | 1815 |         self.set_file_modes(outfiles, 0644, 0755) | 
 | 1816 |         self.set_dir_modes(self.install_dir, 0755) | 
 | 1817 |         return outfiles | 
 | 1818 |  | 
 | 1819 |     def set_file_modes(self, files, defaultMode, sharedLibMode): | 
 | 1820 |         if not self.is_chmod_supported(): return | 
 | 1821 |         if not files: return | 
 | 1822 |  | 
 | 1823 |         for filename in files: | 
 | 1824 |             if os.path.islink(filename): continue | 
 | 1825 |             mode = defaultMode | 
 | 1826 |             if filename.endswith(self.so_ext): mode = sharedLibMode | 
 | 1827 |             log.info("changing mode of %s to %o", filename, mode) | 
 | 1828 |             if not self.dry_run: os.chmod(filename, mode) | 
 | 1829 |  | 
 | 1830 |     def set_dir_modes(self, dirname, mode): | 
 | 1831 |         if not self.is_chmod_supported(): return | 
 | 1832 |         os.path.walk(dirname, self.set_dir_modes_visitor, mode) | 
 | 1833 |  | 
 | 1834 |     def set_dir_modes_visitor(self, mode, dirname, names): | 
 | 1835 |         if os.path.islink(dirname): return | 
 | 1836 |         log.info("changing mode of %s to %o", dirname, mode) | 
 | 1837 |         if not self.dry_run: os.chmod(dirname, mode) | 
 | 1838 |  | 
 | 1839 |     def is_chmod_supported(self): | 
 | 1840 |         return hasattr(os, 'chmod') | 
 | 1841 |  | 
| Guido van Rossum | 14ee89c | 2003-02-20 02:52:04 +0000 | [diff] [blame] | 1842 | SUMMARY = """ | 
 | 1843 | Python is an interpreted, interactive, object-oriented programming | 
 | 1844 | language. It is often compared to Tcl, Perl, Scheme or Java. | 
 | 1845 |  | 
 | 1846 | Python combines remarkable power with very clear syntax. It has | 
 | 1847 | modules, classes, exceptions, very high level dynamic data types, and | 
 | 1848 | dynamic typing. There are interfaces to many system calls and | 
 | 1849 | libraries, as well as to various windowing systems (X11, Motif, Tk, | 
 | 1850 | Mac, MFC). New built-in modules are easily written in C or C++. Python | 
 | 1851 | is also usable as an extension language for applications that need a | 
 | 1852 | programmable interface. | 
 | 1853 |  | 
 | 1854 | The Python implementation is portable: it runs on many brands of UNIX, | 
 | 1855 | on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't | 
 | 1856 | listed here, it may still be supported, if there's a C compiler for | 
 | 1857 | it. Ask around on comp.lang.python -- or just try compiling Python | 
 | 1858 | yourself. | 
 | 1859 | """ | 
 | 1860 |  | 
 | 1861 | CLASSIFIERS = """ | 
| Guido van Rossum | 14ee89c | 2003-02-20 02:52:04 +0000 | [diff] [blame] | 1862 | Development Status :: 6 - Mature | 
 | 1863 | License :: OSI Approved :: Python Software Foundation License | 
 | 1864 | Natural Language :: English | 
 | 1865 | Programming Language :: C | 
 | 1866 | Programming Language :: Python | 
 | 1867 | Topic :: Software Development | 
 | 1868 | """ | 
 | 1869 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1870 | def main(): | 
| Andrew M. Kuchling | 6268669 | 2001-05-21 20:48:09 +0000 | [diff] [blame] | 1871 |     # turn off warnings when deprecated modules are imported | 
 | 1872 |     import warnings | 
 | 1873 |     warnings.filterwarnings("ignore",category=DeprecationWarning) | 
| Guido van Rossum | 14ee89c | 2003-02-20 02:52:04 +0000 | [diff] [blame] | 1874 |     setup(# PyPI Metadata (PEP 301) | 
 | 1875 |           name = "Python", | 
 | 1876 |           version = sys.version.split()[0], | 
 | 1877 |           url = "http://www.python.org/%s" % sys.version[:3], | 
 | 1878 |           maintainer = "Guido van Rossum and the Python community", | 
 | 1879 |           maintainer_email = "python-dev@python.org", | 
 | 1880 |           description = "A high-level object-oriented programming language", | 
 | 1881 |           long_description = SUMMARY.strip(), | 
 | 1882 |           license = "PSF license", | 
 | 1883 |           classifiers = filter(None, CLASSIFIERS.split("\n")), | 
 | 1884 |           platforms = ["Many"], | 
 | 1885 |  | 
 | 1886 |           # Build info | 
| Michael W. Hudson | 529a505 | 2002-12-17 16:47:17 +0000 | [diff] [blame] | 1887 |           cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall, | 
 | 1888 |                       'install_lib':PyBuildInstallLib}, | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1889 |           # The struct module is defined here, because build_ext won't be | 
 | 1890 |           # called unless there's at least one extension module defined. | 
| Bob Ippolito | 7ccc95a | 2006-05-23 19:11:34 +0000 | [diff] [blame] | 1891 |           ext_modules=[Extension('_struct', ['_struct.c'])], | 
| Andrew M. Kuchling | aece427 | 2001-02-28 20:56:49 +0000 | [diff] [blame] | 1892 |  | 
 | 1893 |           # Scripts to install | 
| Skip Montanaro | 852f799 | 2004-06-26 22:29:42 +0000 | [diff] [blame] | 1894 |           scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle', | 
| Martin v. Löwis | cdbc977 | 2008-03-24 12:57:53 +0000 | [diff] [blame] | 1895 |                      'Tools/scripts/2to3', | 
| Skip Montanaro | 852f799 | 2004-06-26 22:29:42 +0000 | [diff] [blame] | 1896 |                      'Lib/smtpd.py'] | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1897 |         ) | 
| Fredrik Lundh | ade711a | 2001-01-24 08:00:28 +0000 | [diff] [blame] | 1898 |  | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1899 | # --install-platlib | 
 | 1900 | if __name__ == '__main__': | 
| Andrew M. Kuchling | 00e0f21 | 2001-01-17 15:23:23 +0000 | [diff] [blame] | 1901 |     main() |