setup.py revision 1798489547a259876c495280dcd5d649269967f3
166012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling# Autodetecting setup.py script for building the Python extensions
266012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling#
3ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
466012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling__version__ = "$Revision$"
566012fe889db4ad88326f739f2e7cd7cb693f52aAndrew M. Kuchling
684667c063a1e93a985134f7cef376edf82941c02Brett Cannonimport sys, os, imp, re, optparse
7529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
8529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonfrom distutils import log
900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils import sysconfig
108d7f0869ee672d7e9e8e1bf126bf717d8223ee2bAndrew M. Kuchlingfrom distutils import text_file
117c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburgfrom distutils.errors import *
1200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils.core import Extension, setup
1300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils.command.build_ext import build_ext
14f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchlingfrom distutils.command.install import install
15529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonfrom distutils.command.install_lib import install_lib
1600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
1700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling# This global variable is used to hold the list of modules to be disabled.
1800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdisabled_module_list = []
1900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
2039230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudsondef add_dir_to_list(dirlist, dir):
2139230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson    """Add the directory 'dir' to the list 'dirlist' (at the front) if
2239230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson    1) 'dir' is not already in 'dirlist'
2339230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson    2) 'dir' actually exists, and is a directory."""
244439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen    if dir is not None and os.path.isdir(dir) and dir not in dirlist:
2539230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson        dirlist.insert(0, dir)
2639230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson
27fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchlingdef find_file(filename, std_dirs, paths):
28fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    """Searches for the directory where a given file is located,
29fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    and returns a possibly-empty list of additional directories, or None
30fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    if the file couldn't be found at all.
31ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
32fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    'filename' is the name of a file, such as readline.h or libcrypto.a.
33fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    'std_dirs' is the list of standard system directories; if the
34fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        file is found in one of them, no additional directives are needed.
35fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    'paths' is a list of additional locations to check; if the file is
36fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        found in one of them, the resulting list will contain the directory.
37fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    """
38fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
39fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    # Check the standard locations
40fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    for dir in std_dirs:
41fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        f = os.path.join(dir, filename)
42fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if os.path.exists(f): return []
43fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
44fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    # Check the additional directories
45fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    for dir in paths:
46fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        f = os.path.join(dir, filename)
47fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if os.path.exists(f):
48fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            return [dir]
49fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
50fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    # Not found anywhere
5100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    return None
5200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
53fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchlingdef find_library_file(compiler, libname, std_dirs, paths):
54a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    result = compiler.find_library_file(std_dirs + paths, libname)
55a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    if result is None:
56a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        return None
57ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
58a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    # Check whether the found file is in one of the standard directories
59a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    dirname = os.path.dirname(result)
60a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    for p in std_dirs:
61a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        # Ensure path doesn't end with path separator
629f5178abb7edd1b1bcaffcdfcf1afd8816dab102Skip Montanaro        p = p.rstrip(os.sep)
63a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        if p == dirname:
64a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling            return [ ]
65fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
66a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    # Otherwise, it must have been in one of the additional directories,
67a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    # so we have to figure out which one.
68a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    for p in paths:
69a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        # Ensure path doesn't end with path separator
709f5178abb7edd1b1bcaffcdfcf1afd8816dab102Skip Montanaro        p = p.rstrip(os.sep)
71a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        if p == dirname:
72a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling            return [p]
73a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    else:
74a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        assert False, "Internal error: Path not found in std_dirs or paths"
752c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
7600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdef module_enabled(extlist, modname):
7700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    """Returns whether the module 'modname' is present in the list
7800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    of extensions 'extlist'."""
7900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    extlist = [ext for ext in extlist if ext.name == modname]
8000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    return len(extlist)
81ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
82144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansendef find_module_file(module, dirlist):
83144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    """Find a module in a set of possible folders. If it is not found
84144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    return the unadorned filename"""
85144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    list = find_file(module, [], dirlist)
86144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    if not list:
87144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        return module
88144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    if len(list) > 1:
8912471d63893f84cb88deccf83af5aa5c6866c275Guido van Rossum        log.info("WARNING: multiple copies of %s found"%module)
90144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    return os.path.join(list[0], module)
915b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
9200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingclass PyBuildExt(build_ext):
93ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
9400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    def build_extensions(self):
9500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
9600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Detect which modules should be compiled
9700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        self.detect_modules()
9800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
9900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Remove modules that are present on the disabled list
10000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        self.extensions = [ext for ext in self.extensions
10100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                           if ext.name not in disabled_module_list]
102ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
10300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Fix up the autodetected modules, prefixing all the source files
10400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # with Modules/ and adding Python's include directory to the path.
10500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        (srcdir,) = sysconfig.get_config_vars('srcdir')
106e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum        if not srcdir:
107e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum            # Maybe running on Windows but not using CYGWIN?
108e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum            raise ValueError("No source directory; cannot proceed.")
10900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
110726b78ecb8660278399abaf36f98dec56ecf1271Neil Schemenauer        # Figure out the location of the source code for extension modules
111726b78ecb8660278399abaf36f98dec56ecf1271Neil Schemenauer        moddir = os.path.join(os.getcwd(), srcdir, 'Modules')
11200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        moddir = os.path.normpath(moddir)
11300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        srcdir, tail = os.path.split(moddir)
11400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        srcdir = os.path.normpath(srcdir)
11500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        moddir = os.path.normpath(moddir)
1165b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
117144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        moddirlist = [moddir]
118144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        incdirlist = ['./Include']
1195b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
120144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        # Platform-dependent module source and include directories
121144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        platform = self.get_platform()
12266cb018c96e49b5e5cf1b8fc395171a223d86d8eTim Peters        if platform in ('darwin', 'mac') and ("--disable-toolbox-glue" not in
123cc8a4f6563395e39d77da9888d0ea3675214ca64Brett Cannon            sysconfig.get_config_var("CONFIG_ARGS")):
124144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            # Mac OS X also includes some mac-specific modules
125144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            macmoddir = os.path.join(os.getcwd(), srcdir, 'Mac/Modules')
126144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            moddirlist.append(macmoddir)
127144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            incdirlist.append('./Mac/Include')
12800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
129340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton        alldirlist = moddirlist + incdirlist
130340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton
1313da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling        # Fix up the paths for scripts, too
1323da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling        self.distribution.scripts = [os.path.join(srcdir, filename)
1333da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling                                     for filename in self.distribution.scripts]
1343da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling
135fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        for ext in self.extensions[:]:
136144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            ext.sources = [ find_module_file(filename, moddirlist)
13700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                            for filename in ext.sources ]
138340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton            if ext.depends is not None:
139340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton                ext.depends = [find_module_file(filename, alldirlist)
140340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton                               for filename in ext.depends]
141144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            ext.include_dirs.append( '.' ) # to get config.h
142144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            for incdir in incdirlist:
143144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen                ext.include_dirs.append( os.path.join(srcdir, incdir) )
144fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
145e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling            # If a module has already been built statically,
146fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            # don't build it here
147e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling            if ext.name in sys.builtin_module_names:
148fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                self.extensions.remove(ext)
1495bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling
1504439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen        if platform != 'mac':
151e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl            # Parse Modules/Setup and Modules/Setup.local to figure out which
152e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl            # modules are turned on in the file.
1534439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen            remove_modules = []
154e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl            for filename in ('Modules/Setup', 'Modules/Setup.local'):
155e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                input = text_file.TextFile(filename, join_lines=1)
156e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                while 1:
157e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                    line = input.readline()
158e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                    if not line: break
159e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                    line = line.split()
160e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                    remove_modules.append(line[0])
161e08fa29d0e5bf02006ae30d79c31a6fd02d62068Georg Brandl                input.close()
1621b27f86411f2593fe6137c54143c0d23f21271c7Tim Peters
1634439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen            for ext in self.extensions[:]:
1644439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen                if ext.name in remove_modules:
1654439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen                    self.extensions.remove(ext)
1665b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1675bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # When you run "make CC=altcc" or something similar, you really want
1685bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # those environment variables passed into the setup.py phase.  Here's
1695bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # a small set of useful ones.
1705bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        compiler = os.environ.get('CC')
1715bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        args = {}
1725bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # unfortunately, distutils doesn't let us provide separate C and C++
1735bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # compilers
1745bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        if compiler is not None:
175d7c795e72966f7c72b94b919f3539be66495e6c3Martin v. Löwis            (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
176d7c795e72966f7c72b94b919f3539be66495e6c3Martin v. Löwis            args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
1775bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        self.compiler.set_executables(**args)
1785bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling
17900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        build_ext.build_extensions(self)
18000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
1817c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg    def build_extension(self, ext):
1827c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg
183eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller        if ext.name == '_ctypes':
184795246cf9937f088f8d98253f38da4a093c08300Thomas Heller            if not self.configure_ctypes(ext):
185795246cf9937f088f8d98253f38da4a093c08300Thomas Heller                return
186eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller
1877c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg        try:
1887c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg            build_ext.build_extension(self, ext)
1897c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg        except (CCompilerError, DistutilsError), why:
1907c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg            self.announce('WARNING: building of extension "%s" failed: %s' %
1917c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg                          (ext.name, sys.exc_info()[1]))
19262686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling            return
193f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen        # Workaround for Mac OS X: The Carbon-based modules cannot be
194f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen        # reliably imported into a command-line Python
195f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen        if 'Carbon' in ext.extra_link_args:
1965b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson            self.announce(
1975b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                'WARNING: skipping import check for Carbon-based "%s"' %
1985b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                ext.name)
1995b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson            return
20024cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler        # Workaround for Cygwin: Cygwin currently has fork issues when many
20124cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler        # modules have been imported
20224cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler        if self.get_platform() == 'cygwin':
20324cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler            self.announce('WARNING: skipping import check for Cygwin-based "%s"'
20424cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler                % ext.name)
20524cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler            return
206af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson        ext_filename = os.path.join(
207af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson            self.build_lib,
208af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson            self.get_ext_filename(self.get_ext_fullname(ext.name)))
20962686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling        try:
210af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson            imp.load_dynamic(ext.name, ext_filename)
2116e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz        except ImportError, why:
2126e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            self.announce('*** WARNING: renaming "%s" since importing it'
2136e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                          ' failed: %s' % (ext.name, why), level=3)
2146e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            assert not self.inplace
2156e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            basename, tail = os.path.splitext(ext_filename)
2166e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            newname = basename + "_failed" + tail
2176e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            if os.path.exists(newname):
2186e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                os.remove(newname)
2196e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            os.rename(ext_filename, newname)
2206e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz
2216e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # XXX -- This relies on a Vile HACK in
2226e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # distutils.command.build_ext.build_extension().  The
2236e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # _built_objects attribute is stored there strictly for
2246e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # use here.
2256e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # If there is a failure, _built_objects may not be there,
2266e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # so catch the AttributeError and move on.
2276e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            try:
2286e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                for filename in self._built_objects:
2296e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                    os.remove(filename)
2306e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            except AttributeError:
2316e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                self.announce('unable to remove files (ignored)')
2323f5fcc8acce9fa620fe29d15980850e433f1d5c9Neal Norwitz        except:
2333f5fcc8acce9fa620fe29d15980850e433f1d5c9Neal Norwitz            exc_type, why, tb = sys.exc_info()
2346e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            self.announce('*** WARNING: importing extension "%s" '
2356e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                          'failed with %s: %s' % (ext.name, exc_type, why),
2366e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                          level=3)
2379028d0a52529a8bc76868ade697511f29614b207Fred Drake
23851dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz    def get_platform(self):
239ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Get value of sys.platform
24051dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz        for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
24151dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz            if sys.platform.startswith(platform):
24251dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz                return platform
24351dead79b5e4514fe6cbc481d72a32a40e1f449cNeal Norwitz        return sys.platform
24434febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling
24500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    def detect_modules(self):
246ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Ensure that /usr/local is always used
24739230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson        add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
24839230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson        add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
24939230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson
250516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon        # Add paths specified in the environment variables LDFLAGS and
2514810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon        # CPPFLAGS for header and library files.
2525399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon        # We must get the values from the Makefile and not the environment
2535399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon        # directly since an inconsistently reproducible issue comes up where
2545399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon        # the environment variable is not set even though the value were passed
2554810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon        # into configure and stored in the Makefile (issue found on OS X 10.3).
256516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon        for env_var, arg_name, dir_list in (
257516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon                ('LDFLAGS', '-L', self.compiler.library_dirs),
258516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon                ('CPPFLAGS', '-I', self.compiler.include_dirs)):
2595399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon            env_val = sysconfig.get_config_var(env_var)
260516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon            if env_val:
2614810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # To prevent optparse from raising an exception about any
2624810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # options in env_val that is doesn't know about we strip out
2634810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # all double dashes and any dashes followed by a character
2644810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # that is not for the option we are dealing with.
2654810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                #
2664810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # Please note that order of the regex is important!  We must
2674810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # strip out double-dashes first so that we don't end up with
2684810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # substituting "--Long" to "-Long" and thus lead to "ong" being
2694810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # used for a library directory.
2704810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1], '', env_val)
27184667c063a1e93a985134f7cef376edf82941c02Brett Cannon                parser = optparse.OptionParser()
2724810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # Make sure that allowing args interspersed with options is
2734810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # allowed
2744810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                parser.allow_interspersed_args = True
2754810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                parser.error = lambda msg: None
27684667c063a1e93a985134f7cef376edf82941c02Brett Cannon                parser.add_option(arg_name, dest="dirs", action="append")
27784667c063a1e93a985134f7cef376edf82941c02Brett Cannon                options = parser.parse_args(env_val.split())[0]
27844837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon                if options.dirs:
27944837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon                    for directory in options.dirs:
28044837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon                        add_dir_to_list(dir_list, directory)
281decc6a47df823a988845d3753a4cfb7a85b80828Skip Montanaro
28290b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson        if os.path.normpath(sys.prefix) != '/usr':
28390b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson            add_dir_to_list(self.compiler.library_dirs,
28490b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson                            sysconfig.get_config_var("LIBDIR"))
28590b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson            add_dir_to_list(self.compiler.include_dirs,
28690b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson                            sysconfig.get_config_var("INCLUDEDIR"))
287fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
288339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis        try:
289339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis            have_unicode = unicode
290339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis        except NameError:
291339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis            have_unicode = 0
292339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis
293fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # lib_dirs and inc_dirs are used to search for files;
294fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # if a file is found in one of those directories, it can
295fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # be assumed that no additional -I,-L directives are needed.
296fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis        lib_dirs = self.compiler.library_dirs + [
297fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis            '/lib64', '/usr/lib64',
298fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis            '/lib', '/usr/lib',
299fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis            ]
3005b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson        inc_dirs = self.compiler.include_dirs + ['/usr/include']
30100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts = []
30200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
3034454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon        config_h = sysconfig.get_config_h_filename()
3044454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon        config_h_vars = sysconfig.parse_config_h(open(config_h))
3054454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon
306ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        platform = self.get_platform()
3078301256a440fdd98fd500d225dac20ebb192e08fMartin v. Löwis        (srcdir,) = sysconfig.get_config_vars('srcdir')
3085b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
309f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis        # Check for AtheOS which has libraries in non-standard locations
310f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis        if platform == 'atheos':
311f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
312f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
313f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            inc_dirs += ['/system/include', '/atheos/autolnk/include']
314f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
315f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis
3167883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling        # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
3177883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling        if platform in ['osf1', 'unixware7', 'openunix8']:
31822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            lib_dirs += ['/usr/ccs/lib']
31922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro
32039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        if platform == 'darwin':
32139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # This should work on any unixy platform ;-)
32239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # If the user has bothered specifying additional -I and -L flags
32339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # in OPT and LDFLAGS we might as well use them here.
32439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            #   NOTE: using shlex.split would technically be more correct, but
32539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # also gives a bootstrap problem. Let's hope nobody uses directories
32639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # with whitespace in the name to store libraries.
32739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            cflags, ldflags = sysconfig.get_config_vars(
32839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                    'CFLAGS', 'LDFLAGS')
32939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            for item in cflags.split():
33039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                if item.startswith('-I'):
33139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                    inc_dirs.append(item[2:])
33239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
33339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            for item in ldflags.split():
33439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                if item.startswith('-L'):
33539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                    lib_dirs.append(item[2:])
33639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
337ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Check for MacOS X, which doesn't need libm.a at all
338ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        math_libs = ['m']
3394439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen        if platform in ['darwin', 'beos', 'mac']:
340ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh            math_libs = []
3415b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
34200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # XXX Omitted modules: gl, pure, dl, SGI-specific modules
34300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
34400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
34500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # The following modules are all pretty straightforward, and compile
34600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # on pretty much any POSIXish platform.
34700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
348ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
34900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Some modules that are normally always on:
3502de7471d69b950a64e52a950675d59d9f4071da1Fred Drake        exts.append( Extension('_weakref', ['_weakref.c']) )
35100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
35200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # array objects
35300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('array', ['arraymodule.c']) )
35400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # complex math library functions
3555ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling        exts.append( Extension('cmath', ['cmathmodule.c'],
3565ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling                               libraries=math_libs) )
357ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
35800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # math library functions, e.g. sin()
3595ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling        exts.append( Extension('math',  ['mathmodule.c'],
3605ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling                               libraries=math_libs) )
36100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # fast string operations implemented in C
36200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('strop', ['stropmodule.c']) )
36300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # time operations and variables
3645ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling        exts.append( Extension('time', ['timemodule.c'],
3655ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling                               libraries=math_libs) )
366057e7200d1c300f3c914dbc84eca327c10bf7751Brett Cannon        exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
367a29d508ec4f29f73a9569e27402f159b8efa57caGuido van Rossum                               libraries=math_libs) )
36840f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # random number generator implemented in C
3692c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters        exts.append( Extension("_random", ["_randommodule.c"]) )
37096ef8115dd6ed006f5fc44fa1b577db23485224cRaymond Hettinger        # fast iterator tools implemented in C
37196ef8115dd6ed006f5fc44fa1b577db23485224cRaymond Hettinger        exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
372756b3f3c15bd314ffa25299ca25465ae21e62a30Raymond Hettinger        # high-performance collections
373756b3f3c15bd314ffa25299ca25465ae21e62a30Raymond Hettinger        exts.append( Extension("collections", ["collectionsmodule.c"]) )
3740c4102760c440af3e7b575b0fd27fe25549641a2Raymond Hettinger        # bisect
3750c4102760c440af3e7b575b0fd27fe25549641a2Raymond Hettinger        exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
376b3af1813eb5cf99766f55a0dfc0d566e9bd7c3c1Raymond Hettinger        # heapq
377c46cb2a1a92c26e01ddb3921aa6828bcd3576f3eRaymond Hettinger        exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
37800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # operator.add() and similar goodies
37900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('operator', ['operator.c']) )
380c649ec5b69bd864914e02a2a9ec73c23bd307448Nick Coghlan        # _functools
381c649ec5b69bd864914e02a2a9ec73c23bd307448Nick Coghlan        exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
382261b8e26f199b8e548d9cf81fc4a94820a5a83dbMarc-André Lemburg        # Python C API test module
383d66595fe423227f3bf8ea4867df5d27c6d2764e1Tim Peters        exts.append( Extension('_testcapi', ['_testcapimodule.c']) )
384a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo        # profilers (_lsprof is for cProfile.py)
385a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo        exts.append( Extension('_hotshot', ['_hotshot.c']) )
386a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo        exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
38700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # static Unicode character database
388339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis        if have_unicode:
389339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis            exts.append( Extension('unicodedata', ['unicodedata.c']) )
39000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # access to ISO C locale support
39119d173486b2263a269260343d65ac3929c89297eMartin v. Löwis        data = open('pyconfig.h').read()
39219d173486b2263a269260343d65ac3929c89297eMartin v. Löwis        m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
39319d173486b2263a269260343d65ac3929c89297eMartin v. Löwis        if m is not None:
394d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler            locale_libs = ['intl']
395d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler        else:
396d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler            locale_libs = []
39784b744775206eceefc9c94ba3e23f18332ac062bJack Jansen        if platform == 'darwin':
39884b744775206eceefc9c94ba3e23f18332ac062bJack Jansen            locale_extra_link_args = ['-framework', 'CoreFoundation']
39984b744775206eceefc9c94ba3e23f18332ac062bJack Jansen        else:
40084b744775206eceefc9c94ba3e23f18332ac062bJack Jansen            locale_extra_link_args = []
401e6ddc8b20b493fef2e7cffb2e1351fe1d238857eTim Peters
40284b744775206eceefc9c94ba3e23f18332ac062bJack Jansen
403d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler        exts.append( Extension('_locale', ['_localemodule.c'],
40484b744775206eceefc9c94ba3e23f18332ac062bJack Jansen                               libraries=locale_libs,
40584b744775206eceefc9c94ba3e23f18332ac062bJack Jansen                               extra_link_args=locale_extra_link_args) )
40600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
40700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Modules with some UNIX dependencies -- on by default:
40800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # (If you have a really backward UNIX, select and socket may not be
40900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # supported...)
41000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
41100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # fcntl(2) and ioctl(2)
41200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('fcntl', ['fcntlmodule.c']) )
41373aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen        if platform not in ['mac']:
41446d9623875893be9e2bcbb804b82cfd7f8ed05dfBrett Cannon            # pwd(3)
4152c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            exts.append( Extension('pwd', ['pwdmodule.c']) )
4162c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            # grp(3)
4172c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            exts.append( Extension('grp', ['grpmodule.c']) )
418c300175547ced0af17857a29462b0f9294e8c31cMartin v. Löwis            # spwd, shadow passwords
4194454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon            if (config_h_vars.get('HAVE_GETSPNAM', False) or
4204454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon                    config_h_vars.get('HAVE_GETSPENT', False)):
42146d9623875893be9e2bcbb804b82cfd7f8ed05dfBrett Cannon                exts.append( Extension('spwd', ['spwdmodule.c']) )
42200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # select(2); not on ancient System V
42300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('select', ['selectmodule.c']) )
42400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
42500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Helper module for various ascii-encoders
42600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('binascii', ['binascii.c']) )
42700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
42800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Fred Drake's interface to the Python parser
42900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('parser', ['parsermodule.c']) )
43000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
4312e1c09c1fd06531a3ce1de5b12ec5c8f771e78e0Guido van Rossum        # cStringIO and cPickle
43200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('cStringIO', ['cStringIO.c']) )
43300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('cPickle', ['cPickle.c']) )
43400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
43500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Memory-mapped files (also works on Win32).
43673aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen        if platform not in ['atheos', 'mac']:
437f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            exts.append( Extension('mmap', ['mmapmodule.c']) )
43800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
43957269d0c7c7a6fc989fcbef5b82853aa36fb44caAndrew M. Kuchling        # Lance Ellinghaus's syslog module
44073aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen        if platform not in ['mac']:
4412c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            # syslog daemon interface
4422c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            exts.append( Extension('syslog', ['syslogmodule.c']) )
44300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
44400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # George Neville-Neil's timing module:
4456143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz        # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
4466143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz        # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
4476143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz        #exts.append( Extension('timing', ['timingmodule.c']) )
44800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
44900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
4505bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # Here ends the simple stuff.  From here on, modules need certain
4515bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # libraries, are platform-specific, or present other surprises.
45200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
45300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
45400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Multimedia modules
45500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # These don't work for 64-bit platforms!!!
45600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # These represent audio samples or images as strings:
45700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
4585e4a3b86b359952dc6ba3da2f48594179a811319Neal Norwitz        # Operations on audio samples
459f9cbf211578c3d5a7d5fe2ac3bf09b1b5a2dd5e2Tim Peters        # According to #993173, this one should actually work fine on
4608fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis        # 64-bit platforms.
4618fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis        exts.append( Extension('audioop', ['audioop.c']) )
4628fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis
463ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Disabled on 64-bit platforms
46400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        if sys.maxint != 9223372036854775807L:
46500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Operations on images
46600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('imageop', ['imageop.c']) )
46700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Read SGI RGB image files (but coded portably)
46800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('rgbimg', ['rgbimgmodule.c']) )
46900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
47000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # readline
47181ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen        do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
47281ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen        if platform == 'darwin':
47381ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen            # MacOSX 10.4 has a broken readline. Don't try to build
47481ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen            # the readline module unless the user has installed a fixed
47581ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen            # readline package
4762086eaf79c9dc2992fef64392a9813e25f60696fMartin v. Löwis            if find_file('readline/rlconf.h', inc_dirs, []) is None:
47781ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen                do_readline = False
47881ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen        if do_readline:
47939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            if sys.platform == 'darwin':
48039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # In every directory on the search path search for a dynamic
48139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # library and then a static library, instead of first looking
48239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # for dynamic libraries on the entiry path.
48339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # This way a staticly linked custom readline gets picked up
48439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # before the (broken) dynamic library in /usr/lib.
48539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                readline_extra_link_args = ('-Wl,-search_paths_first',)
48639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            else:
48739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                readline_extra_link_args = ()
48839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
4892efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg            readline_libs = ['readline']
4905aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling            if self.compiler.find_library_file(lib_dirs,
491a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis                                                 'ncursesw'):
492a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis                readline_libs.append('ncursesw')
493a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis            elif self.compiler.find_library_file(lib_dirs,
4945aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling                                                 'ncurses'):
4955aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling                readline_libs.append('ncurses')
4960b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz            elif self.compiler.find_library_file(lib_dirs, 'curses'):
4970b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz                readline_libs.append('curses')
4985aa3c4af76a1ed08cf275bb049cfa3ebe9758386Andrew M. Kuchling            elif self.compiler.find_library_file(lib_dirs +
4992efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg                                               ['/usr/lib/termcap'],
5002efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg                                               'termcap'):
5012efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg                readline_libs.append('termcap')
50200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('readline', ['readline.c'],
5037c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg                                   library_dirs=['/usr/lib/termcap'],
50439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                                   extra_link_args=readline_extra_link_args,
5052efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg                                   libraries=readline_libs) )
50673aa1fff85c7c6ff940ace1a5de8a895e24e0132Jack Jansen        if platform not in ['mac']:
5077883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling            # crypt module.
5082c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
5092c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            if self.compiler.find_library_file(lib_dirs, 'crypt'):
5102c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters                libs = ['crypt']
5112c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            else:
5122c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters                libs = []
5132c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
51400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
515ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro        # CSV files
516ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro        exts.append( Extension('_csv', ['_csv.c']) )
517ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro
51800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # socket(2)
51947d3a7afdaf52887d1bbd1a8cbcd717893c6d480Guido van Rossum        exts.append( Extension('_socket', ['socketmodule.c'],
520340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton                               depends = ['socketmodule.h']) )
521a5d2b4cb180ec87d006d63f838860fba785bcad0Marc-André Lemburg        # Detect SSL support for the socket module (via _ssl)
522ade97338016947bad1d0def339328963fca09685Gregory P. Smith        search_for_ssl_incs_in = [
523ade97338016947bad1d0def339328963fca09685Gregory P. Smith                              '/usr/local/ssl/include',
524e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                              '/usr/contrib/ssl/include/'
525e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                             ]
526ade97338016947bad1d0def339328963fca09685Gregory P. Smith        ssl_incs = find_file('openssl/ssl.h', inc_dirs,
527ade97338016947bad1d0def339328963fca09685Gregory P. Smith                             search_for_ssl_incs_in
528fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                             )
529a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis        if ssl_incs is not None:
530a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis            krb5_h = find_file('krb5.h', inc_dirs,
531a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis                               ['/usr/kerberos/include'])
532a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis            if krb5_h:
533a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis                ssl_incs += krb5_h
534fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
535e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                                     ['/usr/local/ssl/lib',
536e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                                      '/usr/contrib/ssl/lib/'
537e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                                     ] )
538ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
539fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if (ssl_incs is not None and
540fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            ssl_libs is not None):
541a5d2b4cb180ec87d006d63f838860fba785bcad0Marc-André Lemburg            exts.append( Extension('_ssl', ['_ssl.c'],
542fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                                   include_dirs = ssl_incs,
543ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh                                   library_dirs = ssl_libs,
54447d3a7afdaf52887d1bbd1a8cbcd717893c6d480Guido van Rossum                                   libraries = ['ssl', 'crypto'],
545340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton                                   depends = ['socketmodule.h']), )
54600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
547ade97338016947bad1d0def339328963fca09685Gregory P. Smith        # find out which version of OpenSSL we have
548ade97338016947bad1d0def339328963fca09685Gregory P. Smith        openssl_ver = 0
549ade97338016947bad1d0def339328963fca09685Gregory P. Smith        openssl_ver_re = re.compile(
550ade97338016947bad1d0def339328963fca09685Gregory P. Smith            '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
551ade97338016947bad1d0def339328963fca09685Gregory P. Smith        for ssl_inc_dir in inc_dirs + search_for_ssl_incs_in:
552ade97338016947bad1d0def339328963fca09685Gregory P. Smith            name = os.path.join(ssl_inc_dir, 'openssl', 'opensslv.h')
553ade97338016947bad1d0def339328963fca09685Gregory P. Smith            if os.path.isfile(name):
554ade97338016947bad1d0def339328963fca09685Gregory P. Smith                try:
555ade97338016947bad1d0def339328963fca09685Gregory P. Smith                    incfile = open(name, 'r')
556ade97338016947bad1d0def339328963fca09685Gregory P. Smith                    for line in incfile:
557ade97338016947bad1d0def339328963fca09685Gregory P. Smith                        m = openssl_ver_re.match(line)
558ade97338016947bad1d0def339328963fca09685Gregory P. Smith                        if m:
559ade97338016947bad1d0def339328963fca09685Gregory P. Smith                            openssl_ver = eval(m.group(1))
560ade97338016947bad1d0def339328963fca09685Gregory P. Smith                            break
561ade97338016947bad1d0def339328963fca09685Gregory P. Smith                except IOError:
562ade97338016947bad1d0def339328963fca09685Gregory P. Smith                    pass
563ade97338016947bad1d0def339328963fca09685Gregory P. Smith
564ade97338016947bad1d0def339328963fca09685Gregory P. Smith            # first version found is what we'll use (as the compiler should)
565ade97338016947bad1d0def339328963fca09685Gregory P. Smith            if openssl_ver:
566ade97338016947bad1d0def339328963fca09685Gregory P. Smith                break
567ade97338016947bad1d0def339328963fca09685Gregory P. Smith
568ade97338016947bad1d0def339328963fca09685Gregory P. Smith        #print 'openssl_ver = 0x%08x' % openssl_ver
569ade97338016947bad1d0def339328963fca09685Gregory P. Smith
570f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        if (ssl_incs is not None and
571ade97338016947bad1d0def339328963fca09685Gregory P. Smith            ssl_libs is not None and
572ade97338016947bad1d0def339328963fca09685Gregory P. Smith            openssl_ver >= 0x00907000):
573f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # The _hashlib module wraps optimized implementations
574f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # of hash functions from the OpenSSL library.
575f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            exts.append( Extension('_hashlib', ['_hashopenssl.c'],
576f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith                                   include_dirs = ssl_incs,
577f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith                                   library_dirs = ssl_libs,
578f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith                                   libraries = ['ssl', 'crypto']) )
579f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith        else:
580f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # The _sha module implements the SHA1 hash algorithm.
581f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            exts.append( Extension('_sha', ['shamodule.c']) )
582f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # The _md5 module implements the RSA Data Security, Inc. MD5
583f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # Message-Digest Algorithm, described in RFC 1321.  The
5848e39ec78bcede7291e0573fc522425221eb05475Matthias Klose            # necessary files md5.c and md5.h are included here.
585d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith            exts.append( Extension('_md5',
586d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith                            sources = ['md5module.c', 'md5.c'],
587d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith                            depends = ['md5.h']) )
588f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
589ade97338016947bad1d0def339328963fca09685Gregory P. Smith        if (openssl_ver < 0x00908000):
590ade97338016947bad1d0def339328963fca09685Gregory P. Smith            # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
591ade97338016947bad1d0def339328963fca09685Gregory P. Smith            exts.append( Extension('_sha256', ['sha256module.c']) )
592ade97338016947bad1d0def339328963fca09685Gregory P. Smith            exts.append( Extension('_sha512', ['sha512module.c']) )
593f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
594f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
59500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Modules that provide persistent dictionary-like semantics.  You will
59600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # probably want to arrange for at least one of them to be available on
59700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # your machine, though none are defined by default because of library
59800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # dependencies.  The Python module anydbm.py provides an
59900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # implementation independent wrapper for these; dumbdbm.py provides
60000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # similar functionality (but slower of course) implemented in Python.
60100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
60240819d551545db13cdfd46c773ffe3bc4f1f9ca0Barry Warsaw        # Sleepycat Berkeley DB interface.  http://www.sleepycat.com
60357454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro        #
6043adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        # This requires the Sleepycat DB code. The supported versions
6053adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        # are set below.  Visit http://www.sleepycat.com/ to download
6063adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        # a release.  Most open source OSes come with one or more
6073adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        # versions of BerkeleyDB already installed.
60857454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro
60929602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith        max_db_ver = (4, 4)
6103adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        min_db_ver = (3, 3)
611e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        db_setup_debug = False   # verbose debug prints from this script?
612e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
613e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # construct a list of paths to look for the header file in on
614e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # top of the normal inc_dirs.
615e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        db_inc_paths = [
616e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/include/db4',
617e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/local/include/db4',
618e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/opt/sfw/include/db4',
619e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/sw/include/db4',
620e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/include/db3',
621e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/local/include/db3',
622e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/opt/sfw/include/db3',
623e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/sw/include/db3',
624e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        ]
625e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # 4.x minor number specific paths
62629602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith        for x in (0,1,2,3,4):
627e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/include/db4%d' % x)
6288f40171b6734250008e68f79ae64308e37902dfaNeal Norwitz            db_inc_paths.append('/usr/include/db4.%d' % x)
629e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
630e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/include/db4%d' % x)
631e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/pkg/db-4.%d/include' % x)
63229602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith            db_inc_paths.append('/opt/db-4.%d/include' % x)
633e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # 3.x minor number specific paths
634e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        for x in (2,3):
635e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/include/db3%d' % x)
636e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
637e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/include/db3%d' % x)
638e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/pkg/db-3.%d/include' % x)
63929602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith            db_inc_paths.append('/opt/db-3.%d/include' % x)
640e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
6419b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # Add some common subdirectories for Sleepycat DB to the list,
6429b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # based on the standard include directories. This way DB3/4 gets
6439b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # picked up when it is installed in a non-standard prefix and
6449b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # the user has added that prefix into inc_dirs.
6459b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        std_variants = []
6469b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        for dn in inc_dirs:
6479b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            std_variants.append(os.path.join(dn, 'db3'))
6489b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            std_variants.append(os.path.join(dn, 'db4'))
6499b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            for x in (0,1,2,3,4):
6509b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db4%d"%x))
6519b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db4.%d"%x))
6529b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            for x in (2,3):
6539b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db3%d"%x))
6549b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db3.%d"%x))
6559b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren
65638ff36c4ccde02b104553ef1ed979c1261196b48Tim Peters        db_inc_paths = std_variants + db_inc_paths
6579b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren
6589b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren
659e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        db_ver_inc_map = {}
660e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
661e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        class db_found(Exception): pass
66257454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro        try:
66305d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis            # See whether there is a Sleepycat header in the standard
66405d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis            # search path.
665e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            for d in inc_dirs + db_inc_paths:
66605d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                f = os.path.join(d, "db.h")
667e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                if db_setup_debug: print "db: looking for db.h in", f
66805d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                if os.path.exists(f):
66905d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                    f = open(f).read()
670e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
67105d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                    if m:
672e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        db_major = int(m.group(1))
673e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
674e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        db_minor = int(m.group(1))
675e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        db_ver = (db_major, db_minor)
676e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
677e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        if ( (not db_ver_inc_map.has_key(db_ver)) and
678e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                           (db_ver <= max_db_ver and db_ver >= min_db_ver) ):
679e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            # save the include directory with the db.h version
680e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            # (first occurrance only)
681e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            db_ver_inc_map[db_ver] = d
682e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            print "db.h: found", db_ver, "in", d
683e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        else:
684e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            # we already found a header for this library version
685e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            if db_setup_debug: print "db.h: ignoring", d
686e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    else:
687e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        # ignore this header, it didn't contain a version number
688e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        if db_setup_debug: print "db.h: unsupported version", db_ver, "in", d
689e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
690e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_found_vers = db_ver_inc_map.keys()
691e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_found_vers.sort()
692e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
693e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            while db_found_vers:
694e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_ver = db_found_vers.pop()
695e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_incdir = db_ver_inc_map[db_ver]
696e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
697e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # check lib directories parallel to the location of the header
698e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_dirs_to_check = [
699e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    os.path.join(db_incdir, '..', 'lib64'),
700e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    os.path.join(db_incdir, '..', 'lib'),
701e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    os.path.join(db_incdir, '..', '..', 'lib64'),
702e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    os.path.join(db_incdir, '..', '..', 'lib'),
703e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                ]
704e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
705e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
706e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # Look for a version specific db-X.Y before an ambiguoius dbX
707e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # XXX should we -ever- look for a dbX name?  Do any
708e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # systems really not name their library by version and
709e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # symlink to more general names?
710953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre                for dblib in (('db-%d.%d' % db_ver),
711953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre                              ('db%d%d' % db_ver),
712953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre                              ('db%d' % db_ver[0])):
713e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    dblib_file = self.compiler.find_library_file(
714e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                                    db_dirs_to_check + lib_dirs, dblib )
715e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    if dblib_file:
716e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
717e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        raise db_found
718e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    else:
719e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        if db_setup_debug: print "db lib: ", dblib, "not found"
720e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
721e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        except db_found:
722e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            print "db lib: using", db_ver, dblib
723e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            if db_setup_debug: print "db: lib dir", dblib_dir, "inc dir", db_incdir
724e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_incs = [db_incdir]
725d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen            dblibs = [dblib]
726e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # We add the runtime_library_dirs argument because the
727e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # BerkeleyDB lib we're linking against often isn't in the
728e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # system dynamic library search path.  This is usually
729e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # correct and most trouble free, but may cause problems in
730e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # some unusual system configurations (e.g. the directory
731e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # is on an NFS server that goes away).
7326aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis            exts.append(Extension('_bsddb', ['_bsddb.c'],
73305d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                                  library_dirs=dblib_dir,
73405d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                                  runtime_library_dirs=dblib_dir,
7356aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis                                  include_dirs=db_incs,
7366aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis                                  libraries=dblibs))
73757454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro        else:
738e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            if db_setup_debug: print "db: no appropriate library found"
73957454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            db_incs = None
74057454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            dblibs = []
74157454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            dblib_dir = None
74257454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro
743c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        # The sqlite interface
74407f5b35e190ab9be85143c6e8e1217d96bbf75caAnthony Baxter        sqlite_setup_debug = True   # verbose debug prints from this script?
745c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter
7463dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        # We hunt for #define SQLITE_VERSION "n.n.n"
7473dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        # We need to find >= sqlite version 3.0.8
748c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        sqlite_incdir = sqlite_libdir = None
7493dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        sqlite_inc_paths = [ '/usr/include',
750c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/include/sqlite',
751c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/include/sqlite3',
752c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/local/include',
753c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/local/include/sqlite',
754c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/local/include/sqlite3',
755c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                           ]
7563dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
7573dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        MIN_SQLITE_VERSION = ".".join([str(x)
7583dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                                    for x in MIN_SQLITE_VERSION_NUMBER])
75939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
76039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        # Scan the default include directories before the SQLite specific
76139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        # ones. This allows one to override the copy of sqlite on OSX,
76239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        # where /usr/include contains an old version of sqlite.
76339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        for d in inc_dirs + sqlite_inc_paths:
764c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            f = os.path.join(d, "sqlite3.h")
765c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            if os.path.exists(f):
76607f5b35e190ab9be85143c6e8e1217d96bbf75caAnthony Baxter                if sqlite_setup_debug: print "sqlite: found %s"%f
7673dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                incf = open(f).read()
7683dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                m = re.search(
7693dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
770c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                if m:
7713dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    sqlite_version = m.group(1)
7723dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    sqlite_version_tuple = tuple([int(x)
7733dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                                        for x in sqlite_version.split(".")])
7743dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
775c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        # we win!
776c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        print "%s/sqlite3.h: version %s"%(d, sqlite_version)
777c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        sqlite_incdir = d
778c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        break
779c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                    else:
7803dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                        if sqlite_setup_debug:
781c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                            print "%s: version %d is too old, need >= %s"%(d,
782c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                        sqlite_version, MIN_SQLITE_VERSION)
7833dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                elif sqlite_setup_debug:
7843dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    print "sqlite: %s had no SQLITE_VERSION"%(f,)
7853dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter
786c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        if sqlite_incdir:
787c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            sqlite_dirs_to_check = [
788c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', 'lib64'),
789c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', 'lib'),
790c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', '..', 'lib64'),
791c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', '..', 'lib'),
792c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            ]
793c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            sqlite_libfile = self.compiler.find_library_file(
794c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                sqlite_dirs_to_check + lib_dirs, 'sqlite3')
795c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
796c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter
797c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        if sqlite_incdir and sqlite_libdir:
7983e99c0ad649de0393d9a8af17f34d9d1f55f4ab2Gerhard Häring            sqlite_srcs = ['_sqlite/cache.c',
799c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/connection.c',
800c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/cursor.c',
801c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/microprotocols.c',
802c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/module.c',
803c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/prepare_protocol.c',
804c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/row.c',
805c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/statement.c',
806c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/util.c', ]
807c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter
808c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            sqlite_defines = []
809c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            if sys.platform != "win32":
8108e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter                sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
811c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            else:
8128e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter                sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
8138e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter
81439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
81539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            if sys.platform == 'darwin':
81639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # In every directory on the search path search for a dynamic
81739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # library and then a static library, instead of first looking
81839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # for dynamic libraries on the entiry path.
81939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # This way a staticly linked custom sqlite gets picked up
82039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # before the dynamic library in /usr/lib.
82139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                sqlite_extra_link_args = ('-Wl,-search_paths_first',)
82239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            else:
82339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                sqlite_extra_link_args = ()
82439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
825c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            exts.append(Extension('_sqlite3', sqlite_srcs,
826c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  define_macros=sqlite_defines,
8273dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                                  include_dirs=["Modules/_sqlite",
828c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                                sqlite_incdir],
829c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  library_dirs=sqlite_libdir,
830c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  runtime_library_dirs=sqlite_libdir,
83139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                                  extra_link_args=sqlite_extra_link_args,
832c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  libraries=["sqlite3",]))
83322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro
83422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # Look for Berkeley db 1.85.   Note that it is built as a different
83522e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # module name so it can be included even when later versions are
83622e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # available.  A very restrictive search is performed to avoid
83722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # accidentally building this module with a later version of the
83822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # underlying db library.  May BSD-ish Unixes incorporate db 1.85
83922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # symbols into libc and place the include file in /usr/include.
84022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        f = "/usr/include/db.h"
84122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        if os.path.exists(f):
84222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            data = open(f).read()
84322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
84422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            if m is not None:
84522e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                # bingo - old version used hash file format version 2
84622e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                ### XXX this should be fixed to not be platform-dependent
84722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                ### but I don't have direct access to an osf1 platform and
84822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                ### seemed to be muffing the search somehow
84922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                libraries = platform == "osf1" and ['db'] or None
85022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                if libraries is not None:
85122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                    exts.append(Extension('bsddb185', ['bsddbmodule.c'],
85222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                                          libraries=libraries))
85322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                else:
85422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                    exts.append(Extension('bsddb185', ['bsddbmodule.c']))
85522e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro
85600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # The standard Unix dbm module:
857d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen        if platform not in ['cygwin']:
858a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis            if find_file("ndbm.h", inc_dirs, []) is not None:
859a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                # Some systems have -lndbm, others don't
860a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                if self.compiler.find_library_file(lib_dirs, 'ndbm'):
861a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                    ndbm_libs = ['ndbm']
862a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                else:
863a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                    ndbm_libs = []
86434febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling                exts.append( Extension('dbm', ['dbmmodule.c'],
865d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen                                       define_macros=[('HAVE_NDBM_H',None)],
866a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                                       libraries = ndbm_libs ) )
867d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen            elif (self.compiler.find_library_file(lib_dirs, 'gdbm')
868d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen                  and find_file("gdbm/ndbm.h", inc_dirs, []) is not None):
869d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen                exts.append( Extension('dbm', ['dbmmodule.c'],
870d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen                                       define_macros=[('HAVE_GDBM_NDBM_H',None)],
87157454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro                                       libraries = ['gdbm'] ) )
87257454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            elif db_incs is not None:
87357454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro                exts.append( Extension('dbm', ['dbmmodule.c'],
874a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                                       library_dirs=dblib_dir,
875a37d61f1d64fb5e35c0d4c658b2f97caf673c171Martin v. Löwis                                       runtime_library_dirs=dblib_dir,
87657454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro                                       include_dirs=db_incs,
877d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen                                       define_macros=[('HAVE_BERKDB_H',None),
878d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen                                                      ('DB_DBM_HSEARCH',None)],
87957454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro                                       libraries=dblibs))
880ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
88100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
88200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        if (self.compiler.find_library_file(lib_dirs, 'gdbm')):
88300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('gdbm', ['gdbmmodule.c'],
88400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = ['gdbm'] ) )
88500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
88600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Unix-only modules
88734febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling        if platform not in ['mac', 'win32']:
88800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Steen Lumholt's termios module
88900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('termios', ['termios.c']) )
89000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Jeremy Hylton's rlimit interface
8912c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            if platform not in ['atheos']:
892f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis                exts.append( Extension('resource', ['resource.c']) )
89300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
894cf393f3fd9759ffac71c816f97ea01780848512cAndrew M. Kuchling            # Sun yellow pages. Some systems have the functions in libc.
895f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            if platform not in ['cygwin', 'atheos']:
8966efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                if (self.compiler.find_library_file(lib_dirs, 'nsl')):
8976efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                    libs = ['nsl']
8986efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                else:
8996efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                    libs = []
9006efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                exts.append( Extension('nis', ['nismodule.c'],
9016efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                                       libraries = libs) )
90200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
90372092941125cb0a3577fbf63294d14a02bb5dd2aSkip Montanaro        # Curses support, requiring the System V version of curses, often
904ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # provided by the ncurses library.
905a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis        if (self.compiler.find_library_file(lib_dirs, 'ncursesw')):
906a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis            curses_libs = ['ncursesw']
907a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis            exts.append( Extension('_curses', ['_cursesmodule.c'],
908a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis                                   libraries = curses_libs) )
909a55e55e9f3034ceacbf90facc1a0548d63250df4Martin v. Löwis        elif (self.compiler.find_library_file(lib_dirs, 'ncurses')):
91000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            curses_libs = ['ncurses']
91100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('_curses', ['_cursesmodule.c'],
91200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = curses_libs) )
91338419c003c7f162d937320d01edce0c97ef502c3Fred Drake        elif (self.compiler.find_library_file(lib_dirs, 'curses')
91438419c003c7f162d937320d01edce0c97ef502c3Fred Drake              and platform != 'darwin'):
9155b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                # OSX has an old Berkeley curses, not good enough for
9165b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                # the _curses module.
91700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
91800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                curses_libs = ['curses', 'terminfo']
9190b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz            elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
92000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                curses_libs = ['curses', 'termcap']
9210b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz            else:
9220b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz                curses_libs = ['curses']
923ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
92400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('_curses', ['_cursesmodule.c'],
92500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = curses_libs) )
926ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
92700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # If the curses module is enabled, check for the panel module
928e7ffbb24e80800de3667a88af96d03f8c9717039Andrew M. Kuchling        if (module_enabled(exts, '_curses') and
92900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            self.compiler.find_library_file(lib_dirs, 'panel')):
93000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('_curses_panel', ['_curses_panel.c'],
93100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = ['panel'] + curses_libs) )
932ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
933ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
934259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # Andrew Kuchling's zlib module.  Note that some versions of zlib
935259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # 1.1.3 have security problems.  See CERT Advisory CA-2002-07:
936259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # http://www.cert.org/advisories/CA-2002-07.html
937259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        #
938259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
939259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # patch its zlib 1.1.3 package instead of upgrading to 1.1.4.  For
940259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # now, we still accept 1.1.3, because we think it's difficult to
941259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # exploit this in Python, and we'd rather make it RedHat's problem
942259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # than our problem <wink>.
943259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        #
944259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # You can upgrade zlib to version 1.1.4 yourself by going to
945259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # http://www.gzip.org/zlib/
946e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum        zlib_inc = find_file('zlib.h', [], inc_dirs)
947e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum        if zlib_inc is not None:
948e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            zlib_h = zlib_inc[0] + '/zlib.h'
949e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            version = '"0.0.0"'
950259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw            version_req = '"1.1.3"'
951e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            fp = open(zlib_h)
952e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            while 1:
953e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                line = fp.readline()
954e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                if not line:
955e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    break
9568cdc03dca571fd2847d68bfd220234c0153f8f47Guido van Rossum                if line.startswith('#define ZLIB_VERSION'):
957e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    version = line.split()[2]
958e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    break
959e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            if version >= version_req:
960e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                if (self.compiler.find_library_file(lib_dirs, 'z')):
9619b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                    if sys.platform == "darwin":
9629b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                        zlib_extra_link_args = ('-Wl,-search_paths_first',)
9639b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                    else:
9649b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                        zlib_extra_link_args = ()
965e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    exts.append( Extension('zlib', ['zlibmodule.c'],
9669b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                           libraries = ['z'],
9679b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                           extra_link_args = zlib_extra_link_args))
96800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
969f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer        # Gustavo Niemeyer's bz2 module.
970f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer        if (self.compiler.find_library_file(lib_dirs, 'bz2')):
9719b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            if sys.platform == "darwin":
9729b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                bz2_extra_link_args = ('-Wl,-search_paths_first',)
9739b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            else:
9749b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                bz2_extra_link_args = ()
975f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer            exts.append( Extension('bz2', ['bz2module.c'],
9769b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                   libraries = ['bz2'],
9779b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                   extra_link_args = bz2_extra_link_args) )
978f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer
97900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Interface to the Expat XML parser
98000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
981fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        # Expat was written by James Clark and is now maintained by a
982fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        # group of developers on SourceForge; see www.libexpat.org for
983fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        # more information.  The pyexpat module was written by Paul
98499f3ba1648004af22ede20d09d567cb33dce3db8Andrew M. Kuchling        # Prescod after a prototype by Jack Jansen.  The Expat source
98599f3ba1648004af22ede20d09d567cb33dce3db8Andrew M. Kuchling        # is included in Modules/expat/.  Usage of a system
986fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        # shared libexpat.so/expat.dll is not advised.
987fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        #
988fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        # More information on Expat can be found at www.libexpat.org.
989fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        #
9908301256a440fdd98fd500d225dac20ebb192e08fMartin v. Löwis        expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')
9912d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake        define_macros = [
992988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren            ('HAVE_EXPAT_CONFIG_H', '1'),
993988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren        ]
994988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren
9952d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake        exts.append(Extension('pyexpat',
9962d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                              define_macros = define_macros,
9972d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                              include_dirs = [expatinc],
9982d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                              sources = ['pyexpat.c',
9992d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                                         'expat/xmlparse.c',
10002d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                                         'expat/xmlrole.c',
10012d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                                         'expat/xmltok.c',
10022d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                                         ],
10032d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                              ))
100400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
10054c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh        # Fredrik Lundh's cElementTree module.  Note that this also
10064c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh        # uses expat (via the CAPI hook in pyexpat).
10074c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh
10086c403597954487e8129221351f72da3735c52c09Hye-Shik Chang        if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
10094c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh            define_macros.append(('USE_PYEXPAT_CAPI', None))
10104c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh            exts.append(Extension('_elementtree',
10114c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  define_macros = define_macros,
10124c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  include_dirs = [expatinc],
10134c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  sources = ['_elementtree.c'],
10144c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  ))
10154c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh
10163e2a30692085d32ac63f72b35da39158a471fc68Hye-Shik Chang        # Hye-Shik Chang's CJKCodecs modules.
1017e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis        if have_unicode:
1018e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis            exts.append(Extension('_multibytecodec',
1019e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis                                  ['cjkcodecs/multibytecodec.c']))
1020e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis            for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1021e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis                exts.append(Extension('_codecs_' + loc,
1022e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis                                      ['cjkcodecs/_codecs_%s.c' % loc]))
10233e2a30692085d32ac63f72b35da39158a471fc68Hye-Shik Chang
10245b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson        # Dynamic loading module
1025770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum        if sys.maxint == 0x7fffffff:
1026770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum            # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1027770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum            dl_inc = find_file('dlfcn.h', [], inc_dirs)
10288220174489e3f28b874b3b45516585c30e5999daAnthony Baxter            if (dl_inc is not None) and (platform not in ['atheos']):
1029770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum                exts.append( Extension('dl', ['dlmodule.c']) )
10305b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1031cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        # Thomas Heller's _ctypes module
10329176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        self.detect_ctypes(inc_dirs, lib_dirs)
1033cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
103400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Platform-specific libraries
103534febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling        if platform == 'linux2':
103600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Linux-specific modules
103700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
10380a6355eb1fb5af03827a00e146c147c94efe78c9Greg Ward
10394e422817eb1bc5a6a42365001ad45683ae07e559Hye-Shik Chang        if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
10404e422817eb1bc5a6a42365001ad45683ae07e559Hye-Shik Chang                        'freebsd7'):
10410c016a9590b3da47f19420d0616e0c72cae19abfGuido van Rossum            exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
104200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
104334febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling        if platform == 'sunos5':
1044ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh            # SunOS specific modules
104500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
10465b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
104766cb018c96e49b5e5cf1b8fc395171a223d86d8eTim Peters        if platform == 'darwin' and ("--disable-toolbox-glue" not in
1048090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                sysconfig.get_config_var("CONFIG_ARGS")):
1049090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren
1050090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren            if os.uname()[2] > '8.':
1051090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # We're on Mac OS X 10.4 or later, the compiler should
1052090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # support '-Wno-deprecated-declarations'. This will
1053090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # surpress deprecation warnings for the Carbon extensions,
1054090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # these extensions wrap the Carbon APIs and even those
1055090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # parts that are deprecated.
1056090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1057090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren            else:
1058090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                carbon_extra_compile_args = []
1059090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren
106005ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum            # Mac OS X specific modules.
10613e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            def macSrcExists(name1, name2=''):
10623e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if not name1:
10633e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    return None
10643e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                names = (name1,)
10653e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if name2:
10663e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    names = (name1, name2)
10673e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                path = os.path.join(srcdir, 'Mac', 'Modules', *names)
10683e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                return os.path.exists(path)
10693e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
10703e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            def addMacExtension(name, kwds, extra_srcs=[]):
10713e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                dirname = ''
10723e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if name[0] == '_':
10733e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    dirname = name[1:].lower()
10743e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                cname = name + '.c'
10753e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                cmodulename = name + 'module.c'
10763e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
10773e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if macSrcExists(cname):
10783e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [cname]
10793e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                elif macSrcExists(cmodulename):
10803e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [cmodulename]
10813e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                elif macSrcExists(dirname, cname):
10823e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    # XXX(nnorwitz): If all the names ended with module, we
10833e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    # wouldn't need this condition.  ibcarbon is the only one.
10843e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [os.path.join(dirname, cname)]
10853e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                elif macSrcExists(dirname, cmodulename):
10863e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [os.path.join(dirname, cmodulename)]
10873e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                else:
10883e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    raise RuntimeError("%s not found" % name)
10893e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
10903e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                # Here's the whole point:  add the extension with sources
10913e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                exts.append(Extension(name, srcs + extra_srcs, **kwds))
10923e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
10933e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            # Core Foundation
10943e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            core_kwds = {'extra_compile_args': carbon_extra_compile_args,
10953e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                         'extra_link_args': ['-framework', 'CoreFoundation'],
10963e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                        }
10973e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
10983e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('autoGIL', core_kwds)
10993e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
11003e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            # Carbon
11013e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
11023e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           'extra_link_args': ['-framework', 'Carbon'],
11033e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                          }
1104a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter            CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1105a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           'OSATerminology', 'icglue',
11063e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           # All these are in subdirs
1107a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
11083e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
1109a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           '_Help', '_Icn', '_IBCarbon', '_List',
1110a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
11113e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           '_Scrap', '_Snd', '_TE', '_Win',
1112a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                          ]
11133e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            for name in CARBON_EXTS:
11143e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                addMacExtension(name, carbon_kwds)
11153e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
11163e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            # Application Services & QuickTime
11173e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            app_kwds = {'extra_compile_args': carbon_extra_compile_args,
11183e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                        'extra_link_args': ['-framework','ApplicationServices'],
11193e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                       }
11203e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('_Launch', app_kwds)
11213e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('_CG', app_kwds)
11223e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
112305ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum            exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
1124090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                        extra_compile_args=carbon_extra_compile_args,
1125090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                        extra_link_args=['-framework', 'QuickTime',
112605ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum                                     '-framework', 'Carbon']) )
11273e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
11285b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1129fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        self.extensions.extend(exts)
1130fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1131fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Call the method for detecting whether _tkinter can be compiled
1132fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        self.detect_tkinter(inc_dirs, lib_dirs)
1133ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
11340b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen    def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
11350b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # The _tkinter module, using frameworks. Since frameworks are quite
11360b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # different the UNIX search logic is not sharable.
11370b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        from os.path import join, exists
11380b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        framework_dirs = [
11392c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            '/System/Library/Frameworks/',
11402c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            '/Library/Frameworks',
11410b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            join(os.getenv('HOME'), '/Library/Frameworks')
11420b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        ]
11430b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
11440174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro        # Find the directory that contains the Tcl.framework and Tk.framework
11450b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # bundles.
11460b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # XXX distutils should support -F!
11470b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        for F in framework_dirs:
11482c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            # both Tcl.framework and Tk.framework should be present
11490b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            for fw in 'Tcl', 'Tk':
11502c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters                if not exists(join(F, fw + '.framework')):
11510b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                    break
11520b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            else:
11530b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                # ok, F is now directory with both frameworks. Continure
11540b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                # building
11550b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                break
11560b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        else:
11570b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            # Tk and Tcl frameworks not found. Normal "unix" tkinter search
11580b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            # will now resume.
11590b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            return 0
11602c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
11610b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # For 8.4a2, we must add -I options that point inside the Tcl and Tk
11620b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # frameworks. In later release we should hopefully be able to pass
11632c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters        # the -F option to gcc, which specifies a framework lookup path.
11640b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        #
11650b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        include_dirs = [
11662c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            join(F, fw + '.framework', H)
11670b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            for fw in 'Tcl', 'Tk'
11680b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            for H in 'Headers', 'Versions/Current/PrivateHeaders'
11690b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        ]
11700b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
11712c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters        # For 8.4a2, the X11 headers are not included. Rather than include a
11720b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # complicated search, this is a hard-coded path. It could bail out
11730b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # if X11 libs are not found...
11740b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        include_dirs.append('/usr/X11R6/include')
11750b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
11760b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
11770b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
11780b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        define_macros=[('WITH_APPINIT', 1)],
11790b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        include_dirs = include_dirs,
11800b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        libraries = [],
11810b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        extra_compile_args = frameworks,
11820b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        extra_link_args = frameworks,
11830b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        )
11840b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        self.extensions.append(ext)
11850b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        return 1
11860b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
11872c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
1188fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    def detect_tkinter(self, inc_dirs, lib_dirs):
118900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # The _tkinter module.
11905b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
11910b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # Rather than complicate the code below, detecting and building
11920b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # AquaTk is a separate method. Only one Tkinter will be built on
11930b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # Darwin - either AquaTk, if it is found, or X11 based Tk.
11940b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        platform = self.get_platform()
11950174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro        if (platform == 'darwin' and
11960174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro            self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
11972c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            return
11980b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
1199fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Assume we haven't found any of the libraries or include files
12003db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        # The versions with dots are used on Unix, and the versions without
12013db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        # dots on Windows, for detection by cygwin.
1202fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        tcllib = tklib = tcl_includes = tk_includes = None
12034c4a45de8f992bb0c5cf35910d34ed6c63fa9d14Andrew M. Kuchling        for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2',
12043db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis                        '82', '8.1', '81', '8.0', '80']:
1205cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler            tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version)
1206cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler            tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version)
12075b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson            if tklib and tcllib:
120800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                # Exit the loop when we've found the Tcl/Tk libraries
120900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                break
1210fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1211ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Now check for the header files
1212fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if tklib and tcllib:
12133c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            # Check for the include files on Debian and {Free,Open}BSD, where
1214fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            # they're put in /usr/include/{tcl,tk}X.Y
12153c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            dotversion = version
12163c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            if '.' not in dotversion and "bsd" in sys.platform.lower():
12173c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
12183c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                # but the include subdirs are named like .../include/tcl8.3.
12193c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                dotversion = dotversion[:-1] + '.' + dotversion[-1]
12203c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tcl_include_sub = []
12213c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tk_include_sub = []
12223c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            for dir in inc_dirs:
12233c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
12243c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                tk_include_sub += [dir + os.sep + "tk" + dotversion]
12253c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tk_include_sub += tcl_include_sub
12263c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
12273c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
1228fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1229e86a59af886d6c0f58f53e42878a25e48627fed1Martin v. Löwis        if (tcllib is None or tklib is None or
1230fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            tcl_includes is None or tk_includes is None):
12313c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
1232fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            return
1233ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1234fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # OK... everything seems to be present for Tcl/Tk.
1235fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1236fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1237fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        for dir in tcl_includes + tk_includes:
1238fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            if dir not in include_dirs:
1239fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                include_dirs.append(dir)
1240ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1241fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Check for various platform-specific directories
124234febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling        if platform == 'sunos5':
1243fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/openwin/include')
1244fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/openwin/lib')
1245fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        elif os.path.exists('/usr/X11R6/include'):
1246fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/X11R6/include')
1247fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis            added_lib_dirs.append('/usr/X11R6/lib64')
1248fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/X11R6/lib')
1249fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        elif os.path.exists('/usr/X11R5/include'):
1250fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/X11R5/include')
1251fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/X11R5/lib')
1252fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        else:
1253ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh            # Assume default location for X11
1254fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/X11/include')
1255fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/X11/lib')
1256fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
12579181c94e05250b8f69615a96634d55afe532e406Jason Tishler        # If Cygwin, then verify that X is installed before proceeding
12589181c94e05250b8f69615a96634d55afe532e406Jason Tishler        if platform == 'cygwin':
12599181c94e05250b8f69615a96634d55afe532e406Jason Tishler            x11_inc = find_file('X11/Xlib.h', [], include_dirs)
12609181c94e05250b8f69615a96634d55afe532e406Jason Tishler            if x11_inc is None:
12619181c94e05250b8f69615a96634d55afe532e406Jason Tishler                return
12629181c94e05250b8f69615a96634d55afe532e406Jason Tishler
1263fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Check for BLT extension
126438419c003c7f162d937320d01edce0c97ef502c3Fred Drake        if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
126538419c003c7f162d937320d01edce0c97ef502c3Fred Drake                                           'BLT8.0'):
1266fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            defs.append( ('WITH_BLT', 1) )
1267fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            libs.append('BLT8.0')
1268427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis        elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1269427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis                                           'BLT'):
1270427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis            defs.append( ('WITH_BLT', 1) )
1271427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis            libs.append('BLT')
1272fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1273fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Add the Tcl/Tk libraries
1274cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler        libs.append('tk'+ version)
1275cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler        libs.append('tcl'+ version)
1276ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
127734febf5e9273cf7715b46286ff28fb41fa413231Andrew M. Kuchling        if platform in ['aix3', 'aix4']:
1278fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            libs.append('ld')
1279fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
12803db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        # Finally, link with the X11 libraries (not appropriate on cygwin)
12813db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        if platform != "cygwin":
12823db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis            libs.append('X11')
1283fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1284fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1285fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        define_macros=[('WITH_APPINIT', 1)] + defs,
1286fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        include_dirs = include_dirs,
1287fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        libraries = libs,
1288fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        library_dirs = added_lib_dirs,
1289fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        )
1290fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        self.extensions.append(ext)
1291ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
12926c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum##         # Uncomment these lines if you want to play with xxmodule.c
12936c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum##         ext = Extension('xx', ['xxmodule.c'])
12946c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum##         self.extensions.append(ext)
12956c7438e784a0537260ed9423079e3bb5d61be8c3Guido van Rossum
1296fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # XXX handle these, but how to detect?
129700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # *** Uncomment and edit for PIL (TkImaging) extension only:
1298ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        #       -DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \
129900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # *** Uncomment and edit for TOGL extension only:
1300ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        #       -DWITH_TOGL togl.c \
130100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # *** Uncomment these for TOGL extension only:
1302ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        #       -lGL -lGLU -lXext -lXmu \
130300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
1304eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller    def configure_ctypes(self, ext):
13059176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if not self.use_system_libffi:
13069176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            (srcdir,) = sysconfig.get_config_vars('srcdir')
13079176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_builddir = os.path.join(self.build_temp, 'libffi')
13089176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
13099176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                                         '_ctypes', 'libffi'))
13109176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
13119176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13125e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller            from distutils.dep_util import newer_group
13135e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller
13145e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller            config_sources = [os.path.join(ffi_srcdir, fname)
13155e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller                              for fname in os.listdir(ffi_srcdir)]
13165e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller            if self.force or newer_group(config_sources,
13175e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller                                         ffi_configfile):
13189176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                from distutils.dir_util import mkpath
13199176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                mkpath(ffi_builddir)
13209176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                config_args = []
13219176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13229176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                # Pass empty CFLAGS because we'll just append the resulting
13239176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                # CFLAGS to Python's; -g or -O2 is to be avoided.
13249176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
13259176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                      % (ffi_builddir, ffi_srcdir, " ".join(config_args))
13269176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13279176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                res = os.system(cmd)
13289176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                if res or not os.path.exists(ffi_configfile):
13299176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    print "Failed to configure _ctypes module"
13309176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    return False
13319176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13329176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            fficonfig = {}
13339176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            execfile(ffi_configfile, globals(), fficonfig)
13349176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src')
13359176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13369176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            # Add .S (preprocessed assembly) to C compiler source extensions.
13379176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            self.compiler.src_extensions.append('.S')
13389176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13399176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            include_dirs = [os.path.join(ffi_builddir, 'include'),
13409176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                            ffi_builddir, ffi_srcdir]
13419176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            extra_compile_args = fficonfig['ffi_cflags'].split()
13429176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13439176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.sources.extend(fficonfig['ffi_sources'])
13449176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.include_dirs.extend(include_dirs)
13459176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.extra_compile_args.extend(extra_compile_args)
1346795246cf9937f088f8d98253f38da4a093c08300Thomas Heller        return True
1347eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller
13489176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis    def detect_ctypes(self, inc_dirs, lib_dirs):
13499176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        self.use_system_libffi = False
1350eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller        include_dirs = []
1351eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller        extra_compile_args = []
13521798489547a259876c495280dcd5d649269967f3Thomas Heller        extra_link_args = []
1353cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        sources = ['_ctypes/_ctypes.c',
1354cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/callbacks.c',
1355cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/callproc.c',
1356cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/stgdict.c',
1357cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/cfield.c',
1358eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller                   '_ctypes/malloc_closure.c']
1359cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        depends = ['_ctypes/ctypes.h']
1360cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
1361cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        if sys.platform == 'darwin':
1362cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller            sources.append('_ctypes/darwin/dlfcn_simple.c')
1363cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller            include_dirs.append('_ctypes/darwin')
1364cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller# XXX Is this still needed?
1365cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller##            extra_link_args.extend(['-read_only_relocs', 'warning'])
1366cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
13671798489547a259876c495280dcd5d649269967f3Thomas Heller        elif sys.platform == 'sunos5':
13681798489547a259876c495280dcd5d649269967f3Thomas Heller            extra_link_args.append('-mimpure-text')
13691798489547a259876c495280dcd5d649269967f3Thomas Heller
1370cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        ext = Extension('_ctypes',
1371cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        include_dirs=include_dirs,
1372cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        extra_compile_args=extra_compile_args,
13731798489547a259876c495280dcd5d649269967f3Thomas Heller                        extra_link_args=extra_link_args,
13749176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                        libraries=[],
1375cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        sources=sources,
1376cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        depends=depends)
1377cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        ext_test = Extension('_ctypes_test',
1378cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                             sources=['_ctypes/_ctypes_test.c'])
1379cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        self.extensions.extend([ext, ext_test])
1380cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
13819176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
13829176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            return
13839176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
13849176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        ffi_inc = find_file('ffi.h', [], inc_dirs)
13859176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if ffi_inc is not None:
13869176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_h = ffi_inc[0] + '/ffi.h'
13879176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            fp = open(ffi_h)
13889176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            while 1:
13899176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                line = fp.readline()
13909176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                if not line:
13919176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    ffi_inc = None
13929176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    break
13939176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                if line.startswith('#define LIBFFI_H'):
13949176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    break
13959176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        ffi_lib = None
13969176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if ffi_inc is not None:
13979176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
13989176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                if (self.compiler.find_library_file(lib_dirs, lib_name)):
13999176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    ffi_lib = lib_name
14009176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    break
14019176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
14029176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if ffi_inc and ffi_lib:
14039176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.include_dirs.extend(ffi_inc)
14049176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.libraries.append(ffi_lib)
14059176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            self.use_system_libffi = True
14069176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
14079176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
1408f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchlingclass PyBuildInstall(install):
1409f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    # Suppress the warning about installation into the lib_dynload
1410f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    # directory, which is not in sys.path when running Python during
1411f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    # installation:
1412f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    def initialize_options (self):
1413f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling        install.initialize_options(self)
1414f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling        self.warn_dir=0
14155b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1416529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonclass PyBuildInstallLib(install_lib):
1417529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # Do exactly what install_lib does but make sure correct access modes get
1418529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # set on installed directories and files. All installed files with get
1419529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # mode 644 unless they are a shared library in which case they will get
1420529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # mode 755. All installed directories will get mode 755.
1421529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1422529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    so_ext = sysconfig.get_config_var("SO")
1423529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1424529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def install(self):
1425529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        outfiles = install_lib.install(self)
1426529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        self.set_file_modes(outfiles, 0644, 0755)
1427529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        self.set_dir_modes(self.install_dir, 0755)
1428529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        return outfiles
1429529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1430529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def set_file_modes(self, files, defaultMode, sharedLibMode):
1431529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not self.is_chmod_supported(): return
1432529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not files: return
1433529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1434529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        for filename in files:
1435529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            if os.path.islink(filename): continue
1436529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            mode = defaultMode
1437529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            if filename.endswith(self.so_ext): mode = sharedLibMode
1438529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            log.info("changing mode of %s to %o", filename, mode)
1439529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            if not self.dry_run: os.chmod(filename, mode)
1440529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1441529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def set_dir_modes(self, dirname, mode):
1442529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not self.is_chmod_supported(): return
1443529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        os.path.walk(dirname, self.set_dir_modes_visitor, mode)
1444529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1445529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def set_dir_modes_visitor(self, mode, dirname, names):
1446529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if os.path.islink(dirname): return
1447529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        log.info("changing mode of %s to %o", dirname, mode)
1448529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not self.dry_run: os.chmod(dirname, mode)
1449529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
1450529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def is_chmod_supported(self):
1451529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        return hasattr(os, 'chmod')
1452529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
145314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumSUMMARY = """
145414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumPython is an interpreted, interactive, object-oriented programming
145514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlanguage. It is often compared to Tcl, Perl, Scheme or Java.
145614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
145714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumPython combines remarkable power with very clear syntax. It has
145814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossummodules, classes, exceptions, very high level dynamic data types, and
145914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumdynamic typing. There are interfaces to many system calls and
146014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlibraries, as well as to various windowing systems (X11, Motif, Tk,
146114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumMac, MFC). New built-in modules are easily written in C or C++. Python
146214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumis also usable as an extension language for applications that need a
146314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumprogrammable interface.
146414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
146514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumThe Python implementation is portable: it runs on many brands of UNIX,
146614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumon Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
146714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlisted here, it may still be supported, if there's a C compiler for
146814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumit. Ask around on comp.lang.python -- or just try compiling Python
146914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumyourself.
147014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum"""
147114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
147214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumCLASSIFIERS = """
147314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumDevelopment Status :: 3 - Alpha
147414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumDevelopment Status :: 6 - Mature
147514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumLicense :: OSI Approved :: Python Software Foundation License
147614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumNatural Language :: English
147714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumProgramming Language :: C
147814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumProgramming Language :: Python
147914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumTopic :: Software Development
148014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum"""
148114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
148200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdef main():
148362686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling    # turn off warnings when deprecated modules are imported
148462686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling    import warnings
148562686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling    warnings.filterwarnings("ignore",category=DeprecationWarning)
148614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum    setup(# PyPI Metadata (PEP 301)
148714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          name = "Python",
148814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          version = sys.version.split()[0],
148914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          url = "http://www.python.org/%s" % sys.version[:3],
149014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          maintainer = "Guido van Rossum and the Python community",
149114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          maintainer_email = "python-dev@python.org",
149214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          description = "A high-level object-oriented programming language",
149314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          long_description = SUMMARY.strip(),
149414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          license = "PSF license",
149514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          classifiers = filter(None, CLASSIFIERS.split("\n")),
149614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          platforms = ["Many"],
149714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
149814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          # Build info
1499529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson          cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
1500529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson                      'install_lib':PyBuildInstallLib},
150100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling          # The struct module is defined here, because build_ext won't be
150200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling          # called unless there's at least one extension module defined.
15037ccc95a315315568dd0660b5fb915f9e2e38f9daBob Ippolito          ext_modules=[Extension('_struct', ['_struct.c'])],
1504aece4270b1de4777eef3f2aadd7aaf3ac9b69ceeAndrew M. Kuchling
1505aece4270b1de4777eef3f2aadd7aaf3ac9b69ceeAndrew M. Kuchling          # Scripts to install
1506852f79993f8d04f00f54a94e7275550a72454f5fSkip Montanaro          scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
1507852f79993f8d04f00f54a94e7275550a72454f5fSkip Montanaro                     'Lib/smtpd.py']
150800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        )
1509ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
151000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling# --install-platlib
151100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingif __name__ == '__main__':
151200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    main()
1513