source: python/vendor/current/setup.py@ 388

Last change on this file since 388 was 388, checked in by dmik, 11 years ago

python: Update vendor to 2.7.6.

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