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
78608d91e07868f14f71be9784149f813ef1b0a74Christian Heimesfrom glob import glob
80902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smithfrom platform import machine as platform_machine
95633a8048fd8d59c9b23c98fb7e6419689b06316Tarek Ziadéimport sysconfig
10529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
11529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonfrom distutils import log
128d7f0869ee672d7e9e8e1bf126bf717d8223ee2bAndrew M. Kuchlingfrom distutils import text_file
137c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburgfrom distutils.errors import *
1400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils.core import Extension, setup
1500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingfrom distutils.command.build_ext import build_ext
16f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchlingfrom distutils.command.install import install
17529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonfrom distutils.command.install_lib import install_lib
184d32c9c114dda7ebff8caeae9f4f595f2830d646Stefan Krahfrom distutils.spawn import find_executable
1900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
20d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.orgcross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
21d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
22d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.orgdef get_platform():
23d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    # cross build
24d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    if "_PYTHON_HOST_PLATFORM" in os.environ:
25d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        return os.environ["_PYTHON_HOST_PLATFORM"]
26d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    # Get value of sys.platform
27d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    if sys.platform.startswith('osf1'):
28d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        return 'osf1'
29d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    return sys.platform
30d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.orghost_platform = get_platform()
31d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
32c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith# Were we compiled --with-pydebug or with #define Py_DEBUG?
33d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.orgCOMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
34c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith
3500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling# This global variable is used to hold the list of modules to be disabled.
3600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdisabled_module_list = []
3700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
3839230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudsondef add_dir_to_list(dirlist, dir):
3939230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson    """Add the directory 'dir' to the list 'dirlist' (at the front) if
4039230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson    1) 'dir' is not already in 'dirlist'
4139230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson    2) 'dir' actually exists, and is a directory."""
424439b7c67e057db24067e723f1f553258dfa9d94Jack Jansen    if dir is not None and os.path.isdir(dir) and dir not in dirlist:
4339230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson        dirlist.insert(0, dir)
4439230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson
45593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussorendef macosx_sdk_root():
46593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    """
47593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    Return the directory of the current OSX SDK,
48593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    or '/' if no SDK was specified.
49593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    """
50593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    cflags = sysconfig.get_config_var('CFLAGS')
51593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    m = re.search(r'-isysroot\s+(\S+)', cflags)
52593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    if m is None:
53593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        sysroot = '/'
54593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    else:
55593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        sysroot = m.group(1)
56593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    return sysroot
57593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
58593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussorendef is_macosx_sdk_path(path):
59593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    """
60593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    Returns True if 'path' can be located in an OSX SDK
61593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren    """
62d8ec464dbbf4513c26018ca2825ea1498fe0aa71Ned Deily    return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
63d8ec464dbbf4513c26018ca2825ea1498fe0aa71Ned Deily                or path.startswith('/System/')
64d8ec464dbbf4513c26018ca2825ea1498fe0aa71Ned Deily                or path.startswith('/Library/') )
65593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
66fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchlingdef find_file(filename, std_dirs, paths):
67fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    """Searches for the directory where a given file is located,
68fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    and returns a possibly-empty list of additional directories, or None
69fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    if the file couldn't be found at all.
70ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
71fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    'filename' is the name of a file, such as readline.h or libcrypto.a.
72fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    'std_dirs' is the list of standard system directories; if the
73fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        file is found in one of them, no additional directives are needed.
74fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    'paths' is a list of additional locations to check; if the file is
75fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        found in one of them, the resulting list will contain the directory.
76fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    """
77d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    if host_platform == 'darwin':
78593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        # Honor the MacOSX SDK setting when one was specified.
79593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        # An SDK is a directory with the same structure as a real
80593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        # system, but with only header files and libraries.
81593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        sysroot = macosx_sdk_root()
82fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
83fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    # Check the standard locations
84fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    for dir in std_dirs:
85fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        f = os.path.join(dir, filename)
86593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
87d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and is_macosx_sdk_path(dir):
88593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            f = os.path.join(sysroot, dir[1:], filename)
89593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
90fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if os.path.exists(f): return []
91fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
92fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    # Check the additional directories
93fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    for dir in paths:
94fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        f = os.path.join(dir, filename)
95593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
96d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and is_macosx_sdk_path(dir):
97593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            f = os.path.join(sysroot, dir[1:], filename)
98593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
99fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if os.path.exists(f):
100fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            return [dir]
101fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
102fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    # Not found anywhere
10300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    return None
10400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
105fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchlingdef find_library_file(compiler, libname, std_dirs, paths):
106a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    result = compiler.find_library_file(std_dirs + paths, libname)
107a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    if result is None:
108a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        return None
109ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
110d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    if host_platform == 'darwin':
111593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        sysroot = macosx_sdk_root()
112593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
113a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    # Check whether the found file is in one of the standard directories
114a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    dirname = os.path.dirname(result)
115a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    for p in std_dirs:
116a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        # Ensure path doesn't end with path separator
1179f5178abb7edd1b1bcaffcdfcf1afd8816dab102Skip Montanaro        p = p.rstrip(os.sep)
118593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
119d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and is_macosx_sdk_path(p):
12083abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # Note that, as of Xcode 7, Apple SDKs may contain textual stub
12183abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # libraries with .tbd extensions rather than the normal .dylib
12283abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # shared libraries installed in /.  The Apple compiler tool
12383abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # chain handles this transparently but it can cause problems
12483abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # for programs that are being built with an SDK and searching
12583abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # for specific libraries.  Distutils find_library_file() now
12683abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # knows to also search for and return .tbd files.  But callers
12783abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # of find_library_file need to keep in mind that the base filename
12883abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # of the returned SDK library file might have a different extension
12983abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # from that of the library file installed on the running system,
13083abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # for example:
13183abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            #   /Applications/Xcode.app/Contents/Developer/Platforms/
13283abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            #       MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/
13383abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            #       usr/lib/libedit.tbd
13483abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            # vs
13583abccbbc0d6935f889391c09ab990a5c221a6c4Ned Deily            #   /usr/lib/libedit.dylib
136593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            if os.path.join(sysroot, p[1:]) == dirname:
137593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                return [ ]
138593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
139a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        if p == dirname:
140a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling            return [ ]
141fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
142a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    # Otherwise, it must have been in one of the additional directories,
143a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    # so we have to figure out which one.
144a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    for p in paths:
145a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        # Ensure path doesn't end with path separator
1469f5178abb7edd1b1bcaffcdfcf1afd8816dab102Skip Montanaro        p = p.rstrip(os.sep)
147593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
148d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and is_macosx_sdk_path(p):
149593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            if os.path.join(sysroot, p[1:]) == dirname:
150593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                return [ p ]
151593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
152a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        if p == dirname:
153a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling            return [p]
154a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling    else:
155a246d9fefd729294e84a190f2e92cf4e4ff08f20Andrew M. Kuchling        assert False, "Internal error: Path not found in std_dirs or paths"
1562c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
15700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdef module_enabled(extlist, modname):
15800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    """Returns whether the module 'modname' is present in the list
15900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    of extensions 'extlist'."""
16000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    extlist = [ext for ext in extlist if ext.name == modname]
16100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    return len(extlist)
162ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
163144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansendef find_module_file(module, dirlist):
164144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    """Find a module in a set of possible folders. If it is not found
165144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    return the unadorned filename"""
166144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    list = find_file(module, [], dirlist)
167144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    if not list:
168144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        return module
169144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    if len(list) > 1:
17012471d63893f84cb88deccf83af5aa5c6866c275Guido van Rossum        log.info("WARNING: multiple copies of %s found"%module)
171144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen    return os.path.join(list[0], module)
1725b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
17300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingclass PyBuildExt(build_ext):
174ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
175d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro    def __init__(self, dist):
176d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        build_ext.__init__(self, dist)
177d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        self.failed = []
178d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
17900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    def build_extensions(self):
18000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
18100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Detect which modules should be compiled
182d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        missing = self.detect_modules()
18300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
18400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Remove modules that are present on the disabled list
185b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes        extensions = [ext for ext in self.extensions
186b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes                      if ext.name not in disabled_module_list]
187b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes        # move ctypes to the end, it depends on other modules
188b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes        ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
189b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes        if "_ctypes" in ext_map:
190b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes            ctypes = extensions.pop(ext_map["_ctypes"])
191b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes            extensions.append(ctypes)
192b222bbc32105f7ca9a1c5c5ad37c07de3997b9c4Christian Heimes        self.extensions = extensions
193ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
19400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Fix up the autodetected modules, prefixing all the source files
19500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # with Modules/ and adding Python's include directory to the path.
19600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        (srcdir,) = sysconfig.get_config_vars('srcdir')
197e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum        if not srcdir:
198e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum            # Maybe running on Windows but not using CYGWIN?
199e0fea6c4edcb977d722ed30de4a76a83355e2617Guido van Rossum            raise ValueError("No source directory; cannot proceed.")
2000189ddc1139c4ef5e2f7f8c22c4f0196c6884300Neil Schemenauer        srcdir = os.path.abspath(srcdir)
201c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer        moddirlist = [os.path.join(srcdir, 'Modules')]
2025b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
203144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen        # Platform-dependent module source and include directories
20438870cb432687b62a660bd18cc43ac66882ce869Neil Schemenauer        incdirlist = []
205d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
206d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
207cc8a4f6563395e39d77da9888d0ea3675214ca64Brett Cannon            sysconfig.get_config_var("CONFIG_ARGS")):
208144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            # Mac OS X also includes some mac-specific modules
209c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer            macmoddir = os.path.join(srcdir, 'Mac/Modules')
210144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            moddirlist.append(macmoddir)
21138870cb432687b62a660bd18cc43ac66882ce869Neil Schemenauer            incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
21200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
2133da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling        # Fix up the paths for scripts, too
2143da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling        self.distribution.scripts = [os.path.join(srcdir, filename)
2153da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling                                     for filename in self.distribution.scripts]
2163da989c6bc0c80bd75547dbd8efc5a9deb29eff5Andrew M. Kuchling
2178608d91e07868f14f71be9784149f813ef1b0a74Christian Heimes        # Python header files
218c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer        headers = [sysconfig.get_config_h_filename()]
2194666ebd8fae8e115dc51b25d630481b15613e94dStefan Krah        headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
220fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        for ext in self.extensions[:]:
221144ebcc444e72e486837cd51e6f7f8c50d016fe2Jack Jansen            ext.sources = [ find_module_file(filename, moddirlist)
22200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                            for filename in ext.sources ]
223340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton            if ext.depends is not None:
224c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer                ext.depends = [find_module_file(filename, moddirlist)
225340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton                               for filename in ext.depends]
2268608d91e07868f14f71be9784149f813ef1b0a74Christian Heimes            else:
2278608d91e07868f14f71be9784149f813ef1b0a74Christian Heimes                ext.depends = []
2288608d91e07868f14f71be9784149f813ef1b0a74Christian Heimes            # re-compile extensions if a header file has been changed
2298608d91e07868f14f71be9784149f813ef1b0a74Christian Heimes            ext.depends.extend(headers)
2308608d91e07868f14f71be9784149f813ef1b0a74Christian Heimes
23138870cb432687b62a660bd18cc43ac66882ce869Neil Schemenauer            # platform specific include directories
23238870cb432687b62a660bd18cc43ac66882ce869Neil Schemenauer            ext.include_dirs.extend(incdirlist)
23338870cb432687b62a660bd18cc43ac66882ce869Neil Schemenauer
234e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling            # If a module has already been built statically,
235fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            # don't build it here
236e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling            if ext.name in sys.builtin_module_names:
237fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                self.extensions.remove(ext)
2385bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling
2399545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # Parse Modules/Setup and Modules/Setup.local to figure out which
2409545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # modules are turned on in the file.
2419545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        remove_modules = []
2429545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        for filename in ('Modules/Setup', 'Modules/Setup.local'):
2439545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            input = text_file.TextFile(filename, join_lines=1)
2449545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            while 1:
2459545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren                line = input.readline()
2469545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren                if not line: break
2479545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren                line = line.split()
2489545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren                remove_modules.append(line[0])
2499545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            input.close()
2509545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren
2519545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        for ext in self.extensions[:]:
2529545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            if ext.name in remove_modules:
2539545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren                self.extensions.remove(ext)
2545b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
2555bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # When you run "make CC=altcc" or something similar, you really want
2565bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # those environment variables passed into the setup.py phase.  Here's
2575bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # a small set of useful ones.
2585bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        compiler = os.environ.get('CC')
2595bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        args = {}
2605bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # unfortunately, distutils doesn't let us provide separate C and C++
2615bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # compilers
2625bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        if compiler is not None:
263d7c795e72966f7c72b94b919f3539be66495e6c3Martin v. Löwis            (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
264d7c795e72966f7c72b94b919f3539be66495e6c3Martin v. Löwis            args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
26535a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        self.compiler.set_executables(**args)
2665bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling
26700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        build_ext.build_extensions(self)
26800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
2691b4b7af1d1353ac2eaaa65bee69a750b5d249e95Berker Peksag        longest = 0
2701b4b7af1d1353ac2eaaa65bee69a750b5d249e95Berker Peksag        if self.extensions:
2711b4b7af1d1353ac2eaaa65bee69a750b5d249e95Berker Peksag            longest = max([len(e.name) for e in self.extensions])
272d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        if self.failed:
273d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            longest = max(longest, max([len(name) for name in self.failed]))
274d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
275d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        def print_three_column(lst):
276e95cf1c8a2cba11b38f9c83da659895fbc952466Georg Brandl            lst.sort(key=str.lower)
277d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            # guarantee zip() doesn't drop anything
278d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            while len(lst) % 3:
279d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                lst.append("")
280d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
281d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                print "%-*s   %-*s   %-*s" % (longest, e, longest, f,
282d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                                              longest, g)
283d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
284d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        if missing:
285d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            print
28640f982fbdfa7ae10b14f1906915cc15938f82641Georg Brandl            print ("Python build finished, but the necessary bits to build "
28740f982fbdfa7ae10b14f1906915cc15938f82641Georg Brandl                   "these modules were not found:")
288d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            print_three_column(missing)
289879975677adb31c94384004e88b80e1da3528db8Jeffrey Yasskin            print ("To find the necessary bits, look in setup.py in"
290879975677adb31c94384004e88b80e1da3528db8Jeffrey Yasskin                   " detect_modules() for the module's name.")
291879975677adb31c94384004e88b80e1da3528db8Jeffrey Yasskin            print
292d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
293d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        if self.failed:
294d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            failed = self.failed[:]
295d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            print
296d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            print "Failed to build these modules:"
297d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            print_three_column(failed)
298879975677adb31c94384004e88b80e1da3528db8Jeffrey Yasskin            print
299d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
3007c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg    def build_extension(self, ext):
3017c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg
302eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller        if ext.name == '_ctypes':
303795246cf9937f088f8d98253f38da4a093c08300Thomas Heller            if not self.configure_ctypes(ext):
304795246cf9937f088f8d98253f38da4a093c08300Thomas Heller                return
305eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller
3067c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg        try:
3077c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg            build_ext.build_extension(self, ext)
3087c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg        except (CCompilerError, DistutilsError), why:
3097c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg            self.announce('WARNING: building of extension "%s" failed: %s' %
3107c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg                          (ext.name, sys.exc_info()[1]))
311d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            self.failed.append(ext.name)
31262686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling            return
313f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen        # Workaround for Mac OS X: The Carbon-based modules cannot be
314f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen        # reliably imported into a command-line Python
315f49c6f9954aa59e29c8b392347646f95cbf8215aJack Jansen        if 'Carbon' in ext.extra_link_args:
3165b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson            self.announce(
3175b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                'WARNING: skipping import check for Carbon-based "%s"' %
3185b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                ext.name)
3195b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson            return
3205640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren
321d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and (
3225640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
3235640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # Don't bother doing an import check when an extension was
3245640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # build with an explicit '-arch' flag on OSX. That's currently
3255640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # only used to build 32-bit only extensions in a 4-way
3265640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # universal build and loading 32-bit code into a 64-bit
3275640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # process will fail.
3285640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            self.announce(
3295640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                'WARNING: skipping import check for "%s"' %
3305640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                ext.name)
3315640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            return
3325640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren
33324cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler        # Workaround for Cygwin: Cygwin currently has fork issues when many
33424cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler        # modules have been imported
335d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'cygwin':
33624cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler            self.announce('WARNING: skipping import check for Cygwin-based "%s"'
33724cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler                % ext.name)
33824cf7766bca616cd5d32e0c707dbcda8941d0a27Jason Tishler            return
339af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson        ext_filename = os.path.join(
340af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson            self.build_lib,
341af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson            self.get_ext_filename(self.get_ext_fullname(ext.name)))
342d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
343d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        # Don't try to load extensions for cross builds
344d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if cross_compiling:
345d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            return
346d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
34762686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling        try:
348af14289c5426743015dbbe0567e2c2677f1bff0cMichael W. Hudson            imp.load_dynamic(ext.name, ext_filename)
3496e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz        except ImportError, why:
350d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            self.failed.append(ext.name)
3516e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            self.announce('*** WARNING: renaming "%s" since importing it'
3526e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                          ' failed: %s' % (ext.name, why), level=3)
3536e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            assert not self.inplace
3546e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            basename, tail = os.path.splitext(ext_filename)
3556e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            newname = basename + "_failed" + tail
3566e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            if os.path.exists(newname):
3576e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                os.remove(newname)
3586e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            os.rename(ext_filename, newname)
3596e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz
3606e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # XXX -- This relies on a Vile HACK in
3616e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # distutils.command.build_ext.build_extension().  The
3626e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # _built_objects attribute is stored there strictly for
3636e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # use here.
3646e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # If there is a failure, _built_objects may not be there,
3656e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            # so catch the AttributeError and move on.
3666e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            try:
3676e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                for filename in self._built_objects:
3686e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                    os.remove(filename)
3696e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            except AttributeError:
3706e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                self.announce('unable to remove files (ignored)')
3713f5fcc8acce9fa620fe29d15980850e433f1d5c9Neal Norwitz        except:
3723f5fcc8acce9fa620fe29d15980850e433f1d5c9Neal Norwitz            exc_type, why, tb = sys.exc_info()
3736e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz            self.announce('*** WARNING: importing extension "%s" '
3746e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                          'failed with %s: %s' % (ext.name, exc_type, why),
3756e2d1c7ab83eef723176861ac2bc0732f10ba1caNeal Norwitz                          level=3)
376d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            self.failed.append(ext.name)
3779028d0a52529a8bc76868ade697511f29614b207Fred Drake
378ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw    def add_multiarch_paths(self):
379ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        # Debian/Ubuntu multiarch support.
380ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        # https://wiki.ubuntu.com/MultiarchSpec
3813d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        cc = sysconfig.get_config_var('CC')
3823d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        tmpfile = os.path.join(self.build_temp, 'multiarch')
3833d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        if not os.path.exists(self.build_temp):
3843d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            os.makedirs(self.build_temp)
3853d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        ret = os.system(
3863d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
3873d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        multiarch_path_component = ''
3883d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        try:
3893d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            if ret >> 8 == 0:
3903d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com                with open(tmpfile) as fp:
3913d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com                    multiarch_path_component = fp.readline().strip()
3923d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        finally:
3933d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            os.unlink(tmpfile)
3943d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com
3953d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com        if multiarch_path_component != '':
3963d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            add_dir_to_list(self.compiler.library_dirs,
3973d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com                            '/usr/lib/' + multiarch_path_component)
3983d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            add_dir_to_list(self.compiler.include_dirs,
3993d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com                            '/usr/include/' + multiarch_path_component)
4003d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com            return
4013d2fc15f82f495e6b53a0e7bc60b2283ccbcb5d3doko@ubuntu.com
402ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        if not find_executable('dpkg-architecture'):
403ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw            return
404d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        opt = ''
405d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if cross_compiling:
406d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
407ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        tmpfile = os.path.join(self.build_temp, 'multiarch')
408ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        if not os.path.exists(self.build_temp):
409ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw            os.makedirs(self.build_temp)
410ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        ret = os.system(
411d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
412d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            (opt, tmpfile))
413ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        try:
414ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw            if ret >> 8 == 0:
415ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw                with open(tmpfile) as fp:
416ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw                    multiarch_path_component = fp.readline().strip()
417ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw                add_dir_to_list(self.compiler.library_dirs,
418ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw                                '/usr/lib/' + multiarch_path_component)
419ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw                add_dir_to_list(self.compiler.include_dirs,
420ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw                                '/usr/include/' + multiarch_path_component)
421ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        finally:
422ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw            os.unlink(tmpfile)
423ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw
424d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org    def add_gcc_paths(self):
425d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        gcc = sysconfig.get_config_var('CC')
426d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        tmpfile = os.path.join(self.build_temp, 'gccpaths')
427d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if not os.path.exists(self.build_temp):
428d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            os.makedirs(self.build_temp)
429d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
430d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        is_gcc = False
431d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        in_incdirs = False
432d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        inc_dirs = []
433d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        lib_dirs = []
434d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        try:
435d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if ret >> 8 == 0:
436d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                with open(tmpfile) as fp:
437d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                    for line in fp.readlines():
438d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                        if line.startswith("gcc version"):
439d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                            is_gcc = True
440d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                        elif line.startswith("#include <...>"):
441d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                            in_incdirs = True
442d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                        elif line.startswith("End of search list"):
443d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                            in_incdirs = False
444d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                        elif is_gcc and line.startswith("LIBRARY_PATH"):
445d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                            for d in line.strip().split("=")[1].split(":"):
446d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                                d = os.path.normpath(d)
447d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                                if '/gcc/' not in d:
448d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                                    add_dir_to_list(self.compiler.library_dirs,
449d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                                                    d)
450d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                        elif is_gcc and in_incdirs and '/gcc/' not in line:
451d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                            add_dir_to_list(self.compiler.include_dirs,
452d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                                            line.strip())
453d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        finally:
454d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            os.unlink(tmpfile)
455d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
45600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    def detect_modules(self):
457ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Ensure that /usr/local is always used
4586166709eec557f52075417b19676dccc9f405fdaNed Deily        if not cross_compiling:
4596166709eec557f52075417b19676dccc9f405fdaNed Deily            add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
4606166709eec557f52075417b19676dccc9f405fdaNed Deily            add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
4616166709eec557f52075417b19676dccc9f405fdaNed Deily        if cross_compiling:
4626166709eec557f52075417b19676dccc9f405fdaNed Deily            self.add_gcc_paths()
463ffc9caf9fefe511b1469d1f6de64ddc420a2b949Barry Warsaw        self.add_multiarch_paths()
46439230b3230783d55fd5b21c0f745ab5eec366fa5Michael W. Hudson
465516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon        # Add paths specified in the environment variables LDFLAGS and
4664810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon        # CPPFLAGS for header and library files.
4675399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon        # We must get the values from the Makefile and not the environment
4685399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon        # directly since an inconsistently reproducible issue comes up where
4695399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon        # the environment variable is not set even though the value were passed
4704810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon        # into configure and stored in the Makefile (issue found on OS X 10.3).
471516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon        for env_var, arg_name, dir_list in (
47235a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
47335a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                ('LDFLAGS', '-L', self.compiler.library_dirs),
47435a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                ('CPPFLAGS', '-I', self.compiler.include_dirs)):
4755399c6d3d4cf9496b46ce9f37975d6c8107a743dBrett Cannon            env_val = sysconfig.get_config_var(env_var)
476516592f4ff13ee39ebd115088c7429631328e2dbBrett Cannon            if env_val:
4774810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # To prevent optparse from raising an exception about any
478a46ed915fa4b9b667fcc164a2762e69e184cbafeSkip Montanaro                # options in env_val that it doesn't know about we strip out
4794810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # all double dashes and any dashes followed by a character
4804810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # that is not for the option we are dealing with.
4814810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                #
4824810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # Please note that order of the regex is important!  We must
4834810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # strip out double-dashes first so that we don't end up with
4844810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # substituting "--Long" to "-Long" and thus lead to "ong" being
4854810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # used for a library directory.
486915c87d3e5d84c0635c2957f4ae9e96d0ab6705fGeorg Brandl                env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
487915c87d3e5d84c0635c2957f4ae9e96d0ab6705fGeorg Brandl                                 ' ', env_val)
48884667c063a1e93a985134f7cef376edf82941c02Brett Cannon                parser = optparse.OptionParser()
4894810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # Make sure that allowing args interspersed with options is
4904810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                # allowed
4914810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                parser.allow_interspersed_args = True
4924810eb9a0852bc428a46d5590aafbe9b50f3370cBrett Cannon                parser.error = lambda msg: None
49384667c063a1e93a985134f7cef376edf82941c02Brett Cannon                parser.add_option(arg_name, dest="dirs", action="append")
49484667c063a1e93a985134f7cef376edf82941c02Brett Cannon                options = parser.parse_args(env_val.split())[0]
49544837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon                if options.dirs:
496861e39678f574496c6e730753f12cbd7f59b6541Brett Cannon                    for directory in reversed(options.dirs):
49744837719ef2886da0671aed55e99cdae14d24b9dBrett Cannon                        add_dir_to_list(dir_list, directory)
498decc6a47df823a988845d3753a4cfb7a85b80828Skip Montanaro
4992421525e2147b8decfe58f8667212fbe0ff7f454Ronald Oussoren        if os.path.normpath(sys.prefix) != '/usr' \
5002421525e2147b8decfe58f8667212fbe0ff7f454Ronald Oussoren                and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
5012421525e2147b8decfe58f8667212fbe0ff7f454Ronald Oussoren            # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
5022421525e2147b8decfe58f8667212fbe0ff7f454Ronald Oussoren            # (PYTHONFRAMEWORK is set) to avoid # linking problems when
5032421525e2147b8decfe58f8667212fbe0ff7f454Ronald Oussoren            # building a framework with different architectures than
5042421525e2147b8decfe58f8667212fbe0ff7f454Ronald Oussoren            # the one that is currently installed (issue #7473)
50535a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            add_dir_to_list(self.compiler.library_dirs,
50690b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson                            sysconfig.get_config_var("LIBDIR"))
50735a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            add_dir_to_list(self.compiler.include_dirs,
50890b8e4d40cc8ec3aed05d5bc6a5afc981e7ebc0cMichael W. Hudson                            sysconfig.get_config_var("INCLUDEDIR"))
509fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
510339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis        try:
511339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis            have_unicode = unicode
512339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis        except NameError:
513339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis            have_unicode = 0
514339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis
515fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # lib_dirs and inc_dirs are used to search for files;
516fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # if a file is found in one of those directories, it can
517fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # be assumed that no additional -I,-L directives are needed.
518d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        inc_dirs = self.compiler.include_dirs[:]
519d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        lib_dirs = self.compiler.library_dirs[:]
520d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if not cross_compiling:
521d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            for d in (
522d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                '/usr/include',
523d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                ):
524d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                add_dir_to_list(inc_dirs, d)
525d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            for d in (
526d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                '/lib64', '/usr/lib64',
527d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                '/lib', '/usr/lib',
528d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                ):
529d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                add_dir_to_list(lib_dirs, d)
53000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts = []
531d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        missing = []
53200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
5334454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon        config_h = sysconfig.get_config_h_filename()
5344454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon        config_h_vars = sysconfig.parse_config_h(open(config_h))
5354454a1ff8453c12739c65da21e00927ea3bf9ad9Brett Cannon
536c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer        srcdir = sysconfig.get_config_var('srcdir')
5375b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
538f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis        # Check for AtheOS which has libraries in non-standard locations
539d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'atheos':
540f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
541f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
542f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            inc_dirs += ['/system/include', '/atheos/autolnk/include']
543f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
544f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis
5457883dc8abb81026fb111b2fde09ba602ccf04226Andrew M. Kuchling        # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
546d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform in ['osf1', 'unixware7', 'openunix8']:
54722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            lib_dirs += ['/usr/ccs/lib']
54822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro
5490d3db3a8157f38e6dc7ea69500069c86c0b40be7Charles-François Natali        # HP-UX11iv3 keeps files in lib/hpux folders.
550d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'hp-ux11':
5510d3db3a8157f38e6dc7ea69500069c86c0b40be7Charles-François Natali            lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
5520d3db3a8157f38e6dc7ea69500069c86c0b40be7Charles-François Natali
553d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
55439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # This should work on any unixy platform ;-)
55539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # If the user has bothered specifying additional -I and -L flags
55639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # in OPT and LDFLAGS we might as well use them here.
55739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            #   NOTE: using shlex.split would technically be more correct, but
55839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # also gives a bootstrap problem. Let's hope nobody uses directories
55939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            # with whitespace in the name to store libraries.
56039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            cflags, ldflags = sysconfig.get_config_vars(
56139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                    'CFLAGS', 'LDFLAGS')
56239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            for item in cflags.split():
56339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                if item.startswith('-I'):
56439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                    inc_dirs.append(item[2:])
56539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
56639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            for item in ldflags.split():
56739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                if item.startswith('-L'):
56839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                    lib_dirs.append(item[2:])
56939be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
570ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Check for MacOS X, which doesn't need libm.a at all
571ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        math_libs = ['m']
572d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform in ['darwin', 'beos']:
573ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh            math_libs = []
5745b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
57500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # XXX Omitted modules: gl, pure, dl, SGI-specific modules
57600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
57700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
57800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # The following modules are all pretty straightforward, and compile
57900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # on pretty much any POSIXish platform.
58000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
581ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
58200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Some modules that are normally always on:
583fa8fa0caf4681b0d834121399d54588ae0a965cbGeorg Brandl        #exts.append( Extension('_weakref', ['_weakref.c']) )
58400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
58500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # array objects
58600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('array', ['arraymodule.c']) )
58783e9b5763245c727993eab0a0133b2b337605f88Martin Panter
58883e9b5763245c727993eab0a0133b2b337605f88Martin Panter        shared_math = 'Modules/_math.o'
58900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # complex math library functions
59083e9b5763245c727993eab0a0133b2b337605f88Martin Panter        exts.append( Extension('cmath', ['cmathmodule.c'],
59183e9b5763245c727993eab0a0133b2b337605f88Martin Panter                               extra_objects=[shared_math],
59283e9b5763245c727993eab0a0133b2b337605f88Martin Panter                               depends=['_math.h', shared_math],
5935ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling                               libraries=math_libs) )
59400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # math library functions, e.g. sin()
59583e9b5763245c727993eab0a0133b2b337605f88Martin Panter        exts.append( Extension('math',  ['mathmodule.c'],
59683e9b5763245c727993eab0a0133b2b337605f88Martin Panter                               extra_objects=[shared_math],
59783e9b5763245c727993eab0a0133b2b337605f88Martin Panter                               depends=['_math.h', shared_math],
5985ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling                               libraries=math_libs) )
59900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # fast string operations implemented in C
60000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('strop', ['stropmodule.c']) )
60100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # time operations and variables
6025ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling        exts.append( Extension('time', ['timemodule.c'],
6035ddb25f36f676aa32b048a24261dcc8490b99c98Andrew M. Kuchling                               libraries=math_libs) )
604057e7200d1c300f3c914dbc84eca327c10bf7751Brett Cannon        exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
605a29d508ec4f29f73a9569e27402f159b8efa57caGuido van Rossum                               libraries=math_libs) )
6060d2192be8b71c2effeedad4bf9ccac9c022c03d8Neal Norwitz        # fast iterator tools implemented in C
6070d2192be8b71c2effeedad4bf9ccac9c022c03d8Neal Norwitz        exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
608a73fbe791d0d41db543ebe39d2f6df0a4265be4bEric Smith        # code that will be builtins in the future, but conflict with the
609a73fbe791d0d41db543ebe39d2f6df0a4265be4bEric Smith        #  current builtins
610a73fbe791d0d41db543ebe39d2f6df0a4265be4bEric Smith        exts.append( Extension('future_builtins', ['future_builtins.c']) )
61140f621709286a7a0f7e6f260c0fd020d0fac0de0Raymond Hettinger        # random number generator implemented in C
6122c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters        exts.append( Extension("_random", ["_randommodule.c"]) )
613756b3f3c15bd314ffa25299ca25465ae21e62a30Raymond Hettinger        # high-performance collections
614eb9798892d7ed54762ae006e39db0a84f671cfd3Raymond Hettinger        exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
6150c4102760c440af3e7b575b0fd27fe25549641a2Raymond Hettinger        # bisect
6160c4102760c440af3e7b575b0fd27fe25549641a2Raymond Hettinger        exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
617b3af1813eb5cf99766f55a0dfc0d566e9bd7c3c1Raymond Hettinger        # heapq
618c46cb2a1a92c26e01ddb3921aa6828bcd3576f3eRaymond Hettinger        exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
61900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # operator.add() and similar goodies
62000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('operator', ['operator.c']) )
62119690593273a5b210a9b9ea72bd59840d02759b0Antoine Pitrou        # Python 3.1 _io library
62219690593273a5b210a9b9ea72bd59840d02759b0Antoine Pitrou        exts.append( Extension("_io",
62319690593273a5b210a9b9ea72bd59840d02759b0Antoine Pitrou            ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
62419690593273a5b210a9b9ea72bd59840d02759b0Antoine Pitrou             "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
62519690593273a5b210a9b9ea72bd59840d02759b0Antoine Pitrou             depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
626c649ec5b69bd864914e02a2a9ec73c23bd307448Nick Coghlan        # _functools
627c649ec5b69bd864914e02a2a9ec73c23bd307448Nick Coghlan        exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
6284b964f9c904744b7d7d88054e54a2e4ca8aeb395Brett Cannon        # _json speedups
6294b964f9c904744b7d7d88054e54a2e4ca8aeb395Brett Cannon        exts.append( Extension("_json", ["_json.c"]) )
630261b8e26f199b8e548d9cf81fc4a94820a5a83dbMarc-André Lemburg        # Python C API test module
631d155bbfbb28944c2825a2327baed386a38456db2Mark Dickinson        exts.append( Extension('_testcapi', ['_testcapimodule.c'],
632d155bbfbb28944c2825a2327baed386a38456db2Mark Dickinson                               depends=['testcapi_long.h']) )
633a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo        # profilers (_lsprof is for cProfile.py)
634a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo        exts.append( Extension('_hotshot', ['_hotshot.c']) )
635a871ef2b3e924f058ec1b0aed7d4c83a546414b7Armin Rigo        exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
63600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # static Unicode character database
637339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis        if have_unicode:
638339d0f720e86dc34837547c90d3003a4a68d7d46Martin v. Löwis            exts.append( Extension('unicodedata', ['unicodedata.c']) )
639d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
640d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('unicodedata')
64100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # access to ISO C locale support
64219d173486b2263a269260343d65ac3929c89297eMartin v. Löwis        data = open('pyconfig.h').read()
64319d173486b2263a269260343d65ac3929c89297eMartin v. Löwis        m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
64419d173486b2263a269260343d65ac3929c89297eMartin v. Löwis        if m is not None:
645d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler            locale_libs = ['intl']
646d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler        else:
647d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler            locale_libs = []
648d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
64984b744775206eceefc9c94ba3e23f18332ac062bJack Jansen            locale_extra_link_args = ['-framework', 'CoreFoundation']
65084b744775206eceefc9c94ba3e23f18332ac062bJack Jansen        else:
65184b744775206eceefc9c94ba3e23f18332ac062bJack Jansen            locale_extra_link_args = []
652e6ddc8b20b493fef2e7cffb2e1351fe1d238857eTim Peters
65384b744775206eceefc9c94ba3e23f18332ac062bJack Jansen
654d28216b279743ed680d84fe37da190e9754e6be4Jason Tishler        exts.append( Extension('_locale', ['_localemodule.c'],
65584b744775206eceefc9c94ba3e23f18332ac062bJack Jansen                               libraries=locale_libs,
65684b744775206eceefc9c94ba3e23f18332ac062bJack Jansen                               extra_link_args=locale_extra_link_args) )
65700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
65800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Modules with some UNIX dependencies -- on by default:
65900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # (If you have a really backward UNIX, select and socket may not be
66000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # supported...)
66100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
66200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # fcntl(2) and ioctl(2)
663857298100b9a5fa5bbcafb2ff578418bc6750e58Antoine Pitrou        libs = []
664857298100b9a5fa5bbcafb2ff578418bc6750e58Antoine Pitrou        if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
665857298100b9a5fa5bbcafb2ff578418bc6750e58Antoine Pitrou            # May be necessary on AIX for flock function
666857298100b9a5fa5bbcafb2ff578418bc6750e58Antoine Pitrou            libs = ['bsd']
667857298100b9a5fa5bbcafb2ff578418bc6750e58Antoine Pitrou        exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
6689545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # pwd(3)
6699545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        exts.append( Extension('pwd', ['pwdmodule.c']) )
6709545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # grp(3)
6719545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        exts.append( Extension('grp', ['grpmodule.c']) )
6729545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # spwd, shadow passwords
6739545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        if (config_h_vars.get('HAVE_GETSPNAM', False) or
6749545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren                config_h_vars.get('HAVE_GETSPENT', False)):
6759545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            exts.append( Extension('spwd', ['spwdmodule.c']) )
676d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
6779545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            missing.append('spwd')
678d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
67900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # select(2); not on ancient System V
68000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('select', ['selectmodule.c']) )
68100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
68200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Fred Drake's interface to the Python parser
68300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('parser', ['parsermodule.c']) )
68400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
6852e1c09c1fd06531a3ce1de5b12ec5c8f771e78e0Guido van Rossum        # cStringIO and cPickle
68600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('cStringIO', ['cStringIO.c']) )
68700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        exts.append( Extension('cPickle', ['cPickle.c']) )
68800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
68900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Memory-mapped files (also works on Win32).
690d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform not in ['atheos']:
691f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis            exts.append( Extension('mmap', ['mmapmodule.c']) )
692d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
693d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('mmap')
69400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
69557269d0c7c7a6fc989fcbef5b82853aa36fb44caAndrew M. Kuchling        # Lance Ellinghaus's syslog module
6969545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # syslog daemon interface
6979545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        exts.append( Extension('syslog', ['syslogmodule.c']) )
69800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
69900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # George Neville-Neil's timing module:
7006143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz        # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
7016143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz        # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
7026143c547dd45dfc56ad05af31b829479a3ce7e2dNeal Norwitz        #exts.append( Extension('timing', ['timingmodule.c']) )
70300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
70400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
7055bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # Here ends the simple stuff.  From here on, modules need certain
7065bbc7b9283c40996c198511f57211d4f77d6a12dAndrew M. Kuchling        # libraries, are platform-specific, or present other surprises.
70700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
70800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
70900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Multimedia modules
71000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # These don't work for 64-bit platforms!!!
71100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # These represent audio samples or images as strings:
71200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
7135e4a3b86b359952dc6ba3da2f48594179a811319Neal Norwitz        # Operations on audio samples
714f9cbf211578c3d5a7d5fe2ac3bf09b1b5a2dd5e2Tim Peters        # According to #993173, this one should actually work fine on
7158fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis        # 64-bit platforms.
7168fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis        exts.append( Extension('audioop', ['audioop.c']) )
7178fbefe28745f980579620147dd0c0fdef94374deMartin v. Löwis
718ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Disabled on 64-bit platforms
7196e3c3c3f19761e35b6320d5ec883f7089e01e2b6Benjamin Peterson        if sys.maxsize != 9223372036854775807L:
72000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Operations on images
72100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('imageop', ['imageop.c']) )
722d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
723dc48b74497b67a449dd622fdaa7d69e7bff65a5eBrett Cannon            missing.extend(['imageop'])
72400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
72500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # readline
72635a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
727449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        readline_termcap_library = ""
728449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        curses_library = ""
729449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        # Determine if readline is already linked against curses or tinfo.
7304d32c9c114dda7ebff8caeae9f4f595f2830d646Stefan Krah        if do_readline and find_executable('ldd'):
731449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            fp = os.popen("ldd %s" % do_readline)
7322e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah            ldd_output = fp.readlines()
7332e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah            ret = fp.close()
7342e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah            if ret is None or ret >> 8 == 0:
7352e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                for ln in ldd_output:
7362e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                    if 'curses' in ln:
7372e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                        readline_termcap_library = re.sub(
7382e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                            r'.*lib(n?cursesw?)\.so.*', r'\1', ln
7392e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                        ).rstrip()
7402e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                        break
7412e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                    if 'tinfo' in ln: # termcap interface split out from ncurses
7422e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                        readline_termcap_library = 'tinfo'
7432e26e23d9df202fa2314b57530e5af32ff326e5bStefan Krah                        break
744449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        # Issue 7384: If readline is already linked against curses,
745449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        # use the same library for the readline and curses modules.
746449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        if 'curses' in readline_termcap_library:
747449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            curses_library = readline_termcap_library
74823152ea5bdf4b2e54bbf9a1efa0c7eba292d38cfStefan Krah        elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
749449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            curses_library = 'ncursesw'
75023152ea5bdf4b2e54bbf9a1efa0c7eba292d38cfStefan Krah        elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
751449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            curses_library = 'ncurses'
75223152ea5bdf4b2e54bbf9a1efa0c7eba292d38cfStefan Krah        elif self.compiler.find_library_file(lib_dirs, 'curses'):
753449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            curses_library = 'curses'
754449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah
755d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
7569f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren            os_release = int(os.uname()[2].split('.')[0])
75705b0d1d04856e159059589c06df43bc3939b7a09Ronald Oussoren            dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
7581f70b878c4b890c66bdb90d8c9ddb59dee0b48dfNed Deily            if (dep_target and
7591f70b878c4b890c66bdb90d8c9ddb59dee0b48dfNed Deily                    (tuple(int(n) for n in dep_target.split('.')[0:2])
7601f70b878c4b890c66bdb90d8c9ddb59dee0b48dfNed Deily                        < (10, 5) ) ):
76105b0d1d04856e159059589c06df43bc3939b7a09Ronald Oussoren                os_release = 8
7629f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren            if os_release < 9:
7639f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren                # MacOSX 10.4 has a broken readline. Don't try to build
7649f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren                # the readline module unless the user has installed a fixed
7659f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren                # readline package
7669f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren                if find_file('readline/rlconf.h', inc_dirs, []) is None:
7679f20d9d0ee78f7bd810dfe788a8d1319afbc36e7Ronald Oussoren                    do_readline = False
76881ae235146a058446e5a2ff8b2722686b9e36cc3Jack Jansen        if do_readline:
769d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform == 'darwin' and os_release < 9:
77039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # In every directory on the search path search for a dynamic
77139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # library and then a static library, instead of first looking
7729c771ba0858c58c56eb37f475d05d5eb528890b4Fred Drake                # for dynamic libraries on the entire path.
7738d496add74530767cad3aa8b5b371b9a7f0b8498Martin Panter                # This way a statically linked custom readline gets picked up
774593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                # before the (possibly broken) dynamic library in /usr/lib.
77539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                readline_extra_link_args = ('-Wl,-search_paths_first',)
77639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            else:
77739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                readline_extra_link_args = ()
77839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
7792efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg            readline_libs = ['readline']
780449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            if readline_termcap_library:
781449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah                pass # Issue 7384: Already linked against curses or tinfo.
782449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            elif curses_library:
783449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah                readline_libs.append(curses_library)
78435a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            elif self.compiler.find_library_file(lib_dirs +
785e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                     ['/usr/lib/termcap'],
786e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                     'termcap'):
7872efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg                readline_libs.append('termcap')
78800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('readline', ['readline.c'],
7897c6fcda7bfe45a3b075f6434ebb65055ab4d7537Marc-André Lemburg                                   library_dirs=['/usr/lib/termcap'],
79039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                                   extra_link_args=readline_extra_link_args,
7912efc3238d749977364568422eb0acec37c2438baMarc-André Lemburg                                   libraries=readline_libs) )
792d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
793d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('readline')
794d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
7959545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        # crypt module.
7962c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
7979545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        if self.compiler.find_library_file(lib_dirs, 'crypt'):
7989545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            libs = ['crypt']
799d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
8009545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren            libs = []
8019545a23c7ffb35417d451d24cc3b0339627965a7Ronald Oussoren        exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
80200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
803ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro        # CSV files
804ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro        exts.append( Extension('_csv', ['_csv.c']) )
805ba9e9781805f85d32b5a2a17efdf00b77d747500Skip Montanaro
80600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # socket(2)
807868f0aac37cf6c879471c3b8e65e6db623460ce5Kristján Valur Jónsson        exts.append( Extension('_socket', ['socketmodule.c', 'timemodule.c'],
808868f0aac37cf6c879471c3b8e65e6db623460ce5Kristján Valur Jónsson                               depends=['socketmodule.h'],
809868f0aac37cf6c879471c3b8e65e6db623460ce5Kristján Valur Jónsson                               libraries=math_libs) )
810a5d2b4cb180ec87d006d63f838860fba785bcad0Marc-André Lemburg        # Detect SSL support for the socket module (via _ssl)
811ade97338016947bad1d0def339328963fca09685Gregory P. Smith        search_for_ssl_incs_in = [
812ade97338016947bad1d0def339328963fca09685Gregory P. Smith                              '/usr/local/ssl/include',
813e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                              '/usr/contrib/ssl/include/'
814e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                             ]
815ade97338016947bad1d0def339328963fca09685Gregory P. Smith        ssl_incs = find_file('openssl/ssl.h', inc_dirs,
816ade97338016947bad1d0def339328963fca09685Gregory P. Smith                             search_for_ssl_incs_in
817fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                             )
818a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis        if ssl_incs is not None:
819a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis            krb5_h = find_file('krb5.h', inc_dirs,
820a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis                               ['/usr/kerberos/include'])
821a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis            if krb5_h:
822a950f7ff0dad8718b999bdd944f5f48c8640be59Martin v. Löwis                ssl_incs += krb5_h
82335a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
824e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                                     ['/usr/local/ssl/lib',
825e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                                      '/usr/contrib/ssl/lib/'
826e7c87327b3d98359d713b9fc66eae01a041bb624Andrew M. Kuchling                                     ] )
827ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
828fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if (ssl_incs is not None and
829fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            ssl_libs is not None):
830a5d2b4cb180ec87d006d63f838860fba785bcad0Marc-André Lemburg            exts.append( Extension('_ssl', ['_ssl.c'],
831fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                                   include_dirs = ssl_incs,
832ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh                                   library_dirs = ssl_libs,
83347d3a7afdaf52887d1bbd1a8cbcd717893c6d480Guido van Rossum                                   libraries = ['ssl', 'crypto'],
834340043ea7916f4ada4e849cfb3da6d7cad621f5dJeremy Hylton                                   depends = ['socketmodule.h']), )
835d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
836d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_ssl')
83700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
838ade97338016947bad1d0def339328963fca09685Gregory P. Smith        # find out which version of OpenSSL we have
839ade97338016947bad1d0def339328963fca09685Gregory P. Smith        openssl_ver = 0
840ade97338016947bad1d0def339328963fca09685Gregory P. Smith        openssl_ver_re = re.compile(
841ade97338016947bad1d0def339328963fca09685Gregory P. Smith            '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
842ade97338016947bad1d0def339328963fca09685Gregory P. Smith
843593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        # look for the openssl version header on the compiler search path.
844593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        opensslv_h = find_file('openssl/opensslv.h', [],
845593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                inc_dirs + search_for_ssl_incs_in)
846593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        if opensslv_h:
847593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
848d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform == 'darwin' and is_macosx_sdk_path(name):
849593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                name = os.path.join(macosx_sdk_root(), name[1:])
850593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            try:
851593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                incfile = open(name, 'r')
852593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                for line in incfile:
853593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    m = openssl_ver_re.match(line)
854593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    if m:
855593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                        openssl_ver = eval(m.group(1))
856593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            except IOError, msg:
857593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                print "IOError while reading opensshv.h:", msg
858593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                pass
859ade97338016947bad1d0def339328963fca09685Gregory P. Smith
860c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith        min_openssl_ver = 0x00907000
861ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith        have_any_openssl = ssl_incs is not None and ssl_libs is not None
862ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith        have_usable_openssl = (have_any_openssl and
863c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith                               openssl_ver >= min_openssl_ver)
864ade97338016947bad1d0def339328963fca09685Gregory P. Smith
865ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith        if have_any_openssl:
866ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith            if have_usable_openssl:
867ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                # The _hashlib module wraps optimized implementations
868ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                # of hash functions from the OpenSSL library.
869ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                exts.append( Extension('_hashlib', ['_hashopenssl.c'],
870ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                                       include_dirs = ssl_incs,
871ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                                       library_dirs = ssl_libs,
872ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                                       libraries = ['ssl', 'crypto']) )
873ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith            else:
874ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                print ("warning: openssl 0x%08x is too old for _hashlib" %
875ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                       openssl_ver)
876ffd5d886c2eb95c04e37736058994b263b2ab424Gregory P. Smith                missing.append('_hashlib')
877c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith        if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
878f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # The _sha module implements the SHA1 hash algorithm.
879f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            exts.append( Extension('_sha', ['shamodule.c']) )
880f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # The _md5 module implements the RSA Data Security, Inc. MD5
881f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith            # Message-Digest Algorithm, described in RFC 1321.  The
8828e39ec78bcede7291e0573fc522425221eb05475Matthias Klose            # necessary files md5.c and md5.h are included here.
883d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith            exts.append( Extension('_md5',
884d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith                            sources = ['md5module.c', 'md5.c'],
885d792392db4b63bea14b40e3f6e3c41ab4eb6e6faGregory P. Smith                            depends = ['md5.h']) )
886f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
887c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith        min_sha2_openssl_ver = 0x00908000
888c2fa18ca20e9ad1b8931eec61ece2a93e24766dbGregory P. Smith        if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
889ade97338016947bad1d0def339328963fca09685Gregory P. Smith            # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
890ade97338016947bad1d0def339328963fca09685Gregory P. Smith            exts.append( Extension('_sha256', ['sha256module.c']) )
891ade97338016947bad1d0def339328963fca09685Gregory P. Smith            exts.append( Extension('_sha512', ['sha512module.c']) )
892f21a5f773964d34c7b6deb7e3d753fae2b9c70e2Gregory P. Smith
89300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Modules that provide persistent dictionary-like semantics.  You will
89400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # probably want to arrange for at least one of them to be available on
89500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # your machine, though none are defined by default because of library
89600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # dependencies.  The Python module anydbm.py provides an
89700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # implementation independent wrapper for these; dumbdbm.py provides
89800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # similar functionality (but slower of course) implemented in Python.
89900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
9001475cd876190ccad16e47600958b226bfd788332Gregory P. Smith        # Sleepycat^WOracle Berkeley DB interface.
9011475cd876190ccad16e47600958b226bfd788332Gregory P. Smith        #  http://www.oracle.com/database/berkeley-db/db/index.html
90257454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro        #
9034eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        # This requires the Sleepycat^WOracle DB code. The supported versions
904e7f4d8483082d2f694e8a89ec531ab378e6b8326Gregory P. Smith        # are set below.  Visit the URL above to download
9053adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        # a release.  Most open source OSes come with one or more
9063adc4aa2fb58aaca2f7692a37239ee3157887166Gregory P. Smith        # versions of BerkeleyDB already installed.
90757454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro
9084950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com        max_db_ver = (5, 3)
9094950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com        min_db_ver = (4, 3)
910e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        db_setup_debug = False   # verbose debug prints from this script?
911e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
9120902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith        def allow_db_ver(db_ver):
9130902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            """Returns a boolean if the given BerkeleyDB version is acceptable.
9140902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith
9150902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            Args:
9160902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith              db_ver: A tuple of the version to verify.
9170902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            """
9180902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            if not (min_db_ver <= db_ver <= max_db_ver):
9190902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                return False
9200902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            # Use this function to filter out known bad configurations.
9210902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            if (4, 6) == db_ver[:2]:
9220902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                # BerkeleyDB 4.6.x is not stable on many architectures.
9230902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                arch = platform_machine()
9240902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                if arch not in ('i386', 'i486', 'i586', 'i686',
9250902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                                'x86_64', 'ia64'):
9260902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                    return False
9270902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            return True
9280902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith
9290902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith        def gen_db_minor_ver_nums(major):
9304950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com            if major == 5:
9314950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com                for x in range(max_db_ver[1]+1):
9324950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com                    if allow_db_ver((5, x)):
9334950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com                        yield x
9344950a3b6ccb91e0ffe937374836caa825e93c742doko@ubuntu.com            elif major == 4:
935ef2436fb1ce7a616d830be0de21a3545a5c0b7f0Benjamin Peterson                for x in range(9):
9360902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                    if allow_db_ver((4, x)):
9370902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                        yield x
9380902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            elif major == 3:
9390902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                for x in (3,):
9400902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                    if allow_db_ver((3, x)):
9410902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                        yield x
9420902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            else:
9430902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                raise ValueError("unknown major BerkeleyDB version", major)
9440902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith
945e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # construct a list of paths to look for the header file in on
946e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # top of the normal inc_dirs.
947e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        db_inc_paths = [
948e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/include/db4',
949e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/local/include/db4',
950e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/opt/sfw/include/db4',
951e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/include/db3',
952e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/usr/local/include/db3',
953e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/opt/sfw/include/db3',
95400c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro            # Fink defaults (http://fink.sourceforge.net/)
95500c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro            '/sw/include/db4',
956e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            '/sw/include/db3',
957e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        ]
958e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # 4.x minor number specific paths
9590902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith        for x in gen_db_minor_ver_nums(4):
960e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/include/db4%d' % x)
9618f40171b6734250008e68f79ae64308e37902dfaNeal Norwitz            db_inc_paths.append('/usr/include/db4.%d' % x)
962e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
963e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/include/db4%d' % x)
964e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/pkg/db-4.%d/include' % x)
96529602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith            db_inc_paths.append('/opt/db-4.%d/include' % x)
96600c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro            # MacPorts default (http://www.macports.org/)
96700c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro            db_inc_paths.append('/opt/local/include/db4%d' % x)
968e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        # 3.x minor number specific paths
9690902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith        for x in gen_db_minor_ver_nums(3):
970e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/include/db3%d' % x)
971e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
972e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/usr/local/include/db3%d' % x)
973e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_inc_paths.append('/pkg/db-3.%d/include' % x)
97429602d2153e56081fad5db19e356e51c37ec2ec8Gregory P. Smith            db_inc_paths.append('/opt/db-3.%d/include' % x)
975e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
976d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if cross_compiling:
977d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            db_inc_paths = []
978d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org
9799b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # Add some common subdirectories for Sleepycat DB to the list,
9809b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # based on the standard include directories. This way DB3/4 gets
9819b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # picked up when it is installed in a non-standard prefix and
9829b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        # the user has added that prefix into inc_dirs.
9839b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        std_variants = []
9849b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren        for dn in inc_dirs:
9859b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            std_variants.append(os.path.join(dn, 'db3'))
9869b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            std_variants.append(os.path.join(dn, 'db4'))
9870902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            for x in gen_db_minor_ver_nums(4):
9889b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db4%d"%x))
9899b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db4.%d"%x))
9900902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith            for x in gen_db_minor_ver_nums(3):
9919b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db3%d"%x))
9929b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                std_variants.append(os.path.join(dn, "db3.%d"%x))
9939b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren
99438ff36c4ccde02b104553ef1ed979c1261196b48Tim Peters        db_inc_paths = std_variants + db_inc_paths
99500c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro        db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
9969b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren
997e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        db_ver_inc_map = {}
998e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
999d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
1000593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            sysroot = macosx_sdk_root()
1001593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1002e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        class db_found(Exception): pass
100357454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro        try:
100405d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis            # See whether there is a Sleepycat header in the standard
100505d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis            # search path.
1006e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            for d in inc_dirs + db_inc_paths:
100705d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                f = os.path.join(d, "db.h")
1008593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1009d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                if host_platform == 'darwin' and is_macosx_sdk_path(d):
1010593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    f = os.path.join(sysroot, d[1:], "db.h")
1011593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1012e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                if db_setup_debug: print "db: looking for db.h in", f
101305d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                if os.path.exists(f):
101405d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                    f = open(f).read()
1015e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
101605d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                    if m:
1017e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        db_major = int(m.group(1))
1018e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
1019e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        db_minor = int(m.group(1))
1020e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        db_ver = (db_major, db_minor)
1021e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
10221475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                        # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
10231475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                        if db_ver == (4, 6):
10241475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                            m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
10251475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                            db_patch = int(m.group(1))
10261475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                            if db_patch < 21:
10271475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                                print "db.h:", db_ver, "patch", db_patch,
10281475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                                print "being ignored (4.6.x must be >= 4.6.21)"
10291475cd876190ccad16e47600958b226bfd788332Gregory P. Smith                                continue
10301475cd876190ccad16e47600958b226bfd788332Gregory P. Smith
10318c510e704e3823df66c2c3ad85912c9a9dda7f14Antoine Pitrou                        if ( (db_ver not in db_ver_inc_map) and
10320902cac4b355e98184b0e435f9bb7e24ed68f6a2Gregory P. Smith                            allow_db_ver(db_ver) ):
1033e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            # save the include directory with the db.h version
103400c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro                            # (first occurrence only)
1035e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            db_ver_inc_map[db_ver] = d
1036738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling                            if db_setup_debug:
1037738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling                                print "db.h: found", db_ver, "in", d
1038e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        else:
1039e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            # we already found a header for this library version
1040e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                            if db_setup_debug: print "db.h: ignoring", d
1041e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    else:
1042e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        # ignore this header, it didn't contain a version number
104300c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro                        if db_setup_debug:
104400c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro                            print "db.h: no version number version in", d
1045e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
1046e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_found_vers = db_ver_inc_map.keys()
1047e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_found_vers.sort()
1048e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
1049e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            while db_found_vers:
1050e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_ver = db_found_vers.pop()
1051e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_incdir = db_ver_inc_map[db_ver]
1052e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
1053e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # check lib directories parallel to the location of the header
1054e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                db_dirs_to_check = [
105500c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro                    db_incdir.replace("include", 'lib64'),
105600c5a0138b52926c303b8954c2d898c90365414bSkip Montanaro                    db_incdir.replace("include", 'lib'),
1057e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                ]
1058593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1059d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                if host_platform != 'darwin':
1060593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
1061593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1062593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                else:
1063593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    # Same as other branch, but takes OSX SDK into account
1064593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    tmp = []
1065593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    for dn in db_dirs_to_check:
1066593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                        if is_macosx_sdk_path(dn):
1067593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                            if os.path.isdir(os.path.join(sysroot, dn[1:])):
1068593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                                tmp.append(dn)
1069593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                        else:
1070593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                            if os.path.isdir(dn):
1071593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                                tmp.append(dn)
1072cd17213e8e8389ea4bce1641d3878ad67b2f7782Ronald Oussoren                    db_dirs_to_check = tmp
1073e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
107424b07bcba350bb86c4d6ca446e1564647a199868Ezio Melotti                # Look for a version specific db-X.Y before an ambiguous dbX
1075e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # XXX should we -ever- look for a dbX name?  Do any
1076e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # systems really not name their library by version and
1077e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                # symlink to more general names?
1078953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre                for dblib in (('db-%d.%d' % db_ver),
1079953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre                              ('db%d%d' % db_ver),
1080953f98d4bdd27c74e2c4220b90e20f8e6e6c8b7fAndrew MacIntyre                              ('db%d' % db_ver[0])):
108135a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                    dblib_file = self.compiler.find_library_file(
1082e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                                    db_dirs_to_check + lib_dirs, dblib )
1083e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    if dblib_file:
1084e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1085e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        raise db_found
1086e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                    else:
1087e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith                        if db_setup_debug: print "db lib: ", dblib, "not found"
1088e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith
1089e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith        except db_found:
1090ef3dab28f25c6725c789704ef140e23071ceb923Brett Cannon            if db_setup_debug:
1091ef3dab28f25c6725c789704ef140e23071ceb923Brett Cannon                print "bsddb using BerkeleyDB lib:", db_ver, dblib
1092ef3dab28f25c6725c789704ef140e23071ceb923Brett Cannon                print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
1093e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            db_incs = [db_incdir]
1094d1b2045958306349b04da931a1a400d7e9a49fb9Jack Jansen            dblibs = [dblib]
1095e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # We add the runtime_library_dirs argument because the
1096e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # BerkeleyDB lib we're linking against often isn't in the
1097e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # system dynamic library search path.  This is usually
1098e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # correct and most trouble free, but may cause problems in
1099e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # some unusual system configurations (e.g. the directory
1100e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            # is on an NFS server that goes away).
11016aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis            exts.append(Extension('_bsddb', ['_bsddb.c'],
1102392505391e1703fe0df4da8e077793f7e71b1075Gregory P. Smith                                  depends = ['bsddb.h'],
110305d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                                  library_dirs=dblib_dir,
110405d4d562d70568469b12cb2b45dfc78886f8c5d9Martin v. Löwis                                  runtime_library_dirs=dblib_dir,
11056aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis                                  include_dirs=db_incs,
11066aa4a1f29ca575e25fc595857b2a5168a02c9780Martin v. Löwis                                  libraries=dblibs))
110757454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro        else:
1108e76c8c03830072b220f337dfca72c5e6c2660e8eGregory P. Smith            if db_setup_debug: print "db: no appropriate library found"
110957454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            db_incs = None
111057454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            dblibs = []
111157454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro            dblib_dir = None
1112d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_bsddb')
111357454e57f83b407dd2653cbfcead7c9801beeff0Skip Montanaro
1114c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        # The sqlite interface
1115738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling        sqlite_setup_debug = False   # verbose debug prints from this script?
1116c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter
11173dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        # We hunt for #define SQLITE_VERSION "n.n.n"
11183dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        # We need to find >= sqlite version 3.0.8
1119c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        sqlite_incdir = sqlite_libdir = None
11203dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        sqlite_inc_paths = [ '/usr/include',
1121c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/include/sqlite',
1122c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/include/sqlite3',
1123c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/local/include',
1124c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/local/include/sqlite',
1125c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                             '/usr/local/include/sqlite3',
1126c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                           ]
1127d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if cross_compiling:
1128d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            sqlite_inc_paths = []
11293dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
11303dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter        MIN_SQLITE_VERSION = ".".join([str(x)
11313dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                                    for x in MIN_SQLITE_VERSION_NUMBER])
113239be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
113339be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        # Scan the default include directories before the SQLite specific
113439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        # ones. This allows one to override the copy of sqlite on OSX,
113539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren        # where /usr/include contains an old version of sqlite.
1136d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
1137593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            sysroot = macosx_sdk_root()
1138593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1139670280470d1da26eb047584ed6e6c22f36bb01f2Ned Deily        for d_ in inc_dirs + sqlite_inc_paths:
1140670280470d1da26eb047584ed6e6c22f36bb01f2Ned Deily            d = d_
1141d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform == 'darwin' and is_macosx_sdk_path(d):
1142670280470d1da26eb047584ed6e6c22f36bb01f2Ned Deily                d = os.path.join(sysroot, d[1:])
1143593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1144670280470d1da26eb047584ed6e6c22f36bb01f2Ned Deily            f = os.path.join(d, "sqlite3.h")
1145c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            if os.path.exists(f):
114607f5b35e190ab9be85143c6e8e1217d96bbf75caAnthony Baxter                if sqlite_setup_debug: print "sqlite: found %s"%f
11473dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                incf = open(f).read()
11483dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                m = re.search(
1149c23178ba36097764bc3c1c33aa8dba2a0871e778Petri Lehtinen                    r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
1150c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                if m:
11513dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    sqlite_version = m.group(1)
11523dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    sqlite_version_tuple = tuple([int(x)
11533dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                                        for x in sqlite_version.split(".")])
11543dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1155c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        # we win!
1156738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling                        if sqlite_setup_debug:
1157738446f44d6d37d920d00fa99bbb1a7084bd537bAndrew M. Kuchling                            print "%s/sqlite3.h: version %s"%(d, sqlite_version)
1158c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        sqlite_incdir = d
1159c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                        break
1160c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                    else:
11613dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                        if sqlite_setup_debug:
1162c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                            print "%s: version %d is too old, need >= %s"%(d,
1163c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                        sqlite_version, MIN_SQLITE_VERSION)
11643dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                elif sqlite_setup_debug:
11653dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                    print "sqlite: %s had no SQLITE_VERSION"%(f,)
11663dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter
1167c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        if sqlite_incdir:
1168c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            sqlite_dirs_to_check = [
1169c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', 'lib64'),
1170c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', 'lib'),
1171c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1172c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                os.path.join(sqlite_incdir, '..', '..', 'lib'),
1173c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            ]
117435a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            sqlite_libfile = self.compiler.find_library_file(
1175c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                sqlite_dirs_to_check + lib_dirs, 'sqlite3')
11761ae415cbee7c35f00a167df84a6ca0759d66a4e5Hirokazu Yamamoto            if sqlite_libfile:
11771ae415cbee7c35f00a167df84a6ca0759d66a4e5Hirokazu Yamamoto                sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
1178c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter
1179c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter        if sqlite_incdir and sqlite_libdir:
11803e99c0ad649de0393d9a8af17f34d9d1f55f4ab2Gerhard Häring            sqlite_srcs = ['_sqlite/cache.c',
1181c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/connection.c',
1182c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/cursor.c',
1183c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/microprotocols.c',
1184c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/module.c',
1185c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/prepare_protocol.c',
1186c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/row.c',
1187c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/statement.c',
1188c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                '_sqlite/util.c', ]
1189c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter
1190c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            sqlite_defines = []
1191d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform != "win32":
11928e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter                sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1193c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            else:
11948e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter                sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
11958e7b4908901e30f594e52d5fdcdc8b4e2d274ff1Anthony Baxter
11963bbb67273a8c146a38de91080a37e716e2699622Gerhard Häring            # Comment this out if you want the sqlite3 module to be able to load extensions.
11973bbb67273a8c146a38de91080a37e716e2699622Gerhard Häring            sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
119839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
1199d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform == 'darwin':
120039be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # In every directory on the search path search for a dynamic
120139be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # library and then a static library, instead of first looking
1202c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti                # for dynamic libraries on the entire path.
1203c2077b0d9b5bf99768c6f396bf7ae6c41b682465Ezio Melotti                # This way a statically linked custom sqlite gets picked up
120439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                # before the dynamic library in /usr/lib.
120539be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                sqlite_extra_link_args = ('-Wl,-search_paths_first',)
120639be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren            else:
120739be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                sqlite_extra_link_args = ()
120839be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren
1209c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter            exts.append(Extension('_sqlite3', sqlite_srcs,
1210c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  define_macros=sqlite_defines,
12113dc6bb3c25dd2834b198a4bbcff2f9b760d1a2d9Anthony Baxter                                  include_dirs=["Modules/_sqlite",
1212c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                                sqlite_incdir],
1213c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  library_dirs=sqlite_libdir,
121439be38c96555cdfea3fa7ef5b1d5d2fd48373b52Ronald Oussoren                                  extra_link_args=sqlite_extra_link_args,
1215c51ee69b27a35bb45e501766dd33674eae7ddb30Anthony Baxter                                  libraries=["sqlite3",]))
1216d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1217d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_sqlite3')
121822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro
121922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # Look for Berkeley db 1.85.   Note that it is built as a different
122022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # module name so it can be included even when later versions are
122122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # available.  A very restrictive search is performed to avoid
122222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # accidentally building this module with a later version of the
122322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # underlying db library.  May BSD-ish Unixes incorporate db 1.85
122422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        # symbols into libc and place the include file in /usr/include.
12254eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        #
12264eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        # If the better bsddb library can be built (db_incs is defined)
12274eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        # we do not build this one.  Otherwise this build will pick up
12284eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        # the more recent berkeleydb's db.h file first in the include path
12294eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        # when attempting to compile and it will fail.
123022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro        f = "/usr/include/db.h"
1231593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1232d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
1233593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            if is_macosx_sdk_path(f):
1234593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                sysroot = macosx_sdk_root()
1235593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                f = os.path.join(sysroot, f[1:])
1236593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
12374eb60e5330758e1bdf9809dfa4bbe0991e16674dGregory P. Smith        if os.path.exists(f) and not db_incs:
123822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            data = open(f).read()
123922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
124022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro            if m is not None:
124122e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                # bingo - old version used hash file format version 2
124222e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                ### XXX this should be fixed to not be platform-dependent
124322e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                ### but I don't have direct access to an osf1 platform and
124422e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                ### seemed to be muffing the search somehow
1245d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                libraries = host_platform == "osf1" and ['db'] or None
124622e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                if libraries is not None:
124722e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                    exts.append(Extension('bsddb185', ['bsddbmodule.c'],
124822e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                                          libraries=libraries))
124922e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                else:
125022e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro                    exts.append(Extension('bsddb185', ['bsddbmodule.c']))
1251d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            else:
1252d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('bsddb185')
1253d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1254d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('bsddb185')
125522e00c42c092c151ab220b234e859d91f5b19c77Skip Montanaro
1256edfe72f66fd789d65b0c7125540c08d3e98a901eBenjamin Peterson        dbm_order = ['gdbm']
125700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # The standard Unix dbm module:
1258d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform not in ['cygwin']:
125951c614e3bf7623959ef029a434ee7aa7d77c219dMatthias Klose            config_args = [arg.strip("'")
126051c614e3bf7623959ef029a434ee7aa7d77c219dMatthias Klose                           for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1261edfe72f66fd789d65b0c7125540c08d3e98a901eBenjamin Peterson            dbm_args = [arg for arg in config_args
126210cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        if arg.startswith('--with-dbmliborder=')]
126310cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose            if dbm_args:
1264edfe72f66fd789d65b0c7125540c08d3e98a901eBenjamin Peterson                dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
126510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose            else:
126651c614e3bf7623959ef029a434ee7aa7d77c219dMatthias Klose                dbm_order = "ndbm:gdbm:bdb".split(":")
126710cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose            dbmext = None
126810cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose            for cand in dbm_order:
126910cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                if cand == "ndbm":
127010cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                    if find_file("ndbm.h", inc_dirs, []) is not None:
1271970fcef84bb633e96353de6bf517e4837c90436eNick Coghlan                        # Some systems have -lndbm, others have -lgdbm_compat,
1272970fcef84bb633e96353de6bf517e4837c90436eNick Coghlan                        # others don't have either
127335a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                        if self.compiler.find_library_file(lib_dirs,
1274e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                               'ndbm'):
127510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            ndbm_libs = ['ndbm']
1276970fcef84bb633e96353de6bf517e4837c90436eNick Coghlan                        elif self.compiler.find_library_file(lib_dirs,
1277970fcef84bb633e96353de6bf517e4837c90436eNick Coghlan                                                             'gdbm_compat'):
1278970fcef84bb633e96353de6bf517e4837c90436eNick Coghlan                            ndbm_libs = ['gdbm_compat']
127910cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        else:
128010cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            ndbm_libs = []
128110cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        print "building dbm using ndbm"
128210cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        dbmext = Extension('dbm', ['dbmmodule.c'],
128310cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           define_macros=[
128410cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                               ('HAVE_NDBM_H',None),
128510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                               ],
128610cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           libraries=ndbm_libs)
128710cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        break
128810cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose
128910cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                elif cand == "gdbm":
129035a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                    if self.compiler.find_library_file(lib_dirs, 'gdbm'):
129110cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        gdbm_libs = ['gdbm']
129235a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                        if self.compiler.find_library_file(lib_dirs,
1293e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                               'gdbm_compat'):
129410cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            gdbm_libs.append('gdbm_compat')
129510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
129610cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            print "building dbm using gdbm"
129710cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            dbmext = Extension(
129810cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                'dbm', ['dbmmodule.c'],
129910cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                define_macros=[
130010cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                    ('HAVE_GDBM_NDBM_H', None),
130110cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                    ],
130210cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                libraries = gdbm_libs)
130310cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            break
130410cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
130510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            print "building dbm using gdbm"
130610cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            dbmext = Extension(
130710cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                'dbm', ['dbmmodule.c'],
130810cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                define_macros=[
130910cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                    ('HAVE_GDBM_DASH_NDBM_H', None),
131010cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                    ],
131110cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                libraries = gdbm_libs)
131210cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                            break
131310cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                elif cand == "bdb":
131410cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                    if db_incs is not None:
131510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        print "building dbm using bdb"
131610cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        dbmext = Extension('dbm', ['dbmmodule.c'],
131710cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           library_dirs=dblib_dir,
131810cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           runtime_library_dirs=dblib_dir,
131910cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           include_dirs=db_incs,
132010cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           define_macros=[
132110cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                               ('HAVE_BERKDB_H', None),
132210cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                               ('DB_DBM_HSEARCH', None),
132310cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                               ],
132410cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                                           libraries=dblibs)
132510cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                        break
132610cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose            if dbmext is not None:
132710cbe4886e796ccb8e38bb4d93265ff50c8a761fMatthias Klose                exts.append(dbmext)
1328d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            else:
1329d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('dbm')
1330ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
133100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
1332edfe72f66fd789d65b0c7125540c08d3e98a901eBenjamin Peterson        if ('gdbm' in dbm_order and
133335a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            self.compiler.find_library_file(lib_dirs, 'gdbm')):
133400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('gdbm', ['gdbmmodule.c'],
133500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = ['gdbm'] ) )
1336d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1337d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('gdbm')
133800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
133900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Unix-only modules
1340d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform not in ['win32']:
134100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Steen Lumholt's termios module
134200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('termios', ['termios.c']) )
134300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Jeremy Hylton's rlimit interface
1344d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform not in ['atheos']:
1345f90ae20354ceb501f0ba0b6459df17f1a8005a47Martin v. Löwis                exts.append( Extension('resource', ['resource.c']) )
1346d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            else:
1347d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('resource')
134800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
1349cf393f3fd9759ffac71c816f97ea01780848512cAndrew M. Kuchling            # Sun yellow pages. Some systems have the functions in libc.
1350d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if (host_platform not in ['cygwin', 'atheos', 'qnx6'] and
1351eb74da8e67bed4beef1bfc97384b3aa6e0f9836bBenjamin Peterson                find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
135235a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                if (self.compiler.find_library_file(lib_dirs, 'nsl')):
13536efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                    libs = ['nsl']
13546efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                else:
13556efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                    libs = []
13566efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                exts.append( Extension('nis', ['nismodule.c'],
13576efc6e783247f54e4dd3b4297a0a7d2bc654a141Andrew M. Kuchling                                       libraries = libs) )
1358d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            else:
1359d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('nis')
1360d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1361d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.extend(['nis', 'resource', 'termios'])
136200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
136372092941125cb0a3577fbf63294d14a02bb5dd2aSkip Montanaro        # Curses support, requiring the System V version of curses, often
1364ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # provided by the ncurses library.
136586070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling        panel_library = 'panel'
1366f27ec3e5515115080b270c5530929d365791c2c1doko@ubuntu.com        curses_incs = None
1367449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah        if curses_library.startswith('ncurses'):
1368449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            if curses_library == 'ncursesw':
1369449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah                # Bug 1464056: If _curses.so links with ncursesw,
1370449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah                # _curses_panel.so must link with panelw.
1371449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah                panel_library = 'panelw'
1372449aa86bd6a7d41f810dc85c86a7cfaf9c50bc9aStefan Krah            curses_libs = [curses_library]
1373f27ec3e5515115080b270c5530929d365791c2c1doko@ubuntu.com            curses_incs = find_file('curses.h', inc_dirs,
1374f27ec3e5515115080b270c5530929d365791c2c1doko@ubuntu.com                                    [os.path.join(d, 'ncursesw') for d in inc_dirs])
137500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('_curses', ['_cursesmodule.c'],
1376f27ec3e5515115080b270c5530929d365791c2c1doko@ubuntu.com                                   include_dirs = curses_incs,
137700e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = curses_libs) )
1378d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif curses_library == 'curses' and host_platform != 'darwin':
13795b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                # OSX has an old Berkeley curses, not good enough for
13805b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson                # the _curses module.
138135a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
138200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                curses_libs = ['curses', 'terminfo']
138335a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
138400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                curses_libs = ['curses', 'termcap']
13850b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz            else:
13860b27ff92d2127ed39f52d9987e4e96313937cbc8Neal Norwitz                curses_libs = ['curses']
1387ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
138800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('_curses', ['_cursesmodule.c'],
138900e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                                   libraries = curses_libs) )
1390d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1391d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_curses')
1392ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
139300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # If the curses module is enabled, check for the panel module
1394e7ffbb24e80800de3667a88af96d03f8c9717039Andrew M. Kuchling        if (module_enabled(exts, '_curses') and
139535a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            self.compiler.find_library_file(lib_dirs, panel_library)):
139600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('_curses_panel', ['_curses_panel.c'],
1397f27ec3e5515115080b270c5530929d365791c2c1doko@ubuntu.com                                   include_dirs = curses_incs,
139886070428898b811339b0e4454e10ebf6f6ad4641Andrew M. Kuchling                                   libraries = [panel_library] + curses_libs) )
1399d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1400d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_curses_panel')
1401ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1402259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # Andrew Kuchling's zlib module.  Note that some versions of zlib
1403259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # 1.1.3 have security problems.  See CERT Advisory CA-2002-07:
1404259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # http://www.cert.org/advisories/CA-2002-07.html
1405259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        #
1406259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1407259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # patch its zlib 1.1.3 package instead of upgrading to 1.1.4.  For
1408259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # now, we still accept 1.1.3, because we think it's difficult to
1409259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # exploit this in Python, and we'd rather make it RedHat's problem
1410259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # than our problem <wink>.
1411259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        #
1412259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # You can upgrade zlib to version 1.1.4 yourself by going to
1413259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw        # http://www.gzip.org/zlib/
1414e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum        zlib_inc = find_file('zlib.h', [], inc_dirs)
1415440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith        have_zlib = False
1416e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum        if zlib_inc is not None:
1417e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            zlib_h = zlib_inc[0] + '/zlib.h'
1418e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            version = '"0.0.0"'
1419259b1e18b4b5f8acca8366efa3a06e7d489d1045Barry Warsaw            version_req = '"1.1.3"'
14206ea3c9b22a3e81e6484a30c1d64c6a859a40da6aNed Deily            if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
14216ea3c9b22a3e81e6484a30c1d64c6a859a40da6aNed Deily                zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
1422e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            fp = open(zlib_h)
1423e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            while 1:
1424e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                line = fp.readline()
1425e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                if not line:
1426e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    break
14278cdc03dca571fd2847d68bfd220234c0153f8f47Guido van Rossum                if line.startswith('#define ZLIB_VERSION'):
1428e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    version = line.split()[2]
1429e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    break
1430e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum            if version >= version_req:
143135a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                if (self.compiler.find_library_file(lib_dirs, 'z')):
1432d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                    if host_platform == "darwin":
14339b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                        zlib_extra_link_args = ('-Wl,-search_paths_first',)
14349b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                    else:
14359b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                        zlib_extra_link_args = ()
1436e697091c45001a1674434a553d67e15f2c6b13b8Guido van Rossum                    exts.append( Extension('zlib', ['zlibmodule.c'],
14379b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                           libraries = ['z'],
14389b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                           extra_link_args = zlib_extra_link_args))
1439440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith                    have_zlib = True
1440d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                else:
1441d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                    missing.append('zlib')
1442d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            else:
1443d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('zlib')
1444d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1445d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('zlib')
144600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
1447440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith        # Helper module for various ascii-encoders.  Uses zlib for an optimized
1448440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith        # crc32 if we have it.  Otherwise binascii uses its own.
1449440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith        if have_zlib:
1450440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith            extra_compile_args = ['-DUSE_ZLIB_CRC32']
1451440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith            libraries = ['z']
1452440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith            extra_link_args = zlib_extra_link_args
1453440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith        else:
1454440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith            extra_compile_args = []
1455440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith            libraries = []
1456440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith            extra_link_args = []
1457440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith        exts.append( Extension('binascii', ['binascii.c'],
1458440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith                               extra_compile_args = extra_compile_args,
1459440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith                               libraries = libraries,
1460440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith                               extra_link_args = extra_link_args) )
1461440ca772f33b7c2eae1beb2e26a643d3054066f9Gregory P. Smith
1462f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer        # Gustavo Niemeyer's bz2 module.
146335a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        if (self.compiler.find_library_file(lib_dirs, 'bz2')):
1464d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform == "darwin":
14659b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                bz2_extra_link_args = ('-Wl,-search_paths_first',)
14669b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren            else:
14679b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                bz2_extra_link_args = ()
1468f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer            exts.append( Extension('bz2', ['bz2module.c'],
14699b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                   libraries = ['bz2'],
14709b8b619491144430a88c2a767e398c67ae057c5aRonald Oussoren                                   extra_link_args = bz2_extra_link_args) )
1471d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1472d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('bz2')
1473f8ca8364c9682df468a982a5f29831b76521bb6dGustavo Niemeyer
147400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Interface to the Expat XML parser
147500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        #
14762fd2e867879a7e44c91d43a48b71a59836849f0aBenjamin Peterson        # Expat was written by James Clark and is now maintained by a group of
14772fd2e867879a7e44c91d43a48b71a59836849f0aBenjamin Peterson        # developers on SourceForge; see www.libexpat.org for more information.
14782fd2e867879a7e44c91d43a48b71a59836849f0aBenjamin Peterson        # The pyexpat module was written by Paul Prescod after a prototype by
14792fd2e867879a7e44c91d43a48b71a59836849f0aBenjamin Peterson        # Jack Jansen.  The Expat source is included in Modules/expat/.  Usage
14802fd2e867879a7e44c91d43a48b71a59836849f0aBenjamin Peterson        # of a system shared libexpat.so is possible with --with-system-expat
1481206e10c014e8b61b2c0cb52c797cec63a73c0f8bBenjamin Peterson        # configure option.
1482fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        #
1483fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        # More information on Expat can be found at www.libexpat.org.
1484fc8341d0706bcf41711b289897cf7b8c4b7178a7Fred Drake        #
14852c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson        if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
14862c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            expat_inc = []
14872c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            define_macros = []
14882c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            expat_lib = ['expat']
14892c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            expat_sources = []
149056656b01182a2f480b333d9137908faff10b9ba5Christian Heimes            expat_depends = []
14912c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson        else:
14922c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
14932c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            define_macros = [
14942c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                ('HAVE_EXPAT_CONFIG_H', '1'),
14952c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            ]
14962c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            expat_lib = []
14972c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson            expat_sources = ['expat/xmlparse.c',
14982c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                             'expat/xmlrole.c',
14992c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                             'expat/xmltok.c']
150056656b01182a2f480b333d9137908faff10b9ba5Christian Heimes            expat_depends = ['expat/ascii.h',
150156656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/asciitab.h',
150256656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/expat.h',
150356656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/expat_config.h',
150456656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/expat_external.h',
150556656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/internal.h',
150656656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/latin1tab.h',
150756656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/utf8tab.h',
150856656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/xmlrole.h',
150956656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/xmltok.h',
151056656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             'expat/xmltok_impl.h'
151156656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                             ]
1512988117fd6323c2b21ce1bdb2b1153a5d759a511cRonald Oussoren
15132d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake        exts.append(Extension('pyexpat',
15142d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                              define_macros = define_macros,
15152c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                              include_dirs = expat_inc,
15162c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                              libraries = expat_lib,
151756656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                              sources = ['pyexpat.c'] + expat_sources,
151856656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                              depends = expat_depends,
15192d59a4921234333b55e4f7b7f54d5649771d7c09Fred Drake                              ))
152000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
15214c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh        # Fredrik Lundh's cElementTree module.  Note that this also
15224c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh        # uses expat (via the CAPI hook in pyexpat).
15234c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh
15246c403597954487e8129221351f72da3735c52c09Hye-Shik Chang        if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
15254c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh            define_macros.append(('USE_PYEXPAT_CAPI', None))
15264c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh            exts.append(Extension('_elementtree',
15274c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  define_macros = define_macros,
15282c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                                  include_dirs = expat_inc,
15292c19674b51291c361842ec02f2ddbb9b472a2f5cBenjamin Peterson                                  libraries = expat_lib,
15304c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  sources = ['_elementtree.c'],
153156656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                                  depends = ['pyexpat.c'] + expat_sources +
153256656b01182a2f480b333d9137908faff10b9ba5Christian Heimes                                      expat_depends,
15334c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh                                  ))
1534d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1535d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_elementtree')
15364c86ec651e4f251a9cf5a200d3521ea28566d3a0Fredrik Lundh
15373e2a30692085d32ac63f72b35da39158a471fc68Hye-Shik Chang        # Hye-Shik Chang's CJKCodecs modules.
1538e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis        if have_unicode:
1539e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis            exts.append(Extension('_multibytecodec',
1540e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis                                  ['cjkcodecs/multibytecodec.c']))
1541e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis            for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1542d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                exts.append(Extension('_codecs_%s' % loc,
1543e2713becd8cb0c3b2db4d33832dd57a1d619f0f3Martin v. Löwis                                      ['cjkcodecs/_codecs_%s.c' % loc]))
1544d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1545d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_multibytecodec')
1546d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1547d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('_codecs_%s' % loc)
15483e2a30692085d32ac63f72b35da39158a471fc68Hye-Shik Chang
15495b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson        # Dynamic loading module
1550770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum        if sys.maxint == 0x7fffffff:
1551770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum            # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1552770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum            dl_inc = find_file('dlfcn.h', [], inc_dirs)
1553d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if (dl_inc is not None) and (host_platform not in ['atheos']):
1554770acd3f7fff52eef0d0ad02beaa4c569d70811fGuido van Rossum                exts.append( Extension('dl', ['dlmodule.c']) )
1555d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            else:
1556d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro                missing.append('dl')
1557d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1558d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('dl')
15595b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1560cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        # Thomas Heller's _ctypes module
15619176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        self.detect_ctypes(inc_dirs, lib_dirs)
1562cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
1563190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson        # Richard Oudkerk's multiprocessing module
1564d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'win32':             # Windows
1565190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            macros = dict()
1566190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            libraries = ['ws2_32']
1567190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
1568d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform == 'darwin':          # Mac OSX
1569355b1264b80506dddb536dc338ed91e061032309Jesse Noller            macros = dict()
1570190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            libraries = []
1571190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
1572d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform == 'cygwin':          # Cygwin
1573355b1264b80506dddb536dc338ed91e061032309Jesse Noller            macros = dict()
1574190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            libraries = []
157599c48a8d315fe55c8e1e8eac2e01cd930cb89686Hye-Shik Chang
1576d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
157799c48a8d315fe55c8e1e8eac2e01cd930cb89686Hye-Shik Chang            # FreeBSD's P1003.1b semaphore support is very experimental
157899c48a8d315fe55c8e1e8eac2e01cd930cb89686Hye-Shik Chang            # and has many known problems. (as of June 2008)
1579355b1264b80506dddb536dc338ed91e061032309Jesse Noller            macros = dict()
158099c48a8d315fe55c8e1e8eac2e01cd930cb89686Hye-Shik Chang            libraries = []
158199c48a8d315fe55c8e1e8eac2e01cd930cb89686Hye-Shik Chang
1582d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform.startswith('openbsd'):
1583355b1264b80506dddb536dc338ed91e061032309Jesse Noller            macros = dict()
158437040cdace1982772e5f35e4acfa13861d72065dJesse Noller            libraries = []
158537040cdace1982772e5f35e4acfa13861d72065dJesse Noller
1586d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform.startswith('netbsd'):
1587355b1264b80506dddb536dc338ed91e061032309Jesse Noller            macros = dict()
158840a6164afa79f6b97e7e40e0f35f6081fde437c2Jesse Noller            libraries = []
158940a6164afa79f6b97e7e40e0f35f6081fde437c2Jesse Noller
1590190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson        else:                                   # Linux and other unices
1591355b1264b80506dddb536dc338ed91e061032309Jesse Noller            macros = dict()
1592190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            libraries = ['rt']
1593190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
1594d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'win32':
1595190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1596190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                     '_multiprocessing/semaphore.c',
1597190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                     '_multiprocessing/pipe_connection.c',
1598190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                     '_multiprocessing/socket_connection.c',
1599190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                     '_multiprocessing/win32_functions.c'
1600190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                   ]
1601190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
1602190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson        else:
1603190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson            multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1604190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                     '_multiprocessing/socket_connection.c'
1605190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                                   ]
1606c4920e86ef7511b4e858028e870b1811437a71d0Mark Dickinson            if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
16075afa6d4dcf6e11d2ba4c10fb4b9b860930130df8Mark Dickinson                sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
1608190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson                multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1609190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
1610f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller        if sysconfig.get_config_var('WITH_THREAD'):
1611f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller            exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1612f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller                                    define_macros=macros.items(),
1613f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller                                    include_dirs=["Modules/_multiprocessing"]))
1614f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller        else:
1615f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller            missing.append('_multiprocessing')
1616f6da8d149525f19378b6f27a597fb2d022f84895Jesse Noller
1617190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson        # End multiprocessing
1618190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
1619190d56e00990eadce8ad1b7d1785016cc109db7bBenjamin Peterson
162000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # Platform-specific libraries
1621d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'linux2':
162200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            # Linux-specific modules
162300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
1624d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1625d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('linuxaudiodev')
16260a6355eb1fb5af03827a00e146c147c94efe78c9Greg Ward
1627d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
16288a96d209f02e0e4cd3d515fa2722a72a89017b2fMatthias Klose                        'freebsd7', 'freebsd8')
1629d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            or host_platform.startswith("gnukfreebsd")):
16300c016a9590b3da47f19420d0616e0c72cae19abfGuido van Rossum            exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
1631d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1632d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('ossaudiodev')
163300e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
1634d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'sunos5':
1635ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh            # SunOS specific modules
163600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling            exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
1637d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        else:
1638d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('sunaudiodev')
16395b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1640d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
1641a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren            # _scproxy
1642a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren            exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1643a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren                extra_link_args= [
1644a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren                    '-framework', 'SystemConfiguration',
1645a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren                    '-framework', 'CoreFoundation'
1646a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren                ]))
1647a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren
1648a5b642c9332333f78876f8ae5ccde8d055fda5eaRonald Oussoren
1649d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
1650090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                sysconfig.get_config_var("CONFIG_ARGS")):
1651090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren
165205b0d1d04856e159059589c06df43bc3939b7a09Ronald Oussoren            if int(os.uname()[2].split('.')[0]) >= 8:
1653090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # We're on Mac OS X 10.4 or later, the compiler should
1654090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # support '-Wno-deprecated-declarations'. This will
165599496760c71ec6a798eadfe3d5beca418cd26300Martin Panter                # suppress deprecation warnings for the Carbon extensions,
1656090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # these extensions wrap the Carbon APIs and even those
1657090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                # parts that are deprecated.
1658090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1659090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren            else:
1660090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                carbon_extra_compile_args = []
1661090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren
166205ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum            # Mac OS X specific modules.
16633e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            def macSrcExists(name1, name2=''):
16643e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if not name1:
16653e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    return None
16663e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                names = (name1,)
16673e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if name2:
16683e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    names = (name1, name2)
16693e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                path = os.path.join(srcdir, 'Mac', 'Modules', *names)
16703e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                return os.path.exists(path)
16713e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
16723e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            def addMacExtension(name, kwds, extra_srcs=[]):
16733e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                dirname = ''
16743e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if name[0] == '_':
16753e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    dirname = name[1:].lower()
16763e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                cname = name + '.c'
16773e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                cmodulename = name + 'module.c'
16783e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
16793e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                if macSrcExists(cname):
16803e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [cname]
16813e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                elif macSrcExists(cmodulename):
16823e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [cmodulename]
16833e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                elif macSrcExists(dirname, cname):
16843e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    # XXX(nnorwitz): If all the names ended with module, we
16853e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    # wouldn't need this condition.  ibcarbon is the only one.
16863e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [os.path.join(dirname, cname)]
16873e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                elif macSrcExists(dirname, cmodulename):
16883e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    srcs = [os.path.join(dirname, cmodulename)]
16893e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                else:
16903e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                    raise RuntimeError("%s not found" % name)
16913e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
16923e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                # Here's the whole point:  add the extension with sources
16933e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                exts.append(Extension(name, srcs + extra_srcs, **kwds))
16943e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
16953e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            # Core Foundation
16963e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            core_kwds = {'extra_compile_args': carbon_extra_compile_args,
16973e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                         'extra_link_args': ['-framework', 'CoreFoundation'],
16983e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                        }
16993e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
17003e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('autoGIL', core_kwds)
17013e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
170251f0633efdc31ae29d5813881a96b0c737fca075Ronald Oussoren
170351f0633efdc31ae29d5813881a96b0c737fca075Ronald Oussoren
17043e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            # Carbon
17053e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
17063e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           'extra_link_args': ['-framework', 'Carbon'],
17073e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                          }
1708a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter            CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1709a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           'OSATerminology', 'icglue',
17103e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           # All these are in subdirs
1711a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
17123e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                           '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
1713a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           '_Help', '_Icn', '_IBCarbon', '_List',
1714a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                           '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
17155640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                           '_Scrap', '_Snd', '_TE',
1716a2a26b9e1f00692c01ea6a731eef7d150088a5bdAnthony Baxter                          ]
17173e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            for name in CARBON_EXTS:
17183e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                addMacExtension(name, carbon_kwds)
17193e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
17205640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # Workaround for a bug in the version of gcc shipped with Xcode 3.
17215640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # The _Win extension should build just like the other Carbon extensions, but
17225640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            # this actually results in a hard crash of the linker.
17235640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            #
17245640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            if '-arch ppc64' in cflags and '-arch ppc' in cflags:
17255640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
17265640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                               'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
17275640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                           }
17285640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                addMacExtension('_Win', win_kwds)
17295640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren            else:
17305640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                addMacExtension('_Win', carbon_kwds)
17315640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren
17325640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren
17333e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            # Application Services & QuickTime
17343e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            app_kwds = {'extra_compile_args': carbon_extra_compile_args,
17353e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                        'extra_link_args': ['-framework','ApplicationServices'],
17363e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz                       }
17373e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('_Launch', app_kwds)
17383e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz            addMacExtension('_CG', app_kwds)
17393e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
174005ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum            exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
1741090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                        extra_compile_args=carbon_extra_compile_args,
1742090f81588fc2298b3c967ddda3c3ffc592caf92aRonald Oussoren                        extra_link_args=['-framework', 'QuickTime',
174305ced6aa761bab7348e95a479b6f791e636ceae7Just van Rossum                                     '-framework', 'Carbon']) )
17443e1ec3aa22ea152b8485c1d8cd986b6eff68ece8Neal Norwitz
17455b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1746fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        self.extensions.extend(exts)
1747fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1748fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Call the method for detecting whether _tkinter can be compiled
1749fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        self.detect_tkinter(inc_dirs, lib_dirs)
1750ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1751d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        if '_tkinter' not in [e.name for e in self.extensions]:
1752d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro            missing.append('_tkinter')
1753d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
17542852364135f105c1af38fdc378f50d79c6996b38Georg Brandl##         # Uncomment these lines if you want to play with xxmodule.c
17552852364135f105c1af38fdc378f50d79c6996b38Georg Brandl##         ext = Extension('xx', ['xxmodule.c'])
17562852364135f105c1af38fdc378f50d79c6996b38Georg Brandl##         self.extensions.append(ext)
17572852364135f105c1af38fdc378f50d79c6996b38Georg Brandl
1758d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro        return missing
1759d1287323ca3273f4408a5c3f3047c316b72ea78cSkip Montanaro
1760a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily    def detect_tkinter_explicitly(self):
1761a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # Build _tkinter using explicit locations for Tcl/Tk.
1762a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #
1763a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # This is enabled when both arguments are given to ./configure:
1764a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #
1765a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #     --with-tcltk-includes="-I/path/to/tclincludes \
1766a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #                            -I/path/to/tkincludes"
1767a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #     --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1768a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #                        -L/path/to/tklibs -ltkm.n"
1769a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #
17708d496add74530767cad3aa8b5b371b9a7f0b8498Martin Panter        # These values can also be specified or overridden via make:
1771a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #    make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1772a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        #
1773a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # This can be useful for building and testing tkinter with multiple
1774a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # versions of Tcl/Tk.  Note that a build of Tk depends on a particular
1775a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # build of Tcl so you need to specify both arguments and use care when
1776a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # overriding.
1777a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily
1778a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # The _TCLTK variables are created in the Makefile sharedmods target.
1779a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1780a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        tcltk_libs = os.environ.get('_TCLTK_LIBS')
1781a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        if not (tcltk_includes and tcltk_libs):
1782a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily            # Resume default configuration search.
1783a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily            return 0
1784a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily
1785a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        extra_compile_args = tcltk_includes.split()
1786a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        extra_link_args = tcltk_libs.split()
1787a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1788a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily                        define_macros=[('WITH_APPINIT', 1)],
1789a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily                        extra_compile_args = extra_compile_args,
1790a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily                        extra_link_args = extra_link_args,
1791a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily                        )
1792a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        self.extensions.append(ext)
1793a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        return 1
1794a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily
17950b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen    def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
17960b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # The _tkinter module, using frameworks. Since frameworks are quite
17970b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # different the UNIX search logic is not sharable.
17980b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        from os.path import join, exists
17990b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        framework_dirs = [
18002c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            '/Library/Frameworks',
1801cea1ddb4aa6ccae552ff9838cb07c6802785b8fcRonald Oussoren            '/System/Library/Frameworks/',
18020b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            join(os.getenv('HOME'), '/Library/Frameworks')
18030b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        ]
18040b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
1805593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        sysroot = macosx_sdk_root()
1806593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
18070174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro        # Find the directory that contains the Tcl.framework and Tk.framework
18080b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # bundles.
18090b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # XXX distutils should support -F!
18100b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        for F in framework_dirs:
18112c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            # both Tcl.framework and Tk.framework should be present
1812593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1813593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
18140b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            for fw in 'Tcl', 'Tk':
1815593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                if is_macosx_sdk_path(F):
1816593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    if not exists(join(sysroot, F[1:], fw + '.framework')):
1817593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                        break
1818593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                else:
1819593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                    if not exists(join(F, fw + '.framework')):
1820593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren                        break
18210b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            else:
18220b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                # ok, F is now directory with both frameworks. Continure
18230b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                # building
18240b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                break
18250b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        else:
18260b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            # Tk and Tcl frameworks not found. Normal "unix" tkinter search
18270b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            # will now resume.
18280b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            return 0
18292c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters
18300b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # For 8.4a2, we must add -I options that point inside the Tcl and Tk
18310b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # frameworks. In later release we should hopefully be able to pass
18322c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters        # the -F option to gcc, which specifies a framework lookup path.
18330b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        #
18340b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        include_dirs = [
18352c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            join(F, fw + '.framework', H)
18360b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            for fw in 'Tcl', 'Tk'
18370b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen            for H in 'Headers', 'Versions/Current/PrivateHeaders'
18380b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        ]
18390b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
18402c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters        # For 8.4a2, the X11 headers are not included. Rather than include a
18410b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # complicated search, this is a hard-coded path. It could bail out
18420b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # if X11 libs are not found...
18430b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        include_dirs.append('/usr/X11R6/include')
18440b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
18450b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
18465640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren        # All existing framework builds of Tcl/Tk don't support 64-bit
18475640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren        # architectures.
18485640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren        cflags = sysconfig.get_config_vars('CFLAGS')[0]
18495640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren        archs = re.findall('-arch\s+(\w+)', cflags)
1850593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
1851593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        if is_macosx_sdk_path(F):
1852593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1853593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren        else:
1854593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren            fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1855593e4ca7a5300752c1fe595c22caa859b7fcd5fbRonald Oussoren
185691a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren        detected_archs = []
185791a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren        for ln in fp:
185891a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren            a = ln.split()[-1]
185991a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren            if a in archs:
186091a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren                detected_archs.append(ln.split()[-1])
186191a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren        fp.close()
186291a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren
186391a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren        for a in detected_archs:
186491a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren            frameworks.append('-arch')
186591a11a46c0dfc01702bbd315fbb424aef2ccd45cRonald Oussoren            frameworks.append(a)
18665640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren
18670b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
18680b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        define_macros=[('WITH_APPINIT', 1)],
18690b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        include_dirs = include_dirs,
18700b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        libraries = [],
18715640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                        extra_compile_args = frameworks[2:],
18720b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        extra_link_args = frameworks,
18730b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen                        )
18740b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        self.extensions.append(ext)
18750b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        return 1
18760b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
1877fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling    def detect_tkinter(self, inc_dirs, lib_dirs):
187800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # The _tkinter module.
18795b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
1880a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # Check whether --with-tcltk-includes and --with-tcltk-libs were
1881a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # configured or passed into the make target.  If so, use these values
1882a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # to build tkinter and bypass the searches for Tcl and TK in standard
1883a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        # locations.
1884a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily        if self.detect_tkinter_explicitly():
1885a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily            return
1886a2a9f571a5bd14f7879e5c78c1778fa85bd08e58Ned Deily
18870b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # Rather than complicate the code below, detecting and building
18880b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # AquaTk is a separate method. Only one Tkinter will be built on
18890b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen        # Darwin - either AquaTk, if it is found, or X11 based Tk.
1890d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if (host_platform == 'darwin' and
18910174dddc65af50900324afca3c5d2400858b75f0Skip Montanaro            self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
18922c60f7a13697bbc19c4d5ef0b052c34cf1848244Tim Peters            return
18930b06be7b0be87bd78707a939cb9964f634f392d4Jack Jansen
1894fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Assume we haven't found any of the libraries or include files
18953db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        # The versions with dots are used on Unix, and the versions without
18963db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        # dots on Windows, for detection by cygwin.
1897fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        tcllib = tklib = tcl_includes = tk_includes = None
1898fb118351a117fe171a6562a113ae0c75806ced82Guilherme Polo        for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1899fb118351a117fe171a6562a113ae0c75806ced82Guilherme Polo                        '8.2', '82', '8.1', '81', '8.0', '80']:
190035a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            tklib = self.compiler.find_library_file(lib_dirs,
1901e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                        'tk' + version)
190235a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            tcllib = self.compiler.find_library_file(lib_dirs,
1903e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                         'tcl' + version)
19045b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson            if tklib and tcllib:
190500e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                # Exit the loop when we've found the Tcl/Tk libraries
190600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling                break
1907fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1908ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        # Now check for the header files
1909fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        if tklib and tcllib:
19103c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            # Check for the include files on Debian and {Free,Open}BSD, where
1911fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            # they're put in /usr/include/{tcl,tk}X.Y
19123c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            dotversion = version
1913d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if '.' not in dotversion and "bsd" in host_platform.lower():
19143c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
19153c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                # but the include subdirs are named like .../include/tcl8.3.
19163c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                dotversion = dotversion[:-1] + '.' + dotversion[-1]
19173c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tcl_include_sub = []
19183c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tk_include_sub = []
19193c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            for dir in inc_dirs:
19203c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
19213c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling                tk_include_sub += [dir + os.sep + "tk" + dotversion]
19223c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tk_include_sub += tcl_include_sub
19233c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
19243c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
1925fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1926e86a59af886d6c0f58f53e42878a25e48627fed1Martin v. Löwis        if (tcllib is None or tklib is None or
1927fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            tcl_includes is None or tk_includes is None):
19283c0aa7e7a2e5bee936d281af3bd9f99b6096325cAndrew M. Kuchling            self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
1929fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            return
1930ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1931fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # OK... everything seems to be present for Tcl/Tk.
1932fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1933fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1934fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        for dir in tcl_includes + tk_includes:
1935fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            if dir not in include_dirs:
1936fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                include_dirs.append(dir)
1937ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1938fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Check for various platform-specific directories
1939d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'sunos5':
1940fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/openwin/include')
1941fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/openwin/lib')
1942fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        elif os.path.exists('/usr/X11R6/include'):
1943fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/X11R6/include')
1944fba73698240660d9154b6917b87dd333d6fb8284Martin v. Löwis            added_lib_dirs.append('/usr/X11R6/lib64')
1945fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/X11R6/lib')
1946fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        elif os.path.exists('/usr/X11R5/include'):
1947fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/X11R5/include')
1948fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/X11R5/lib')
1949fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        else:
1950ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh            # Assume default location for X11
1951fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            include_dirs.append('/usr/X11/include')
1952fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            added_lib_dirs.append('/usr/X11/lib')
1953fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
19549181c94e05250b8f69615a96634d55afe532e406Jason Tishler        # If Cygwin, then verify that X is installed before proceeding
1955d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'cygwin':
19569181c94e05250b8f69615a96634d55afe532e406Jason Tishler            x11_inc = find_file('X11/Xlib.h', [], include_dirs)
19579181c94e05250b8f69615a96634d55afe532e406Jason Tishler            if x11_inc is None:
19589181c94e05250b8f69615a96634d55afe532e406Jason Tishler                return
19599181c94e05250b8f69615a96634d55afe532e406Jason Tishler
1960fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Check for BLT extension
196135a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1962e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                               'BLT8.0'):
1963fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            defs.append( ('WITH_BLT', 1) )
1964fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            libs.append('BLT8.0')
196535a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1966e670e5ad5b7ef6b464fb264b688d96b9b9f71b53Tarek Ziadé                                                'BLT'):
1967427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis            defs.append( ('WITH_BLT', 1) )
1968427a290c9afca605ab8ed799f0072d890318b837Martin v. Löwis            libs.append('BLT')
1969fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1970fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # Add the Tcl/Tk libraries
1971cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler        libs.append('tk'+ version)
1972cccac1a163915d7a4e757a1a4e62b21c91b5c475Jason Tishler        libs.append('tcl'+ version)
1973ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1974d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform in ['aix3', 'aix4']:
1975fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling            libs.append('ld')
1976fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
19773db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis        # Finally, link with the X11 libraries (not appropriate on cygwin)
1978d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform != "cygwin":
19793db5b8cc76d055c6576aaff51722fc4d64d64388Martin v. Löwis            libs.append('X11')
1980fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling
1981fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1982fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        define_macros=[('WITH_APPINIT', 1)] + defs,
1983fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        include_dirs = include_dirs,
1984fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        libraries = libs,
1985fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        library_dirs = added_lib_dirs,
1986fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling                        )
1987fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        self.extensions.append(ext)
1988ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
1989fbe73769a45aac293d8abb66ac4cd7a22f40fff8Andrew M. Kuchling        # XXX handle these, but how to detect?
199000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # *** Uncomment and edit for PIL (TkImaging) extension only:
1991ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        #       -DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \
199200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # *** Uncomment and edit for TOGL extension only:
1993ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        #       -DWITH_TOGL togl.c \
199400e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        # *** Uncomment these for TOGL extension only:
1995ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh        #       -lGL -lGLU -lXext -lXmu \
199600e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling
19978bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller    def configure_ctypes_darwin(self, ext):
19988bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        # Darwin (OS X) uses preconfigured files, in
19998bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        # the Modules/_ctypes/libffi_osx directory.
2000c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer        srcdir = sysconfig.get_config_var('srcdir')
20018bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
20028bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                                                  '_ctypes', 'libffi_osx'))
20038bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        sources = [os.path.join(ffi_srcdir, p)
20048bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                   for p in ['ffi.c',
20055640ce2f1edc0148ee14fd3daeb7ac700700bb71Ronald Oussoren                             'x86/darwin64.S',
20068bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'x86/x86-darwin.S',
20078bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'x86/x86-ffi_darwin.c',
20088bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'x86/x86-ffi64.c',
20098bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'powerpc/ppc-darwin.S',
20108bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'powerpc/ppc-darwin_closure.S',
20118bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'powerpc/ppc-ffi_darwin.c',
20128bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             'powerpc/ppc64-darwin_closure.S',
20138bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                             ]]
20148bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller
20158bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        # Add .S (preprocessed assembly) to C compiler source extensions.
201635a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé        self.compiler.src_extensions.append('.S')
20178bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller
20188bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        include_dirs = [os.path.join(ffi_srcdir, 'include'),
20198bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                        os.path.join(ffi_srcdir, 'powerpc')]
20208bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        ext.include_dirs.extend(include_dirs)
20218bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        ext.sources.extend(sources)
20228bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller        return True
20238bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller
2024eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller    def configure_ctypes(self, ext):
20259176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if not self.use_system_libffi:
2026d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org            if host_platform == 'darwin':
20278bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller                return self.configure_ctypes_darwin(ext)
20288bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller
2029c59c5f3983d79837bea77bf5ba3ae8112ac0cc2aNeil Schemenauer            srcdir = sysconfig.get_config_var('srcdir')
20309176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_builddir = os.path.join(self.build_temp, 'libffi')
20319176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
20329176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                                         '_ctypes', 'libffi'))
20339176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
20349176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20355e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller            from distutils.dep_util import newer_group
20365e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller
20375e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller            config_sources = [os.path.join(ffi_srcdir, fname)
2038f1a4aa340ea3794a6cc2d54fb6647b4d7b61f275Martin v. Löwis                              for fname in os.listdir(ffi_srcdir)
2039f1a4aa340ea3794a6cc2d54fb6647b4d7b61f275Martin v. Löwis                              if os.path.isfile(os.path.join(ffi_srcdir, fname))]
20405e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller            if self.force or newer_group(config_sources,
20415e218b44549153816f2dd842d532b2ea5aa476e8Thomas Heller                                         ffi_configfile):
20429176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                from distutils.dir_util import mkpath
20439176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                mkpath(ffi_builddir)
2044d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
2045d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org                               if (('--host=' in arg) or ('--build=' in arg))]
20466fd3248855f8a4c8edee2fe005a80c4e5c87e7f1Christian Heimes                if not self.verbose:
20476fd3248855f8a4c8edee2fe005a80c4e5c87e7f1Christian Heimes                    config_args.append("-q")
20489176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20499176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                # Pass empty CFLAGS because we'll just append the resulting
20509176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                # CFLAGS to Python's; -g or -O2 is to be avoided.
20519176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
20529176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                      % (ffi_builddir, ffi_srcdir, " ".join(config_args))
20539176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20549176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                res = os.system(cmd)
20559176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                if res or not os.path.exists(ffi_configfile):
20569176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    print "Failed to configure _ctypes module"
20579176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    return False
20589176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20599176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            fficonfig = {}
20601379b8404a8013932299f02d0a2e081200386a49Antoine Pitrou            with open(ffi_configfile) as f:
20611379b8404a8013932299f02d0a2e081200386a49Antoine Pitrou                exec f in fficonfig
20629176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20639176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            # Add .S (preprocessed assembly) to C compiler source extensions.
206435a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé            self.compiler.src_extensions.append('.S')
20659176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20669176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            include_dirs = [os.path.join(ffi_builddir, 'include'),
20678c510e704e3823df66c2c3ad85912c9a9dda7f14Antoine Pitrou                            ffi_builddir,
20688c510e704e3823df66c2c3ad85912c9a9dda7f14Antoine Pitrou                            os.path.join(ffi_srcdir, 'src')]
20699176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            extra_compile_args = fficonfig['ffi_cflags'].split()
20709176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
20718c510e704e3823df66c2c3ad85912c9a9dda7f14Antoine Pitrou            ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
20728c510e704e3823df66c2c3ad85912c9a9dda7f14Antoine Pitrou                               fficonfig['ffi_sources'])
20739176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.include_dirs.extend(include_dirs)
20749176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.extra_compile_args.extend(extra_compile_args)
2075795246cf9937f088f8d98253f38da4a093c08300Thomas Heller        return True
2076eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller
20779176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis    def detect_ctypes(self, inc_dirs, lib_dirs):
20789176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        self.use_system_libffi = False
2079eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller        include_dirs = []
2080eba43c157b1ed57bf95144f704d56c3296a6f637Thomas Heller        extra_compile_args = []
20811798489547a259876c495280dcd5d649269967f3Thomas Heller        extra_link_args = []
2082cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        sources = ['_ctypes/_ctypes.c',
2083cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/callbacks.c',
2084cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/callproc.c',
2085cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                   '_ctypes/stgdict.c',
2086001d3a1d8ac9b5a057a585950182880f5733c608Thomas Heller                   '_ctypes/cfield.c']
2087cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        depends = ['_ctypes/ctypes.h']
2088cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
2089d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
209030a171fcb6ae70a98a6366c401e494ecc44ee2d8Ronald Oussoren            sources.append('_ctypes/malloc_closure.c')
2091cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller            sources.append('_ctypes/darwin/dlfcn_simple.c')
20928bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller            extra_compile_args.append('-DMACOSX')
2093cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller            include_dirs.append('_ctypes/darwin')
2094cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller# XXX Is this still needed?
2095cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller##            extra_link_args.extend(['-read_only_relocs', 'warning'])
2096cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
2097d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform == 'sunos5':
209873f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # XXX This shouldn't be necessary; it appears that some
209973f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # of the assembler code is non-PIC (i.e. it has relocations
210073f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # when it shouldn't. The proper fix would be to rewrite
210173f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # the assembler code to be PIC.
210273f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # This only works with GCC; the Sun compiler likely refuses
210373f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # this option. If you want to compile ctypes with the Sun
210473f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # compiler, please research a proper solution, instead of
210573f12a33f7fffb820cb90487ba962598c0f0d275Martin v. Löwis            # finding some -z option for the Sun compiler.
21061798489547a259876c495280dcd5d649269967f3Thomas Heller            extra_link_args.append('-mimpure-text')
21071798489547a259876c495280dcd5d649269967f3Thomas Heller
2108d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        elif host_platform.startswith('hp-ux'):
210903b75ddf7c63bb7b7bc1b424661c94076b57be9eThomas Heller            extra_link_args.append('-fPIC')
211003b75ddf7c63bb7b7bc1b424661c94076b57be9eThomas Heller
2111cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        ext = Extension('_ctypes',
2112cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        include_dirs=include_dirs,
2113cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        extra_compile_args=extra_compile_args,
21141798489547a259876c495280dcd5d649269967f3Thomas Heller                        extra_link_args=extra_link_args,
21159176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                        libraries=[],
2116cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        sources=sources,
2117cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                        depends=depends)
2118cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        ext_test = Extension('_ctypes_test',
2119cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller                             sources=['_ctypes/_ctypes_test.c'])
2120cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller        self.extensions.extend([ext, ext_test])
2121cf567c1b9c347e5a5e5833fecb7d10ecc675a83bThomas Heller
21229176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
21239176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            return
21249176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
2125d65e2bab3b438f883ef28245f51795b14a4c498fdoko@python.org        if host_platform == 'darwin':
21268bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller            # OS X 10.5 comes with libffi.dylib; the include files are
21278bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller            # in /usr/include/ffi
21288bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller            inc_dirs.append('/usr/include/ffi')
21298bdf81d2df388ce06088193f95c992a7ee1eb553Thomas Heller
21301c335e63c9e7ca8d6d5ea72fe5ce44cbb0fb5c51Benjamin Peterson        ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
2131ca6d9e9225ecc53fc62eff2c3058a2eb1dbfa4e8Matthias Klose        if not ffi_inc or ffi_inc[0] == '':
21321c335e63c9e7ca8d6d5ea72fe5ce44cbb0fb5c51Benjamin Peterson            ffi_inc = find_file('ffi.h', [], inc_dirs)
21339176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if ffi_inc is not None:
21349176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ffi_h = ffi_inc[0] + '/ffi.h'
213537471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes            with open(ffi_h) as f:
213637471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                for line in f:
213737471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                    line = line.strip()
213837471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                    if line.startswith(('#define LIBFFI_H',
213937471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                                        '#define ffi_wrapper_h')):
214037471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                        break
214137471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                else:
21429176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    ffi_inc = None
214337471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                    print('Header file {} does not define LIBFFI_H or '
214437471dc6f9911b0f36aafdf4c130ce608e0443d1Christian Heimes                          'ffi_wrapper_h'.format(ffi_h))
21459176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        ffi_lib = None
21469176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if ffi_inc is not None:
21479176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
214835a3f57937a701a3b0227b71f3d7dcb7a9bfa1a2Tarek Ziadé                if (self.compiler.find_library_file(lib_dirs, lib_name)):
21499176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    ffi_lib = lib_name
21509176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis                    break
21519176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
21529176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis        if ffi_inc and ffi_lib:
21539176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.include_dirs.extend(ffi_inc)
21549176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            ext.libraries.append(ffi_lib)
21559176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis            self.use_system_libffi = True
21569176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
21579176fc1466c8a896ab57b054bd426e63770e2cfaMartin v. Löwis
2158f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchlingclass PyBuildInstall(install):
2159f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    # Suppress the warning about installation into the lib_dynload
2160f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    # directory, which is not in sys.path when running Python during
2161f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    # installation:
2162f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling    def initialize_options (self):
2163f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling        install.initialize_options(self)
2164f52d27e52d289b99837b4555fb3f757f2c89f4adAndrew M. Kuchling        self.warn_dir=0
21655b10910d7a1f9543568aba732af3881c85e9289dMichael W. Hudson
2166529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudsonclass PyBuildInstallLib(install_lib):
2167529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # Do exactly what install_lib does but make sure correct access modes get
2168529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # set on installed directories and files. All installed files with get
2169529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # mode 644 unless they are a shared library in which case they will get
2170529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    # mode 755. All installed directories will get mode 755.
2171529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2172529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    so_ext = sysconfig.get_config_var("SO")
2173529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2174529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def install(self):
2175529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        outfiles = install_lib.install(self)
2176529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        self.set_file_modes(outfiles, 0644, 0755)
2177529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        self.set_dir_modes(self.install_dir, 0755)
2178529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        return outfiles
2179529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2180529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def set_file_modes(self, files, defaultMode, sharedLibMode):
2181529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not self.is_chmod_supported(): return
2182529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not files: return
2183529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2184529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        for filename in files:
2185529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            if os.path.islink(filename): continue
2186529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            mode = defaultMode
2187529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            if filename.endswith(self.so_ext): mode = sharedLibMode
2188529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            log.info("changing mode of %s to %o", filename, mode)
2189529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson            if not self.dry_run: os.chmod(filename, mode)
2190529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2191529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def set_dir_modes(self, dirname, mode):
2192529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not self.is_chmod_supported(): return
2193529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2194529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2195529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def set_dir_modes_visitor(self, mode, dirname, names):
2196529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if os.path.islink(dirname): return
2197529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        log.info("changing mode of %s to %o", dirname, mode)
2198529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        if not self.dry_run: os.chmod(dirname, mode)
2199529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
2200529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson    def is_chmod_supported(self):
2201529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson        return hasattr(os, 'chmod')
2202529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson
220314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumSUMMARY = """
220414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumPython is an interpreted, interactive, object-oriented programming
220514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlanguage. It is often compared to Tcl, Perl, Scheme or Java.
220614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
220714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumPython combines remarkable power with very clear syntax. It has
220814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossummodules, classes, exceptions, very high level dynamic data types, and
220914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumdynamic typing. There are interfaces to many system calls and
221014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlibraries, as well as to various windowing systems (X11, Motif, Tk,
221114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumMac, MFC). New built-in modules are easily written in C or C++. Python
221214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumis also usable as an extension language for applications that need a
221314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumprogrammable interface.
221414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
221514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumThe Python implementation is portable: it runs on many brands of UNIX,
221614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumon Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
221714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumlisted here, it may still be supported, if there's a C compiler for
221814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumit. Ask around on comp.lang.python -- or just try compiling Python
221914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossumyourself.
222014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum"""
222114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
222214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumCLASSIFIERS = """
222314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumDevelopment Status :: 6 - Mature
222414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumLicense :: OSI Approved :: Python Software Foundation License
222514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumNatural Language :: English
222614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumProgramming Language :: C
222714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumProgramming Language :: Python
222814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van RossumTopic :: Software Development
222914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum"""
223014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
223100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingdef main():
223262686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling    # turn off warnings when deprecated modules are imported
223362686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling    import warnings
223462686696123eb82df5f688b9a3906b9b648ce220Andrew M. Kuchling    warnings.filterwarnings("ignore",category=DeprecationWarning)
223514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum    setup(# PyPI Metadata (PEP 301)
223614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          name = "Python",
223714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          version = sys.version.split()[0],
223814ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          url = "http://www.python.org/%s" % sys.version[:3],
223914ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          maintainer = "Guido van Rossum and the Python community",
224014ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          maintainer_email = "python-dev@python.org",
224114ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          description = "A high-level object-oriented programming language",
224214ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          long_description = SUMMARY.strip(),
224314ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          license = "PSF license",
224414ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          classifiers = filter(None, CLASSIFIERS.split("\n")),
224514ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          platforms = ["Many"],
224614ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum
224714ee89c785fe61c9397dfdd457994a2ba601a00bGuido van Rossum          # Build info
2248529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson          cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2249529a505da4c2ffc79b598935a241a9ffe17563e5Michael W. Hudson                      'install_lib':PyBuildInstallLib},
225000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling          # The struct module is defined here, because build_ext won't be
225100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling          # called unless there's at least one extension module defined.
22527ccc95a315315568dd0660b5fb915f9e2e38f9daBob Ippolito          ext_modules=[Extension('_struct', ['_struct.c'])],
2253aece4270b1de4777eef3f2aadd7aaf3ac9b69ceeAndrew M. Kuchling
2254aece4270b1de4777eef3f2aadd7aaf3ac9b69ceeAndrew M. Kuchling          # Scripts to install
2255852f79993f8d04f00f54a94e7275550a72454f5fSkip Montanaro          scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
2256cdbc977c0344cfe2294e8be69cd1acd77b3b79adMartin v. Löwis                     'Tools/scripts/2to3',
2257852f79993f8d04f00f54a94e7275550a72454f5fSkip Montanaro                     'Lib/smtpd.py']
225800e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling        )
2259ade711a5c347fdb483c7d91027499a3a7b9acd05Fredrik Lundh
226000e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling# --install-platlib
226100e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchlingif __name__ == '__main__':
226200e0f21be8517acde581ef7b93982e852c62ea70Andrew M. Kuchling    main()
2263