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