source: python/trunk/setup.py@ 393

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

python: Fix merge typos.

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