source: python/trunk/setup.py@ 977

Last change on this file since 977 was 977, checked in by Yuri Dario, 9 years ago

python: add cx to list of std libs, improve search filter for import libs.

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