Attachment 'setup.py'

Download

   1 # Autodetecting setup.py script for building the Python extensions
   2 #
   3 
   4 __version__ = "$Revision: 53777 $"
   5 
   6 import sys, os, imp, re, optparse
   7 
   8 from distutils import log
   9 from distutils import sysconfig
  10 from distutils import text_file
  11 from distutils.errors import *
  12 from distutils.core import Extension, setup
  13 from distutils.command.build_ext import build_ext
  14 from distutils.command.install import install
  15 from distutils.command.install_lib import install_lib
  16 
  17 # This global variable is used to hold the list of modules to be disabled.
  18 disabled_module_list = []
  19 
  20 def add_dir_to_list(dirlist, dir):
  21     """Add the directory 'dir' to the list 'dirlist' (at the front) if
  22     1) 'dir' is not already in 'dirlist'
  23     2) 'dir' actually exists, and is a directory."""
  24     if dir is not None and os.path.isdir(dir) and dir not in dirlist:
  25         dirlist.insert(0, dir)
  26 
  27 def find_file(filename, std_dirs, paths):
  28     """Searches for the directory where a given file is located,
  29     and returns a possibly-empty list of additional directories, or None
  30     if the file couldn't be found at all.
  31 
  32     'filename' is the name of a file, such as readline.h or libcrypto.a.
  33     'std_dirs' is the list of standard system directories; if the
  34         file is found in one of them, no additional directives are needed.
  35     'paths' is a list of additional locations to check; if the file is
  36         found in one of them, the resulting list will contain the directory.
  37     """
  38 
  39     # Check the standard locations
  40     for dir in std_dirs:
  41         f = os.path.join(dir, filename)
  42         if os.path.exists(f): return []
  43 
  44     # Check the additional directories
  45     for dir in paths:
  46         f = os.path.join(dir, filename)
  47         if os.path.exists(f):
  48             return [dir]
  49 
  50     # Not found anywhere
  51     return None
  52 
  53 def find_library_file(compiler, libname, std_dirs, paths):
  54     result = compiler.find_library_file(std_dirs + paths, libname)
  55     if result is None:
  56         return None
  57 
  58     # Check whether the found file is in one of the standard directories
  59     dirname = os.path.dirname(result)
  60     for p in std_dirs:
  61         # Ensure path doesn't end with path separator
  62         p = p.rstrip(os.sep)
  63         if p == dirname:
  64             return [ ]
  65 
  66     # Otherwise, it must have been in one of the additional directories,
  67     # so we have to figure out which one.
  68     for p in paths:
  69         # Ensure path doesn't end with path separator
  70         p = p.rstrip(os.sep)
  71         if p == dirname:
  72             return [p]
  73     else:
  74         assert False, "Internal error: Path not found in std_dirs or paths"
  75 
  76 def module_enabled(extlist, modname):
  77     """Returns whether the module 'modname' is present in the list
  78     of extensions 'extlist'."""
  79     extlist = [ext for ext in extlist if ext.name == modname]
  80     return len(extlist)
  81 
  82 def find_module_file(module, dirlist):
  83     """Find a module in a set of possible folders. If it is not found
  84     return the unadorned filename"""
  85     list = find_file(module, [], dirlist)
  86     if not list:
  87         return module
  88     if len(list) > 1:
  89         log.info("WARNING: multiple copies of %s found"%module)
  90     return os.path.join(list[0], module)
  91 
  92 class PyBuildExt(build_ext):
  93 
  94     def build_extensions(self):
  95 
  96         # Detect which modules should be compiled
  97         self.detect_modules()
  98 
  99         # Remove modules that are present on the disabled list
 100         self.extensions = [ext for ext in self.extensions
 101                            if ext.name not in disabled_module_list]
 102 
 103         # Fix up the autodetected modules, prefixing all the source files
 104         # with Modules/ and adding Python's include directory to the path.
 105         (srcdir,) = sysconfig.get_config_vars('srcdir')
 106         if not srcdir:
 107             # Maybe running on Windows but not using CYGWIN?
 108             raise ValueError("No source directory; cannot proceed.")
 109 
 110         # Figure out the location of the source code for extension modules
 111         moddir = os.path.join(os.getcwd(), srcdir, 'Modules')
 112         moddir = os.path.normpath(moddir)
 113         srcdir, tail = os.path.split(moddir)
 114         srcdir = os.path.normpath(srcdir)
 115         moddir = os.path.normpath(moddir)
 116 
 117         moddirlist = [moddir]
 118         incdirlist = ['./Include']
 119 
 120         # Platform-dependent module source and include directories
 121         platform = self.get_platform()
 122         if platform in ('darwin', 'mac') and ("--disable-toolbox-glue" not in
 123             sysconfig.get_config_var("CONFIG_ARGS")):
 124             # Mac OS X also includes some mac-specific modules
 125             macmoddir = os.path.join(os.getcwd(), srcdir, 'Mac/Modules')
 126             moddirlist.append(macmoddir)
 127             incdirlist.append('./Mac/Include')
 128 
 129         alldirlist = moddirlist + incdirlist
 130 
 131         # Fix up the paths for scripts, too
 132         self.distribution.scripts = [os.path.join(srcdir, filename)
 133                                      for filename in self.distribution.scripts]
 134 
 135         for ext in self.extensions[:]:
 136             ext.sources = [ find_module_file(filename, moddirlist)
 137                             for filename in ext.sources ]
 138             if ext.depends is not None:
 139                 ext.depends = [find_module_file(filename, alldirlist)
 140                                for filename in ext.depends]
 141             ext.include_dirs.append( '.' ) # to get config.h
 142             for incdir in incdirlist:
 143                 ext.include_dirs.append( os.path.join(srcdir, incdir) )
 144 
 145             # If a module has already been built statically,
 146             # don't build it here
 147             if ext.name in sys.builtin_module_names:
 148                 self.extensions.remove(ext)
 149 
 150         if platform != 'mac':
 151             # Parse Modules/Setup and Modules/Setup.local to figure out which
 152             # modules are turned on in the file.
 153             remove_modules = []
 154             for filename in ('Modules/Setup', 'Modules/Setup.local'):
 155                 input = text_file.TextFile(filename, join_lines=1)
 156                 while 1:
 157                     line = input.readline()
 158                     if not line: break
 159                     line = line.split()
 160                     remove_modules.append(line[0])
 161                 input.close()
 162 
 163             for ext in self.extensions[:]:
 164                 if ext.name in remove_modules:
 165                     self.extensions.remove(ext)
 166 
 167         # When you run "make CC=altcc" or something similar, you really want
 168         # those environment variables passed into the setup.py phase.  Here's
 169         # a small set of useful ones.
 170         compiler = os.environ.get('CC')
 171         args = {}
 172         # unfortunately, distutils doesn't let us provide separate C and C++
 173         # compilers
 174         if compiler is not None:
 175             (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
 176             args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
 177         self.compiler.set_executables(**args)
 178 
 179         build_ext.build_extensions(self)
 180 
 181     def build_extension(self, ext):
 182 
 183         if ext.name == '_ctypes':
 184             assert False
 185             if not self.configure_ctypes(ext):
 186                 return
 187 
 188         try:
 189             build_ext.build_extension(self, ext)
 190             return
 191         except (CCompilerError, DistutilsError), why:
 192             self.announce('WARNING: building of extension "%s" failed: %s' %
 193                           (ext.name, sys.exc_info()[1]))
 194             return
 195         # Workaround for Mac OS X: The Carbon-based modules cannot be
 196         # reliably imported into a command-line Python
 197         if 'Carbon' in ext.extra_link_args:
 198             self.announce(
 199                 'WARNING: skipping import check for Carbon-based "%s"' %
 200                 ext.name)
 201             return
 202         # Workaround for Cygwin: Cygwin currently has fork issues when many
 203         # modules have been imported
 204         if self.get_platform() == 'cygwin':
 205             self.announce('WARNING: skipping import check for Cygwin-based "%s"'
 206                 % ext.name)
 207             return
 208         ext_filename = os.path.join(
 209             self.build_lib,
 210             self.get_ext_filename(self.get_ext_fullname(ext.name)))
 211         try:
 212             imp.load_dynamic(ext.name, ext_filename)
 213         except ImportError, why:
 214             self.announce('*** WARNING: renaming "%s" since importing it'
 215                           ' failed: %s' % (ext.name, why), level=3)
 216             assert not self.inplace
 217             basename, tail = os.path.splitext(ext_filename)
 218             newname = basename + "_failed" + tail
 219             if os.path.exists(newname):
 220                 os.remove(newname)
 221             os.rename(ext_filename, newname)
 222 
 223             # XXX -- This relies on a Vile HACK in
 224             # distutils.command.build_ext.build_extension().  The
 225             # _built_objects attribute is stored there strictly for
 226             # use here.
 227             # If there is a failure, _built_objects may not be there,
 228             # so catch the AttributeError and move on.
 229             try:
 230                 for filename in self._built_objects:
 231                     os.remove(filename)
 232             except AttributeError:
 233                 self.announce('unable to remove files (ignored)')
 234         except:
 235             exc_type, why, tb = sys.exc_info()
 236             self.announce('*** WARNING: importing extension "%s" '
 237                           'failed with %s: %s' % (ext.name, exc_type, why),
 238                           level=3)
 239 
 240     def get_platform(self):
 241         # Get value of sys.platform
 242         for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
 243             if sys.platform.startswith(platform):
 244                 return platform
 245         return sys.platform
 246 
 247     def detect_modules(self):
 248         # Ensure that /usr/local is always used
 249         #add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
 250         #add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
 251 
 252         # Add paths specified in the environment variables LDFLAGS and
 253         # CPPFLAGS for header and library files.
 254         # We must get the values from the Makefile and not the environment
 255         # directly since an inconsistently reproducible issue comes up where
 256         # the environment variable is not set even though the value were passed
 257         # into configure and stored in the Makefile (issue found on OS X 10.3).
 258         for env_var, arg_name, dir_list in (
 259                 ('LDFLAGS', '-L', self.compiler.library_dirs),
 260                 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
 261             env_val = sysconfig.get_config_var(env_var)
 262             if env_val:
 263                 # To prevent optparse from raising an exception about any
 264                 # options in env_val that is doesn't know about we strip out
 265                 # all double dashes and any dashes followed by a character
 266                 # that is not for the option we are dealing with.
 267                 #
 268                 # Please note that order of the regex is important!  We must
 269                 # strip out double-dashes first so that we don't end up with
 270                 # substituting "--Long" to "-Long" and thus lead to "ong" being
 271                 # used for a library directory.
 272                 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1], '', env_val)
 273                 parser = optparse.OptionParser()
 274                 # Make sure that allowing args interspersed with options is
 275                 # allowed
 276                 parser.allow_interspersed_args = True
 277                 parser.error = lambda msg: None
 278                 parser.add_option(arg_name, dest="dirs", action="append")
 279                 options = parser.parse_args(env_val.split())[0]
 280                 if options.dirs:
 281                     for directory in options.dirs:
 282                         add_dir_to_list(dir_list, directory)
 283 
 284         if os.path.normpath(sys.prefix) != '/usr':
 285             add_dir_to_list(self.compiler.library_dirs,
 286                             sysconfig.get_config_var("LIBDIR"))
 287             add_dir_to_list(self.compiler.include_dirs,
 288                             sysconfig.get_config_var("INCLUDEDIR"))
 289 
 290         try:
 291             have_unicode = unicode
 292         except NameError:
 293             have_unicode = 0
 294 
 295         # lib_dirs and inc_dirs are used to search for files;
 296         # if a file is found in one of those directories, it can
 297         # be assumed that no additional -I,-L directives are needed.
 298         lib_dirs = self.compiler.library_dirs
 299         #lib_dirs = self.compiler.library_dirs + [
 300         #    '/lib64', '/usr/lib64',
 301         #    '/lib', '/usr/lib',
 302         #    ]
 303 
 304         #inc_dirs = self.compiler.include_dirs + ['/usr/include']
 305         inc_dirs = self.compiler.include_dirs
 306         exts = []
 307 
 308         config_h = sysconfig.get_config_h_filename()
 309         config_h_vars = sysconfig.parse_config_h(open(config_h))
 310 
 311         platform = self.get_platform()
 312         (srcdir,) = sysconfig.get_config_vars('srcdir')
 313 
 314         # Check for AtheOS which has libraries in non-standard locations
 315         if platform == 'atheos':
 316             lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
 317             lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
 318             inc_dirs += ['/system/include', '/atheos/autolnk/include']
 319             inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
 320 
 321         # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
 322         if platform in ['osf1', 'unixware7', 'openunix8']:
 323             lib_dirs += ['/usr/ccs/lib']
 324 
 325         if platform == 'darwin':
 326             # This should work on any unixy platform ;-)
 327             # If the user has bothered specifying additional -I and -L flags
 328             # in OPT and LDFLAGS we might as well use them here.
 329             #   NOTE: using shlex.split would technically be more correct, but
 330             # also gives a bootstrap problem. Let's hope nobody uses directories
 331             # with whitespace in the name to store libraries.
 332             cflags, ldflags = sysconfig.get_config_vars(
 333                     'CFLAGS', 'LDFLAGS')
 334             for item in cflags.split():
 335                 if item.startswith('-I'):
 336                     inc_dirs.append(item[2:])
 337 
 338             for item in ldflags.split():
 339                 if item.startswith('-L'):
 340                     lib_dirs.append(item[2:])
 341 
 342         # Check for MacOS X, which doesn't need libm.a at all
 343         math_libs = ['m']
 344         if platform in ['darwin', 'beos', 'mac']:
 345             math_libs = []
 346 
 347         # XXX Omitted modules: gl, pure, dl, SGI-specific modules
 348 
 349         #
 350         # The following modules are all pretty straightforward, and compile
 351         # on pretty much any POSIXish platform.
 352         #
 353 
 354         # Some modules that are normally always on:
 355         exts.append( Extension('_weakref', ['_weakref.c']) )
 356 
 357         # array objects
 358         exts.append( Extension('array', ['arraymodule.c']) )
 359         # complex math library functions
 360         #exts.append( Extension('cmath', ['cmathmodule.c'],
 361         #                       libraries=math_libs) )
 362 
 363         # math library functions, e.g. sin()
 364         exts.append( Extension('math',  ['mathmodule.c'],
 365                                libraries=math_libs) )
 366         # fast string operations implemented in C
 367         exts.append( Extension('strop', ['stropmodule.c']) )
 368         # time operations and variables
 369         exts.append( Extension('time', ['timemodule.c'],
 370                                libraries=math_libs) )
 371         exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
 372                                libraries=math_libs) )
 373         # random number generator implemented in C
 374         exts.append( Extension("_random", ["_randommodule.c"]) )
 375         # fast iterator tools implemented in C
 376         exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
 377         # high-performance collections
 378         exts.append( Extension("collections", ["collectionsmodule.c"]) )
 379         # bisect
 380         exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
 381         # heapq
 382         exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
 383         # operator.add() and similar goodies
 384         exts.append( Extension('operator', ['operator.c']) )
 385         # _functools
 386         exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
 387         # Python C API test module
 388         #exts.append( Extension('_testcapi', ['_testcapimodule.c']) )
 389         # profilers (_lsprof is for cProfile.py)
 390         exts.append( Extension('_hotshot', ['_hotshot.c']) )
 391         exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
 392         # static Unicode character database
 393         if have_unicode:
 394             exts.append( Extension('unicodedata', ['unicodedata.c']) )
 395         # access to ISO C locale support
 396         data = open('pyconfig.h').read()
 397         m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
 398         if m is not None:
 399             locale_libs = ['intl']
 400         else:
 401             locale_libs = []
 402         if platform == 'darwin':
 403             locale_extra_link_args = ['-framework', 'CoreFoundation']
 404         else:
 405             locale_extra_link_args = []
 406 
 407 
 408         exts.append( Extension('_locale', ['_localemodule.c'],
 409                                libraries=locale_libs,
 410                                extra_link_args=locale_extra_link_args) )
 411 
 412         # Modules with some UNIX dependencies -- on by default:
 413         # (If you have a really backward UNIX, select and socket may not be
 414         # supported...)
 415 
 416         # fcntl(2) and ioctl(2)
 417         exts.append( Extension('fcntl', ['fcntlmodule.c']) )
 418         #if platform not in ['mac']:
 419         #    # pwd(3)
 420         #    exts.append( Extension('pwd', ['pwdmodule.c']) )
 421         #    # grp(3)
 422         #    exts.append( Extension('grp', ['grpmodule.c']) )
 423         #    # spwd, shadow passwords
 424         #    if (config_h_vars.get('HAVE_GETSPNAM', False) or
 425         #            config_h_vars.get('HAVE_GETSPENT', False)):
 426         #        exts.append( Extension('spwd', ['spwdmodule.c']) )
 427         # select(2); not on ancient System V
 428         exts.append( Extension('select', ['selectmodule.c']) )
 429 
 430         # Helper module for various ascii-encoders
 431         exts.append( Extension('binascii', ['binascii.c']) )
 432 
 433         # Fred Drake's interface to the Python parser
 434         exts.append( Extension('parser', ['parsermodule.c']) )
 435 
 436         # cStringIO and cPickle
 437         exts.append( Extension('cStringIO', ['cStringIO.c']) )
 438         exts.append( Extension('cPickle', ['cPickle.c']) )
 439 
 440         # Memory-mapped files (also works on Win32).
 441         #if platform not in ['atheos', 'mac']:
 442         #    exts.append( Extension('mmap', ['mmapmodule.c']) )
 443 
 444         # Lance Ellinghaus's syslog module
 445         if platform not in ['mac']:
 446             # syslog daemon interface
 447             exts.append( Extension('syslog', ['syslogmodule.c']) )
 448 
 449         # George Neville-Neil's timing module:
 450         # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
 451         # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
 452         #exts.append( Extension('timing', ['timingmodule.c']) )
 453 
 454         #
 455         # Here ends the simple stuff.  From here on, modules need certain
 456         # libraries, are platform-specific, or present other surprises.
 457         #
 458 
 459         # Multimedia modules
 460         # These don't work for 64-bit platforms!!!
 461         # These represent audio samples or images as strings:
 462 
 463         # Operations on audio samples
 464         # According to #993173, this one should actually work fine on
 465         # 64-bit platforms.
 466         #exts.append( Extension('audioop', ['audioop.c']) )
 467 
 468         # Disabled on 64-bit platforms
 469         #if sys.maxint != 9223372036854775807L:
 470         #    # Operations on images
 471         #    exts.append( Extension('imageop', ['imageop.c']) )
 472         #    # Read SGI RGB image files (but coded portably)
 473         #    exts.append( Extension('rgbimg', ['rgbimgmodule.c']) )
 474 
 475         # readline
 476         #do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
 477         #if platform == 'darwin':
 478         #    # MacOSX 10.4 has a broken readline. Don't try to build
 479         #    # the readline module unless the user has installed a fixed
 480         #    # readline package
 481         #    if find_file('readline/rlconf.h', inc_dirs, []) is None:
 482         #        do_readline = False
 483         #if do_readline:
 484         #    if sys.platform == 'darwin':
 485         #        # In every directory on the search path search for a dynamic
 486         #        # library and then a static library, instead of first looking
 487         #        # for dynamic libraries on the entiry path.
 488         #        # This way a staticly linked custom readline gets picked up
 489         #        # before the (broken) dynamic library in /usr/lib.
 490         #        readline_extra_link_args = ('-Wl,-search_paths_first',)
 491         #    else:
 492         #        readline_extra_link_args = ()
 493 
 494         #    readline_libs = ['readline']
 495         #    if self.compiler.find_library_file(lib_dirs,
 496         #                                         'ncursesw'):
 497         #        readline_libs.append('ncursesw')
 498         #    elif self.compiler.find_library_file(lib_dirs,
 499         #                                         'ncurses'):
 500         #        readline_libs.append('ncurses')
 501         #    elif self.compiler.find_library_file(lib_dirs, 'curses'):
 502         #        readline_libs.append('curses')
 503         #    elif self.compiler.find_library_file(lib_dirs +
 504         #                                       ['/usr/lib/termcap'],
 505         #                                       'termcap'):
 506         #        readline_libs.append('termcap')
 507         #    exts.append( Extension('readline', ['readline.c'],
 508         #                           library_dirs=['/usr/lib/termcap'],
 509         #                           extra_link_args=readline_extra_link_args,
 510         #                           libraries=readline_libs) )
 511         if platform not in ['mac']:
 512             # crypt module.
 513 
 514             if self.compiler.find_library_file(lib_dirs, 'crypt'):
 515                 libs = ['crypt']
 516             else:
 517                 libs = []
 518             exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
 519 
 520         # CSV files
 521         exts.append( Extension('_csv', ['_csv.c']) )
 522 
 523         # socket(2)
 524         exts.append( Extension('_socket', ['socketmodule.c'],
 525                                depends = ['socketmodule.h']) )
 526         # Detect SSL support for the socket module (via _ssl)
 527         #search_for_ssl_incs_in = [
 528         #                      '/usr/local/ssl/include',
 529         #                      '/usr/contrib/ssl/include/'
 530         #                     ]
 531         #ssl_incs = find_file('openssl/ssl.h', inc_dirs,
 532         #                     search_for_ssl_incs_in
 533         #                     )
 534         #if ssl_incs is not None:
 535         #    krb5_h = find_file('krb5.h', inc_dirs,
 536         #                       ['/usr/kerberos/include'])
 537         #    if krb5_h:
 538         #        ssl_incs += krb5_h
 539         #ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
 540         #                             ['/usr/local/ssl/lib',
 541         #                              '/usr/contrib/ssl/lib/'
 542         #                             ] )
 543 
 544         #if (ssl_incs is not None and
 545         #    ssl_libs is not None):
 546         #    exts.append( Extension('_ssl', ['_ssl.c'],
 547         #                           include_dirs = ssl_incs,
 548         #                           library_dirs = ssl_libs,
 549         #                           libraries = ['ssl', 'crypto'],
 550         #                           depends = ['socketmodule.h']), )
 551 
 552         ## find out which version of OpenSSL we have
 553         #openssl_ver = 0
 554         #openssl_ver_re = re.compile(
 555         #    '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
 556         #for ssl_inc_dir in inc_dirs + search_for_ssl_incs_in:
 557         #    name = os.path.join(ssl_inc_dir, 'openssl', 'opensslv.h')
 558         #    if os.path.isfile(name):
 559         #        try:
 560         #            incfile = open(name, 'r')
 561         #            for line in incfile:
 562         #                m = openssl_ver_re.match(line)
 563         #                if m:
 564         #                    openssl_ver = eval(m.group(1))
 565         #                    break
 566         #        except IOError:
 567         #            pass
 568 
 569         #    # first version found is what we'll use (as the compiler should)
 570         #    if openssl_ver:
 571         #        break
 572 
 573         #print 'openssl_ver = 0x%08x' % openssl_ver
 574 
 575         #if (ssl_incs is not None and
 576         #    ssl_libs is not None and
 577         #    openssl_ver >= 0x00907000):
 578         #    # The _hashlib module wraps optimized implementations
 579         #    # of hash functions from the OpenSSL library.
 580         #    exts.append( Extension('_hashlib', ['_hashopenssl.c'],
 581         #                           include_dirs = ssl_incs,
 582         #                           library_dirs = ssl_libs,
 583         #                           libraries = ['ssl', 'crypto']) )
 584         #else:
 585         # The _sha module implements the SHA1 hash algorithm.
 586         exts.append( Extension('_sha', ['shamodule.c']) )
 587         # The _md5 module implements the RSA Data Security, Inc. MD5
 588         # Message-Digest Algorithm, described in RFC 1321.  The
 589         # necessary files md5.c and md5.h are included here.
 590         exts.append( Extension('_md5',
 591                         sources = ['md5module.c', 'md5.c'],
 592                         depends = ['md5.h']) )
 593 
 594         #if (openssl_ver < 0x00908000):
 595             # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
 596         exts.append( Extension('_sha256', ['sha256module.c']) )
 597         #    exts.append( Extension('_sha512', ['sha512module.c']) )
 598 
 599 
 600         # Modules that provide persistent dictionary-like semantics.  You will
 601         # probably want to arrange for at least one of them to be available on
 602         # your machine, though none are defined by default because of library
 603         # dependencies.  The Python module anydbm.py provides an
 604         # implementation independent wrapper for these; dumbdbm.py provides
 605         # similar functionality (but slower of course) implemented in Python.
 606 
 607         # Sleepycat Berkeley DB interface.  http://www.sleepycat.com
 608         #
 609         # This requires the Sleepycat DB code. The supported versions
 610         # are set below.  Visit http://www.sleepycat.com/ to download
 611         # a release.  Most open source OSes come with one or more
 612         # versions of BerkeleyDB already installed.
 613 
 614         #max_db_ver = (4, 5)
 615         #min_db_ver = (3, 3)
 616         #db_setup_debug = False   # verbose debug prints from this script?
 617 
 618         ## construct a list of paths to look for the header file in on
 619         ## top of the normal inc_dirs.
 620         #db_inc_paths = [
 621         #    '/usr/include/db4',
 622         #    '/usr/local/include/db4',
 623         #    '/opt/sfw/include/db4',
 624         #    '/sw/include/db4',
 625         #    '/usr/include/db3',
 626         #    '/usr/local/include/db3',
 627         #    '/opt/sfw/include/db3',
 628         #    '/sw/include/db3',
 629         #]
 630         ## 4.x minor number specific paths
 631         #for x in (0,1,2,3,4,5):
 632         #    db_inc_paths.append('/usr/include/db4%d' % x)
 633         #    db_inc_paths.append('/usr/include/db4.%d' % x)
 634         #    db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
 635         #    db_inc_paths.append('/usr/local/include/db4%d' % x)
 636         #    db_inc_paths.append('/pkg/db-4.%d/include' % x)
 637         #    db_inc_paths.append('/opt/db-4.%d/include' % x)
 638         ## 3.x minor number specific paths
 639         #for x in (3,):
 640         #    db_inc_paths.append('/usr/include/db3%d' % x)
 641         #    db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
 642         #    db_inc_paths.append('/usr/local/include/db3%d' % x)
 643         #    db_inc_paths.append('/pkg/db-3.%d/include' % x)
 644         #    db_inc_paths.append('/opt/db-3.%d/include' % x)
 645 
 646         ## Add some common subdirectories for Sleepycat DB to the list,
 647         ## based on the standard include directories. This way DB3/4 gets
 648         ## picked up when it is installed in a non-standard prefix and
 649         ## the user has added that prefix into inc_dirs.
 650         #std_variants = []
 651         #for dn in inc_dirs:
 652         #    std_variants.append(os.path.join(dn, 'db3'))
 653         #    std_variants.append(os.path.join(dn, 'db4'))
 654         #    for x in (0,1,2,3,4):
 655         #        std_variants.append(os.path.join(dn, "db4%d"%x))
 656         #        std_variants.append(os.path.join(dn, "db4.%d"%x))
 657         #    for x in (2,3):
 658         #        std_variants.append(os.path.join(dn, "db3%d"%x))
 659         #        std_variants.append(os.path.join(dn, "db3.%d"%x))
 660 
 661         #db_inc_paths = std_variants + db_inc_paths
 662 
 663 
 664         #db_ver_inc_map = {}
 665 
 666         #class db_found(Exception): pass
 667         #try:
 668         #    # See whether there is a Sleepycat header in the standard
 669         #    # search path.
 670         #    for d in inc_dirs + db_inc_paths:
 671         #        f = os.path.join(d, "db.h")
 672         #        if db_setup_debug: print "db: looking for db.h in", f
 673         #        if os.path.exists(f):
 674         #            f = open(f).read()
 675         #            m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
 676         #            if m:
 677         #                db_major = int(m.group(1))
 678         #                m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
 679         #                db_minor = int(m.group(1))
 680         #                db_ver = (db_major, db_minor)
 681 
 682         #                if ( (not db_ver_inc_map.has_key(db_ver)) and
 683         #                   (db_ver <= max_db_ver and db_ver >= min_db_ver) ):
 684         #                    # save the include directory with the db.h version
 685         #                    # (first occurrance only)
 686         #                    db_ver_inc_map[db_ver] = d
 687         #                    print "db.h: found", db_ver, "in", d
 688         #                else:
 689         #                    # we already found a header for this library version
 690         #                    if db_setup_debug: print "db.h: ignoring", d
 691         #            else:
 692         #                # ignore this header, it didn't contain a version number
 693         #                if db_setup_debug: print "db.h: unsupported version", db_ver, "in", d
 694 
 695         #    db_found_vers = db_ver_inc_map.keys()
 696         #    db_found_vers.sort()
 697 
 698         #    while db_found_vers:
 699         #        db_ver = db_found_vers.pop()
 700         #        db_incdir = db_ver_inc_map[db_ver]
 701 
 702         #        # check lib directories parallel to the location of the header
 703         #        db_dirs_to_check = [
 704         #            os.path.join(db_incdir, '..', 'lib64'),
 705         #            os.path.join(db_incdir, '..', 'lib'),
 706         #            os.path.join(db_incdir, '..', '..', 'lib64'),
 707         #            os.path.join(db_incdir, '..', '..', 'lib'),
 708         #        ]
 709         #        db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
 710 
 711         #        # Look for a version specific db-X.Y before an ambiguoius dbX
 712         #        # XXX should we -ever- look for a dbX name?  Do any
 713         #        # systems really not name their library by version and
 714         #        # symlink to more general names?
 715         #        for dblib in (('db-%d.%d' % db_ver),
 716         #                      ('db%d%d' % db_ver),
 717         #                      ('db%d' % db_ver[0])):
 718         #            dblib_file = self.compiler.find_library_file(
 719         #                            db_dirs_to_check + lib_dirs, dblib )
 720         #            if dblib_file:
 721         #                dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
 722         #                raise db_found
 723         #            else:
 724         #                if db_setup_debug: print "db lib: ", dblib, "not found"
 725 
 726         #except db_found:
 727         #    print "db lib: using", db_ver, dblib
 728         #    if db_setup_debug: print "db: lib dir", dblib_dir, "inc dir", db_incdir
 729         #    db_incs = [db_incdir]
 730         #    dblibs = [dblib]
 731         #    # We add the runtime_library_dirs argument because the
 732         #    # BerkeleyDB lib we're linking against often isn't in the
 733         #    # system dynamic library search path.  This is usually
 734         #    # correct and most trouble free, but may cause problems in
 735         #    # some unusual system configurations (e.g. the directory
 736         #    # is on an NFS server that goes away).
 737         #    exts.append(Extension('_bsddb', ['_bsddb.c'],
 738         #                          library_dirs=dblib_dir,
 739         #                          runtime_library_dirs=dblib_dir,
 740         #                          include_dirs=db_incs,
 741         #                          libraries=dblibs))
 742         #else:
 743         #    if db_setup_debug: print "db: no appropriate library found"
 744         #    db_incs = None
 745         #    dblibs = []
 746         #    dblib_dir = None
 747 
 748         # The sqlite interface
 749         sqlite_setup_debug = True   # verbose debug prints from this script?
 750 
 751         # We hunt for #define SQLITE_VERSION "n.n.n"
 752         # We need to find >= sqlite version 3.0.8
 753         sqlite_incdir = sqlite_libdir = None
 754         sqlite_inc_paths = [ '/usr/include',
 755                              '/usr/include/sqlite',
 756                              '/usr/include/sqlite3',
 757                              '/usr/local/include',
 758                              '/usr/local/include/sqlite',
 759                              '/usr/local/include/sqlite3',
 760                            ]
 761         MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
 762         MIN_SQLITE_VERSION = ".".join([str(x)
 763                                     for x in MIN_SQLITE_VERSION_NUMBER])
 764 
 765         # Scan the default include directories before the SQLite specific
 766         # ones. This allows one to override the copy of sqlite on OSX,
 767         # where /usr/include contains an old version of sqlite.
 768         #for d in inc_dirs + sqlite_inc_paths:
 769         for d in ['/usr/local/arm/3.3.2/include']:
 770             f = os.path.join(d, "sqlite3.h")
 771             if os.path.exists(f):
 772                 if sqlite_setup_debug: print "sqlite: found %s"%f
 773                 incf = open(f).read()
 774                 m = re.search(
 775                     r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
 776                 if m:
 777                     sqlite_version = m.group(1)
 778                     sqlite_version_tuple = tuple([int(x)
 779                                         for x in sqlite_version.split(".")])
 780                     if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
 781                         # we win!
 782                         print "%s/sqlite3.h: version %s"%(d, sqlite_version)
 783                         sqlite_incdir = d
 784                         break
 785                     else:
 786                         if sqlite_setup_debug:
 787                             print "%s: version %d is too old, need >= %s"%(d,
 788                                         sqlite_version, MIN_SQLITE_VERSION)
 789                 elif sqlite_setup_debug:
 790                     print "sqlite: %s had no SQLITE_VERSION"%(f,)
 791 
 792         if sqlite_incdir:
 793             sqlite_dirs_to_check = [
 794                 os.path.join(sqlite_incdir, '..', 'lib64'),
 795                 os.path.join(sqlite_incdir, '..', 'lib'),
 796                 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
 797                 os.path.join(sqlite_incdir, '..', '..', 'lib'),
 798             ]
 799             sqlite_libfile = self.compiler.find_library_file(
 800                                 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
 801             sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
 802 
 803         if sqlite_incdir and sqlite_libdir:
 804             sqlite_srcs = ['_sqlite/cache.c',
 805                 '_sqlite/connection.c',
 806                 '_sqlite/cursor.c',
 807                 '_sqlite/microprotocols.c',
 808                 '_sqlite/module.c',
 809                 '_sqlite/prepare_protocol.c',
 810                 '_sqlite/row.c',
 811                 '_sqlite/statement.c',
 812                 '_sqlite/util.c', ]
 813 
 814             sqlite_defines = []
 815             if sys.platform != "win32":
 816                 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
 817             else:
 818                 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
 819 
 820 
 821             if sys.platform == 'darwin':
 822                 # In every directory on the search path search for a dynamic
 823                 # library and then a static library, instead of first looking
 824                 # for dynamic libraries on the entiry path.
 825                 # This way a staticly linked custom sqlite gets picked up
 826                 # before the dynamic library in /usr/lib.
 827                 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
 828             else:
 829                 sqlite_extra_link_args = ()
 830 
 831             exts.append(Extension('_sqlite3', sqlite_srcs,
 832                                   define_macros=sqlite_defines,
 833                                   include_dirs=["Modules/_sqlite",
 834                                                 sqlite_incdir],
 835                                   library_dirs=sqlite_libdir,
 836                                   runtime_library_dirs=sqlite_libdir,
 837                                   extra_link_args=sqlite_extra_link_args,
 838                                   libraries=["sqlite3",]))
 839 
 840         # Look for Berkeley db 1.85.   Note that it is built as a different
 841         # module name so it can be included even when later versions are
 842         # available.  A very restrictive search is performed to avoid
 843         # accidentally building this module with a later version of the
 844         # underlying db library.  May BSD-ish Unixes incorporate db 1.85
 845         # symbols into libc and place the include file in /usr/include.
 846         #f = "/usr/include/db.h"
 847         #if os.path.exists(f):
 848         #    data = open(f).read()
 849         #    m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
 850         #    if m is not None:
 851         #        # bingo - old version used hash file format version 2
 852         #        ### XXX this should be fixed to not be platform-dependent
 853         #        ### but I don't have direct access to an osf1 platform and
 854         #        ### seemed to be muffing the search somehow
 855         #        libraries = platform == "osf1" and ['db'] or None
 856         #        if libraries is not None:
 857         #            exts.append(Extension('bsddb185', ['bsddbmodule.c'],
 858         #                                  libraries=libraries))
 859         #        else:
 860         #            exts.append(Extension('bsddb185', ['bsddbmodule.c']))
 861 
 862         # The standard Unix dbm module:
 863         #if platform not in ['cygwin']:
 864         #    if find_file("ndbm.h", inc_dirs, []) is not None:
 865         #        # Some systems have -lndbm, others don't
 866         #        if self.compiler.find_library_file(lib_dirs, 'ndbm'):
 867         #            ndbm_libs = ['ndbm']
 868         #        else:
 869         #            ndbm_libs = []
 870         #        exts.append( Extension('dbm', ['dbmmodule.c'],
 871         #                               define_macros=[('HAVE_NDBM_H',None)],
 872         #                               libraries = ndbm_libs ) )
 873         #    elif (self.compiler.find_library_file(lib_dirs, 'gdbm')
 874         #          and find_file("gdbm/ndbm.h", inc_dirs, []) is not None):
 875         #        exts.append( Extension('dbm', ['dbmmodule.c'],
 876         #                               define_macros=[('HAVE_GDBM_NDBM_H',None)],
 877         #                               libraries = ['gdbm'] ) )
 878         #    elif db_incs is not None:
 879         #        exts.append( Extension('dbm', ['dbmmodule.c'],
 880         #                               library_dirs=dblib_dir,
 881         #                               runtime_library_dirs=dblib_dir,
 882         #                               include_dirs=db_incs,
 883         #                               define_macros=[('HAVE_BERKDB_H',None),
 884         #                                              ('DB_DBM_HSEARCH',None)],
 885         #                               libraries=dblibs))
 886 
 887         ## Anthony Baxter's gdbm module.  GNU dbm(3) will require -lgdbm:
 888         #if (self.compiler.find_library_file(lib_dirs, 'gdbm')):
 889         #    exts.append( Extension('gdbm', ['gdbmmodule.c'],
 890         #                           libraries = ['gdbm'] ) )
 891 
 892         # Unix-only modules
 893         #if platform not in ['mac', 'win32']:
 894         #    # Steen Lumholt's termios module
 895         #    exts.append( Extension('termios', ['termios.c']) )
 896         #    # Jeremy Hylton's rlimit interface
 897         #    if platform not in ['atheos']:
 898         #        exts.append( Extension('resource', ['resource.c']) )
 899 
 900         #    # Sun yellow pages. Some systems have the functions in libc.
 901         #    if platform not in ['cygwin', 'atheos']:
 902         #        if (self.compiler.find_library_file(lib_dirs, 'nsl')):
 903         #            libs = ['nsl']
 904         #        else:
 905         #            libs = []
 906         #        exts.append( Extension('nis', ['nismodule.c'],
 907         #                               libraries = libs) )
 908 
 909         # Curses support, requiring the System V version of curses, often
 910         # provided by the ncurses library.
 911         #panel_library = 'panel'
 912         #if (self.compiler.find_library_file(lib_dirs, 'ncursesw')):
 913         #    curses_libs = ['ncursesw']
 914         #    # Bug 1464056: If _curses.so links with ncursesw,
 915         #    # _curses_panel.so must link with panelw.
 916         #    panel_library = 'panelw'
 917         #    exts.append( Extension('_curses', ['_cursesmodule.c'],
 918         #                           libraries = curses_libs) )
 919         #elif (self.compiler.find_library_file(lib_dirs, 'ncurses')):
 920         #    curses_libs = ['ncurses']
 921         #    exts.append( Extension('_curses', ['_cursesmodule.c'],
 922         #                           libraries = curses_libs) )
 923         #elif (self.compiler.find_library_file(lib_dirs, 'curses')
 924         #      and platform != 'darwin'):
 925         #        # OSX has an old Berkeley curses, not good enough for
 926         #        # the _curses module.
 927         #    if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
 928         #        curses_libs = ['curses', 'terminfo']
 929         #    elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
 930         #        curses_libs = ['curses', 'termcap']
 931         #    else:
 932         #        curses_libs = ['curses']
 933 
 934         #    exts.append( Extension('_curses', ['_cursesmodule.c'],
 935         #                           libraries = curses_libs) )
 936 
 937         ## If the curses module is enabled, check for the panel module
 938         #if (module_enabled(exts, '_curses') and
 939         #    self.compiler.find_library_file(lib_dirs, panel_library)):
 940         #    exts.append( Extension('_curses_panel', ['_curses_panel.c'],
 941         #                           libraries = [panel_library] + curses_libs) )
 942 
 943 
 944         # Andrew Kuchling's zlib module.  Note that some versions of zlib
 945         # 1.1.3 have security problems.  See CERT Advisory CA-2002-07:
 946         # http://www.cert.org/advisories/CA-2002-07.html
 947         #
 948         # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
 949         # patch its zlib 1.1.3 package instead of upgrading to 1.1.4.  For
 950         # now, we still accept 1.1.3, because we think it's difficult to
 951         # exploit this in Python, and we'd rather make it RedHat's problem
 952         # than our problem <wink>.
 953         #
 954         # You can upgrade zlib to version 1.1.4 yourself by going to
 955         # http://www.gzip.org/zlib/
 956         zlib_inc = find_file('zlib.h', [], inc_dirs)
 957         if zlib_inc is not None:
 958             zlib_h = zlib_inc[0] + '/zlib.h'
 959             version = '"0.0.0"'
 960             version_req = '"1.1.3"'
 961             fp = open(zlib_h)
 962             while 1:
 963                 line = fp.readline()
 964                 if not line:
 965                     break
 966                 if line.startswith('#define ZLIB_VERSION'):
 967                     version = line.split()[2]
 968                     break
 969             if version >= version_req:
 970                 if (self.compiler.find_library_file(lib_dirs, 'z')):
 971                     if sys.platform == "darwin":
 972                         zlib_extra_link_args = ('-Wl,-search_paths_first',)
 973                     else:
 974                         zlib_extra_link_args = ()
 975                     exts.append( Extension('zlib', ['zlibmodule.c'],
 976                                            libraries = ['z'],
 977                                            extra_link_args = zlib_extra_link_args))
 978 
 979         # Gustavo Niemeyer's bz2 module.
 980         #if (self.compiler.find_library_file(lib_dirs, 'bz2')):
 981         #    if sys.platform == "darwin":
 982         #        bz2_extra_link_args = ('-Wl,-search_paths_first',)
 983         #    else:
 984         #        bz2_extra_link_args = ()
 985         #    exts.append( Extension('bz2', ['bz2module.c'],
 986         #                           libraries = ['bz2'],
 987         #                           extra_link_args = bz2_extra_link_args) )
 988 
 989         # Interface to the Expat XML parser
 990         #
 991         # Expat was written by James Clark and is now maintained by a
 992         # group of developers on SourceForge; see www.libexpat.org for
 993         # more information.  The pyexpat module was written by Paul
 994         # Prescod after a prototype by Jack Jansen.  The Expat source
 995         # is included in Modules/expat/.  Usage of a system
 996         # shared libexpat.so/expat.dll is not advised.
 997         #
 998         # More information on Expat can be found at www.libexpat.org.
 999         #
1000         expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')
1001         define_macros = [
1002             ('HAVE_EXPAT_CONFIG_H', '1'),
1003         ]
1004 
1005         exts.append(Extension('pyexpat',
1006                               define_macros = define_macros,
1007                               include_dirs = [expatinc],
1008                               sources = ['pyexpat.c',
1009                                          'expat/xmlparse.c',
1010                                          'expat/xmlrole.c',
1011                                          'expat/xmltok.c',
1012                                          ],
1013                               ))
1014 
1015         # Fredrik Lundh's cElementTree module.  Note that this also
1016         # uses expat (via the CAPI hook in pyexpat).
1017 
1018         if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
1019             define_macros.append(('USE_PYEXPAT_CAPI', None))
1020             exts.append(Extension('_elementtree',
1021                                   define_macros = define_macros,
1022                                   include_dirs = [expatinc],
1023                                   sources = ['_elementtree.c'],
1024                                   ))
1025 
1026         # Hye-Shik Chang's CJKCodecs modules.
1027         if have_unicode:
1028             exts.append(Extension('_multibytecodec',
1029                                   ['cjkcodecs/multibytecodec.c']))
1030             for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1031                 exts.append(Extension('_codecs_' + loc,
1032                                       ['cjkcodecs/_codecs_%s.c' % loc]))
1033 
1034         # Dynamic loading module
1035         if sys.maxint == 0x7fffffff:
1036             # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1037             dl_inc = find_file('dlfcn.h', [], inc_dirs)
1038             if (dl_inc is not None) and (platform not in ['atheos']):
1039                 exts.append( Extension('dl', ['dlmodule.c']) )
1040 
1041         # Thomas Heller's _ctypes module
1042         #self.detect_ctypes(inc_dirs, lib_dirs)
1043 
1044         # Platform-specific libraries
1045         #if platform == 'linux2':
1046         #    # Linux-specific modules
1047         #    exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
1048 
1049         #if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1050         #                'freebsd7'):
1051         #    exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
1052 
1053         if platform == 'sunos5':
1054             # SunOS specific modules
1055             exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
1056 
1057         if platform == 'darwin' and ("--disable-toolbox-glue" not in
1058                 sysconfig.get_config_var("CONFIG_ARGS")):
1059 
1060             if os.uname()[2] > '8.':
1061                 # We're on Mac OS X 10.4 or later, the compiler should
1062                 # support '-Wno-deprecated-declarations'. This will
1063                 # surpress deprecation warnings for the Carbon extensions,
1064                 # these extensions wrap the Carbon APIs and even those
1065                 # parts that are deprecated.
1066                 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1067             else:
1068                 carbon_extra_compile_args = []
1069 
1070             # Mac OS X specific modules.
1071             def macSrcExists(name1, name2=''):
1072                 if not name1:
1073                     return None
1074                 names = (name1,)
1075                 if name2:
1076                     names = (name1, name2)
1077                 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1078                 return os.path.exists(path)
1079 
1080             def addMacExtension(name, kwds, extra_srcs=[]):
1081                 dirname = ''
1082                 if name[0] == '_':
1083                     dirname = name[1:].lower()
1084                 cname = name + '.c'
1085                 cmodulename = name + 'module.c'
1086                 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1087                 if macSrcExists(cname):
1088                     srcs = [cname]
1089                 elif macSrcExists(cmodulename):
1090                     srcs = [cmodulename]
1091                 elif macSrcExists(dirname, cname):
1092                     # XXX(nnorwitz): If all the names ended with module, we
1093                     # wouldn't need this condition.  ibcarbon is the only one.
1094                     srcs = [os.path.join(dirname, cname)]
1095                 elif macSrcExists(dirname, cmodulename):
1096                     srcs = [os.path.join(dirname, cmodulename)]
1097                 else:
1098                     raise RuntimeError("%s not found" % name)
1099 
1100                 # Here's the whole point:  add the extension with sources
1101                 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1102 
1103             # Core Foundation
1104             core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1105                          'extra_link_args': ['-framework', 'CoreFoundation'],
1106                         }
1107             addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1108             addMacExtension('autoGIL', core_kwds)
1109 
1110             # Carbon
1111             carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1112                            'extra_link_args': ['-framework', 'Carbon'],
1113                           }
1114             CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1115                            'OSATerminology', 'icglue',
1116                            # All these are in subdirs
1117                            '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
1118                            '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
1119                            '_Help', '_Icn', '_IBCarbon', '_List',
1120                            '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
1121                            '_Scrap', '_Snd', '_TE', '_Win',
1122                           ]
1123             for name in CARBON_EXTS:
1124                 addMacExtension(name, carbon_kwds)
1125 
1126             # Application Services & QuickTime
1127             app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1128                         'extra_link_args': ['-framework','ApplicationServices'],
1129                        }
1130             addMacExtension('_Launch', app_kwds)
1131             addMacExtension('_CG', app_kwds)
1132 
1133             exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
1134                         extra_compile_args=carbon_extra_compile_args,
1135                         extra_link_args=['-framework', 'QuickTime',
1136                                      '-framework', 'Carbon']) )
1137 
1138 
1139         self.extensions.extend(exts)
1140 
1141         # Call the method for detecting whether _tkinter can be compiled
1142         #self.detect_tkinter(inc_dirs, lib_dirs)
1143 
1144     def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1145         # The _tkinter module, using frameworks. Since frameworks are quite
1146         # different the UNIX search logic is not sharable.
1147         from os.path import join, exists
1148         framework_dirs = [
1149             '/System/Library/Frameworks/',
1150             '/Library/Frameworks',
1151             join(os.getenv('HOME'), '/Library/Frameworks')
1152         ]
1153 
1154         # Find the directory that contains the Tcl.framework and Tk.framework
1155         # bundles.
1156         # XXX distutils should support -F!
1157         for F in framework_dirs:
1158             # both Tcl.framework and Tk.framework should be present
1159             for fw in 'Tcl', 'Tk':
1160                 if not exists(join(F, fw + '.framework')):
1161                     break
1162             else:
1163                 # ok, F is now directory with both frameworks. Continure
1164                 # building
1165                 break
1166         else:
1167             # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1168             # will now resume.
1169             return 0
1170 
1171         # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1172         # frameworks. In later release we should hopefully be able to pass
1173         # the -F option to gcc, which specifies a framework lookup path.
1174         #
1175         include_dirs = [
1176             join(F, fw + '.framework', H)
1177             for fw in 'Tcl', 'Tk'
1178             for H in 'Headers', 'Versions/Current/PrivateHeaders'
1179         ]
1180 
1181         # For 8.4a2, the X11 headers are not included. Rather than include a
1182         # complicated search, this is a hard-coded path. It could bail out
1183         # if X11 libs are not found...
1184         include_dirs.append('/usr/X11R6/include')
1185         frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1186 
1187         ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1188                         define_macros=[('WITH_APPINIT', 1)],
1189                         include_dirs = include_dirs,
1190                         libraries = [],
1191                         extra_compile_args = frameworks,
1192                         extra_link_args = frameworks,
1193                         )
1194         self.extensions.append(ext)
1195         return 1
1196 
1197 
1198     def detect_tkinter(self, inc_dirs, lib_dirs):
1199         # The _tkinter module.
1200 
1201         # Rather than complicate the code below, detecting and building
1202         # AquaTk is a separate method. Only one Tkinter will be built on
1203         # Darwin - either AquaTk, if it is found, or X11 based Tk.
1204         platform = self.get_platform()
1205         if (platform == 'darwin' and
1206             self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
1207             return
1208 
1209         # Assume we haven't found any of the libraries or include files
1210         # The versions with dots are used on Unix, and the versions without
1211         # dots on Windows, for detection by cygwin.
1212         tcllib = tklib = tcl_includes = tk_includes = None
1213         for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2',
1214                         '82', '8.1', '81', '8.0', '80']:
1215             tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version)
1216             tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version)
1217             if tklib and tcllib:
1218                 # Exit the loop when we've found the Tcl/Tk libraries
1219                 break
1220 
1221         # Now check for the header files
1222         if tklib and tcllib:
1223             # Check for the include files on Debian and {Free,Open}BSD, where
1224             # they're put in /usr/include/{tcl,tk}X.Y
1225             dotversion = version
1226             if '.' not in dotversion and "bsd" in sys.platform.lower():
1227                 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1228                 # but the include subdirs are named like .../include/tcl8.3.
1229                 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1230             tcl_include_sub = []
1231             tk_include_sub = []
1232             for dir in inc_dirs:
1233                 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1234                 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1235             tk_include_sub += tcl_include_sub
1236             tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1237             tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
1238 
1239         if (tcllib is None or tklib is None or
1240             tcl_includes is None or tk_includes is None):
1241             self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
1242             return
1243 
1244         # OK... everything seems to be present for Tcl/Tk.
1245 
1246         include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1247         for dir in tcl_includes + tk_includes:
1248             if dir not in include_dirs:
1249                 include_dirs.append(dir)
1250 
1251         # Check for various platform-specific directories
1252         if platform == 'sunos5':
1253             include_dirs.append('/usr/openwin/include')
1254             added_lib_dirs.append('/usr/openwin/lib')
1255         elif os.path.exists('/usr/X11R6/include'):
1256             include_dirs.append('/usr/X11R6/include')
1257             added_lib_dirs.append('/usr/X11R6/lib64')
1258             added_lib_dirs.append('/usr/X11R6/lib')
1259         elif os.path.exists('/usr/X11R5/include'):
1260             include_dirs.append('/usr/X11R5/include')
1261             added_lib_dirs.append('/usr/X11R5/lib')
1262         else:
1263             # Assume default location for X11
1264             include_dirs.append('/usr/X11/include')
1265             added_lib_dirs.append('/usr/X11/lib')
1266 
1267         # If Cygwin, then verify that X is installed before proceeding
1268         if platform == 'cygwin':
1269             x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1270             if x11_inc is None:
1271                 return
1272 
1273         # Check for BLT extension
1274         if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1275                                            'BLT8.0'):
1276             defs.append( ('WITH_BLT', 1) )
1277             libs.append('BLT8.0')
1278         elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1279                                            'BLT'):
1280             defs.append( ('WITH_BLT', 1) )
1281             libs.append('BLT')
1282 
1283         # Add the Tcl/Tk libraries
1284         libs.append('tk'+ version)
1285         libs.append('tcl'+ version)
1286 
1287         if platform in ['aix3', 'aix4']:
1288             libs.append('ld')
1289 
1290         # Finally, link with the X11 libraries (not appropriate on cygwin)
1291         if platform != "cygwin":
1292             libs.append('X11')
1293 
1294         ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1295                         define_macros=[('WITH_APPINIT', 1)] + defs,
1296                         include_dirs = include_dirs,
1297                         libraries = libs,
1298                         library_dirs = added_lib_dirs,
1299                         )
1300         self.extensions.append(ext)
1301 
1302 ##         # Uncomment these lines if you want to play with xxmodule.c
1303 ##         ext = Extension('xx', ['xxmodule.c'])
1304 ##         self.extensions.append(ext)
1305 
1306         # XXX handle these, but how to detect?
1307         # *** Uncomment and edit for PIL (TkImaging) extension only:
1308         #       -DWITH_PIL -I../Extensions/Imaging/libImaging  tkImaging.c \
1309         # *** Uncomment and edit for TOGL extension only:
1310         #       -DWITH_TOGL togl.c \
1311         # *** Uncomment these for TOGL extension only:
1312         #       -lGL -lGLU -lXext -lXmu \
1313 
1314     def configure_ctypes(self, ext):
1315         if not self.use_system_libffi:
1316             (srcdir,) = sysconfig.get_config_vars('srcdir')
1317             ffi_builddir = os.path.join(self.build_temp, 'libffi')
1318             ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1319                                          '_ctypes', 'libffi'))
1320             ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
1321 
1322             from distutils.dep_util import newer_group
1323 
1324             config_sources = [os.path.join(ffi_srcdir, fname)
1325                               for fname in os.listdir(ffi_srcdir)
1326                               if os.path.isfile(os.path.join(ffi_srcdir, fname))]
1327             if self.force or newer_group(config_sources,
1328                                          ffi_configfile):
1329                 from distutils.dir_util import mkpath
1330                 mkpath(ffi_builddir)
1331                 config_args = []
1332 
1333                 # Pass empty CFLAGS because we'll just append the resulting
1334                 # CFLAGS to Python's; -g or -O2 is to be avoided.
1335                 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1336                       % (ffi_builddir, ffi_srcdir, " ".join(config_args))
1337 
1338                 res = os.system(cmd)
1339                 if res or not os.path.exists(ffi_configfile):
1340                     print "Failed to configure _ctypes module"
1341                     return False
1342 
1343             fficonfig = {}
1344             execfile(ffi_configfile, globals(), fficonfig)
1345             ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src')
1346 
1347             # Add .S (preprocessed assembly) to C compiler source extensions.
1348             self.compiler.src_extensions.append('.S')
1349 
1350             include_dirs = [os.path.join(ffi_builddir, 'include'),
1351                             ffi_builddir, ffi_srcdir]
1352             extra_compile_args = fficonfig['ffi_cflags'].split()
1353 
1354             ext.sources.extend(fficonfig['ffi_sources'])
1355             ext.include_dirs.extend(include_dirs)
1356             ext.extra_compile_args.extend(extra_compile_args)
1357         return True
1358 
1359     def detect_ctypes(self, inc_dirs, lib_dirs):
1360         self.use_system_libffi = False
1361         include_dirs = []
1362         extra_compile_args = []
1363         extra_link_args = []
1364         sources = ['_ctypes/_ctypes.c',
1365                    '_ctypes/callbacks.c',
1366                    '_ctypes/callproc.c',
1367                    '_ctypes/stgdict.c',
1368                    '_ctypes/cfield.c',
1369                    '_ctypes/malloc_closure.c']
1370         depends = ['_ctypes/ctypes.h']
1371 
1372         if sys.platform == 'darwin':
1373             sources.append('_ctypes/darwin/dlfcn_simple.c')
1374             include_dirs.append('_ctypes/darwin')
1375 # XXX Is this still needed?
1376 ##            extra_link_args.extend(['-read_only_relocs', 'warning'])
1377 
1378         elif sys.platform == 'sunos5':
1379             # XXX This shouldn't be necessary; it appears that some
1380             # of the assembler code is non-PIC (i.e. it has relocations
1381             # when it shouldn't. The proper fix would be to rewrite
1382             # the assembler code to be PIC.
1383             # This only works with GCC; the Sun compiler likely refuses
1384             # this option. If you want to compile ctypes with the Sun
1385             # compiler, please research a proper solution, instead of
1386             # finding some -z option for the Sun compiler.
1387             extra_link_args.append('-mimpure-text')
1388 
1389         ext = Extension('_ctypes',
1390                         include_dirs=include_dirs,
1391                         extra_compile_args=extra_compile_args,
1392                         extra_link_args=extra_link_args,
1393                         libraries=[],
1394                         sources=sources,
1395                         depends=depends)
1396         ext_test = Extension('_ctypes_test',
1397                              sources=['_ctypes/_ctypes_test.c'])
1398         self.extensions.extend([ext, ext_test])
1399 
1400         if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1401             return
1402 
1403         ffi_inc = find_file('ffi.h', [], inc_dirs)
1404         if ffi_inc is not None:
1405             ffi_h = ffi_inc[0] + '/ffi.h'
1406             fp = open(ffi_h)
1407             while 1:
1408                 line = fp.readline()
1409                 if not line:
1410                     ffi_inc = None
1411                     break
1412                 if line.startswith('#define LIBFFI_H'):
1413                     break
1414         ffi_lib = None
1415         if ffi_inc is not None:
1416             for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
1417                 if (self.compiler.find_library_file(lib_dirs, lib_name)):
1418                     ffi_lib = lib_name
1419                     break
1420 
1421         if ffi_inc and ffi_lib:
1422             ext.include_dirs.extend(ffi_inc)
1423             ext.libraries.append(ffi_lib)
1424             self.use_system_libffi = True
1425 
1426 
1427 class PyBuildInstall(install):
1428     # Suppress the warning about installation into the lib_dynload
1429     # directory, which is not in sys.path when running Python during
1430     # installation:
1431     def initialize_options (self):
1432         install.initialize_options(self)
1433         self.warn_dir=0
1434 
1435 class PyBuildInstallLib(install_lib):
1436     # Do exactly what install_lib does but make sure correct access modes get
1437     # set on installed directories and files. All installed files with get
1438     # mode 644 unless they are a shared library in which case they will get
1439     # mode 755. All installed directories will get mode 755.
1440 
1441     so_ext = sysconfig.get_config_var("SO")
1442 
1443     def install(self):
1444         outfiles = install_lib.install(self)
1445         self.set_file_modes(outfiles, 0644, 0755)
1446         self.set_dir_modes(self.install_dir, 0755)
1447         return outfiles
1448 
1449     def set_file_modes(self, files, defaultMode, sharedLibMode):
1450         if not self.is_chmod_supported(): return
1451         if not files: return
1452 
1453         for filename in files:
1454             if os.path.islink(filename): continue
1455             mode = defaultMode
1456             if filename.endswith(self.so_ext): mode = sharedLibMode
1457             log.info("changing mode of %s to %o", filename, mode)
1458             if not self.dry_run: os.chmod(filename, mode)
1459 
1460     def set_dir_modes(self, dirname, mode):
1461         if not self.is_chmod_supported(): return
1462         os.path.walk(dirname, self.set_dir_modes_visitor, mode)
1463 
1464     def set_dir_modes_visitor(self, mode, dirname, names):
1465         if os.path.islink(dirname): return
1466         log.info("changing mode of %s to %o", dirname, mode)
1467         if not self.dry_run: os.chmod(dirname, mode)
1468 
1469     def is_chmod_supported(self):
1470         return hasattr(os, 'chmod')
1471 
1472 SUMMARY = """
1473 Python is an interpreted, interactive, object-oriented programming
1474 language. It is often compared to Tcl, Perl, Scheme or Java.
1475 
1476 Python combines remarkable power with very clear syntax. It has
1477 modules, classes, exceptions, very high level dynamic data types, and
1478 dynamic typing. There are interfaces to many system calls and
1479 libraries, as well as to various windowing systems (X11, Motif, Tk,
1480 Mac, MFC). New built-in modules are easily written in C or C++. Python
1481 is also usable as an extension language for applications that need a
1482 programmable interface.
1483 
1484 The Python implementation is portable: it runs on many brands of UNIX,
1485 on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
1486 listed here, it may still be supported, if there's a C compiler for
1487 it. Ask around on comp.lang.python -- or just try compiling Python
1488 yourself.
1489 """
1490 
1491 CLASSIFIERS = """
1492 Development Status :: 3 - Alpha
1493 Development Status :: 6 - Mature
1494 License :: OSI Approved :: Python Software Foundation License
1495 Natural Language :: English
1496 Programming Language :: C
1497 Programming Language :: Python
1498 Topic :: Software Development
1499 """
1500 
1501 def main():
1502     # turn off warnings when deprecated modules are imported
1503     import warnings
1504     warnings.filterwarnings("ignore",category=DeprecationWarning)
1505     setup(# PyPI Metadata (PEP 301)
1506           name = "Python",
1507           version = sys.version.split()[0],
1508           url = "http://www.python.org/%s" % sys.version[:3],
1509           maintainer = "Guido van Rossum and the Python community",
1510           maintainer_email = "[email protected]",
1511           description = "A high-level object-oriented programming language",
1512           long_description = SUMMARY.strip(),
1513           license = "PSF license",
1514           classifiers = filter(None, CLASSIFIERS.split("\n")),
1515           platforms = ["Many"],
1516 
1517           # Build info
1518           cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
1519                       'install_lib':PyBuildInstallLib},
1520           # The struct module is defined here, because build_ext won't be
1521           # called unless there's at least one extension module defined.
1522           ext_modules=[Extension('_struct', ['_struct.c'])],
1523 
1524           # Scripts to install
1525           #scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
1526           #           'Lib/smtpd.py']
1527           scripts = []
1528         )
1529 
1530 # --install-platlib
1531 if __name__ == '__main__':
1532     main()

Attached Files

To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.
  • [get | view] (2021-05-11 08:52:11, 37.5 KB) [[attachment:Makefile]]
  • [get | view] (2021-05-11 08:52:11, 1.5 KB) [[attachment:cleanpy.sh]]
  • [get | view] (2021-05-11 08:52:11, 66.8 KB) [[attachment:setup.py]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.