source: python/trunk/setup.py@ 611

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

python: build mmap module, by psmedley. clean also binaries.

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