source: python/trunk/setup.py@ 20

Last change on this file since 20 was 10, checked in by Yuri Dario, 15 years ago

python: merged offline changes.

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