source: python/trunk/setup.py

Last change on this file was 1151, checked in by dmik, 8 years ago

python: Remove LIBCx from the list of module libraries.

Partly undoes r977. LIBCx is intended as a drop-in replacement and
should be passed in LDFLAGS so that every shared python module
is linked against it as well as the main python DLL and launcher.

  • Property svn:eol-style set to native
File size: 95.5 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']:
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 # We add the runtime_library_dirs argument because the
1078 # BerkeleyDB lib we're linking against often isn't in the
1079 # system dynamic library search path. This is usually
1080 # correct and most trouble free, but may cause problems in
1081 # some unusual system configurations (e.g. the directory
1082 # is on an NFS server that goes away).
1083 exts.append(Extension('_bsddb', ['_bsddb.c'],
1084 depends = ['bsddb.h'],
1085 library_dirs=dblib_dir,
1086 runtime_library_dirs=dblib_dir,
1087 include_dirs=db_incs,
1088 libraries=dblibs))
1089 else:
1090 if db_setup_debug: print "db: no appropriate library found"
1091 db_incs = None
1092 dblibs = []
1093 dblib_dir = None
1094 missing.append('_bsddb')
1095
1096 # The sqlite interface
1097 sqlite_setup_debug = False # verbose debug prints from this script?
1098
1099 # We hunt for #define SQLITE_VERSION "n.n.n"
1100 # We need to find >= sqlite version 3.0.8
1101 sqlite_incdir = sqlite_libdir = None
1102 sqlite_inc_paths = [ '/usr/include',
1103 '/usr/include/sqlite',
1104 '/usr/include/sqlite3',
1105 '/usr/local/include',
1106 '/usr/local/include/sqlite',
1107 '/usr/local/include/sqlite3',
1108 ]
1109 if cross_compiling:
1110 sqlite_inc_paths = []
1111 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1112 MIN_SQLITE_VERSION = ".".join([str(x)
1113 for x in MIN_SQLITE_VERSION_NUMBER])
1114
1115 # Scan the default include directories before the SQLite specific
1116 # ones. This allows one to override the copy of sqlite on OSX,
1117 # where /usr/include contains an old version of sqlite.
1118 if host_platform == 'darwin':
1119 sysroot = macosx_sdk_root()
1120
1121 for d_ in inc_dirs + sqlite_inc_paths:
1122 d = d_
1123 if host_platform == 'darwin' and is_macosx_sdk_path(d):
1124 d = os.path.join(sysroot, d[1:])
1125
1126 f = os.path.join(d, "sqlite3.h")
1127 if os.path.exists(f):
1128 if sqlite_setup_debug: print "sqlite: found %s"%f
1129 incf = open(f).read()
1130 m = re.search(
1131 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
1132 if m:
1133 sqlite_version = m.group(1)
1134 sqlite_version_tuple = tuple([int(x)
1135 for x in sqlite_version.split(".")])
1136 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1137 # we win!
1138 if sqlite_setup_debug:
1139 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
1140 sqlite_incdir = d
1141 break
1142 else:
1143 if sqlite_setup_debug:
1144 print "%s: version %d is too old, need >= %s"%(d,
1145 sqlite_version, MIN_SQLITE_VERSION)
1146 elif sqlite_setup_debug:
1147 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1148
1149 if sqlite_incdir:
1150 sqlite_dirs_to_check = [
1151 os.path.join(sqlite_incdir, '..', 'lib64'),
1152 os.path.join(sqlite_incdir, '..', 'lib'),
1153 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1154 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1155 ]
1156 sqlite_libfile = self.compiler.find_library_file(
1157 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
1158 if sqlite_libfile:
1159 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
1160
1161 if sqlite_incdir and sqlite_libdir:
1162 sqlite_srcs = ['_sqlite/cache.c',
1163 '_sqlite/connection.c',
1164 '_sqlite/cursor.c',
1165 '_sqlite/microprotocols.c',
1166 '_sqlite/module.c',
1167 '_sqlite/prepare_protocol.c',
1168 '_sqlite/row.c',
1169 '_sqlite/statement.c',
1170 '_sqlite/util.c', ]
1171
1172 sqlite_defines = []
1173 if host_platform != "win32":
1174 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1175 else:
1176 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1177
1178 # Comment this out if you want the sqlite3 module to be able to load extensions.
1179 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
1180
1181 if host_platform == 'darwin':
1182 # In every directory on the search path search for a dynamic
1183 # library and then a static library, instead of first looking
1184 # for dynamic libraries on the entire path.
1185 # This way a statically linked custom sqlite gets picked up
1186 # before the dynamic library in /usr/lib.
1187 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1188 else:
1189 sqlite_extra_link_args = ()
1190
1191 exts.append(Extension('_sqlite3', sqlite_srcs,
1192 define_macros=sqlite_defines,
1193 include_dirs=["Modules/_sqlite",
1194 sqlite_incdir],
1195 library_dirs=sqlite_libdir,
1196 runtime_library_dirs=sqlite_libdir,
1197 extra_link_args=sqlite_extra_link_args,
1198 libraries=["sqlite3",]))
1199 else:
1200 missing.append('_sqlite3')
1201
1202 # Look for Berkeley db 1.85. Note that it is built as a different
1203 # module name so it can be included even when later versions are
1204 # available. A very restrictive search is performed to avoid
1205 # accidentally building this module with a later version of the
1206 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1207 # symbols into libc and place the include file in /usr/include.
1208 #
1209 # If the better bsddb library can be built (db_incs is defined)
1210 # we do not build this one. Otherwise this build will pick up
1211 # the more recent berkeleydb's db.h file first in the include path
1212 # when attempting to compile and it will fail.
1213 f = "/usr/include/db.h"
1214
1215 if host_platform == 'darwin':
1216 if is_macosx_sdk_path(f):
1217 sysroot = macosx_sdk_root()
1218 f = os.path.join(sysroot, f[1:])
1219
1220 if os.path.exists(f) and not db_incs:
1221 data = open(f).read()
1222 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1223 if m is not None:
1224 # bingo - old version used hash file format version 2
1225 ### XXX this should be fixed to not be platform-dependent
1226 ### but I don't have direct access to an osf1 platform and
1227 ### seemed to be muffing the search somehow
1228 libraries = host_platform == "osf1" and ['db'] or None
1229 if libraries is not None:
1230 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1231 libraries=libraries))
1232 else:
1233 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
1234 else:
1235 missing.append('bsddb185')
1236 else:
1237 missing.append('bsddb185')
1238
1239 dbm_order = ['gdbm']
1240 # The standard Unix dbm module:
1241 if host_platform not in ['cygwin']:
1242 config_args = [arg.strip("'")
1243 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
1244 dbm_args = [arg for arg in config_args
1245 if arg.startswith('--with-dbmliborder=')]
1246 if dbm_args:
1247 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
1248 else:
1249 dbm_order = "ndbm:gdbm:bdb".split(":")
1250 dbmext = None
1251 for cand in dbm_order:
1252 if cand == "ndbm":
1253 if find_file("ndbm.h", inc_dirs, []) is not None:
1254 # Some systems have -lndbm, others have -lgdbm_compat,
1255 # others don't have either
1256 if self.compiler.find_library_file(lib_dirs,
1257 'ndbm'):
1258 ndbm_libs = ['ndbm']
1259 elif self.compiler.find_library_file(lib_dirs,
1260 'gdbm_compat'):
1261 ndbm_libs = ['gdbm_compat']
1262 else:
1263 ndbm_libs = []
1264 print "building dbm using ndbm"
1265 dbmext = Extension('dbm', ['dbmmodule.c'],
1266 define_macros=[
1267 ('HAVE_NDBM_H',None),
1268 ],
1269 libraries=ndbm_libs)
1270 break
1271
1272 elif cand == "gdbm":
1273 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
1274 gdbm_libs = ['gdbm']
1275 if self.compiler.find_library_file(lib_dirs,
1276 'gdbm_compat'):
1277 gdbm_libs.append('gdbm_compat')
1278 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1279 print "building dbm using gdbm"
1280 dbmext = Extension(
1281 'dbm', ['dbmmodule.c'],
1282 define_macros=[
1283 ('HAVE_GDBM_NDBM_H', None),
1284 ],
1285 libraries = gdbm_libs)
1286 break
1287 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1288 print "building dbm using gdbm"
1289 dbmext = Extension(
1290 'dbm', ['dbmmodule.c'],
1291 define_macros=[
1292 ('HAVE_GDBM_DASH_NDBM_H', None),
1293 ],
1294 libraries = gdbm_libs)
1295 break
1296 elif cand == "bdb":
1297 if db_incs is not None:
1298 print "building dbm using bdb"
1299 dbmext = Extension('dbm', ['dbmmodule.c'],
1300 library_dirs=dblib_dir,
1301 runtime_library_dirs=dblib_dir,
1302 include_dirs=db_incs,
1303 define_macros=[
1304 ('HAVE_BERKDB_H', None),
1305 ('DB_DBM_HSEARCH', None),
1306 ],
1307 libraries=dblibs)
1308 break
1309 if dbmext is not None:
1310 exts.append(dbmext)
1311 else:
1312 missing.append('dbm')
1313
1314 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
1315 if ('gdbm' in dbm_order and
1316 self.compiler.find_library_file(lib_dirs, 'gdbm')):
1317 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1318 libraries = ['gdbm'] ) )
1319 else:
1320 missing.append('gdbm')
1321
1322 # Unix-only modules
1323 if host_platform not in ['win32']:
1324 # Steen Lumholt's termios module
1325 exts.append( Extension('termios', ['termios.c']) )
1326 # Jeremy Hylton's rlimit interface
1327 if host_platform not in ['atheos']:
1328 exts.append( Extension('resource', ['resource.c']) )
1329 else:
1330 missing.append('resource')
1331
1332 # Sun yellow pages. Some systems have the functions in libc.
1333 if (host_platform not in ['cygwin', 'atheos', 'qnx6', 'os2knix'] and
1334 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
1335 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
1336 libs = ['nsl']
1337 else:
1338 libs = []
1339 exts.append( Extension('nis', ['nismodule.c'],
1340 libraries = libs) )
1341 else:
1342 missing.append('nis')
1343 else:
1344 missing.extend(['nis', 'resource', 'termios'])
1345
1346 # Curses support, requiring the System V version of curses, often
1347 # provided by the ncurses library.
1348 panel_library = 'panel'
1349 if curses_library.startswith('ncurses'):
1350 if curses_library == 'ncursesw':
1351 # Bug 1464056: If _curses.so links with ncursesw,
1352 # _curses_panel.so must link with panelw.
1353 panel_library = 'panelw'
1354 curses_libs = [curses_library]
1355 if host_platform in ['os2emx', 'os2knix']:
1356 curses_libs.append('tinfo')
1357 exts.append( Extension('_curses', ['_cursesmodule.c'],
1358 libraries = curses_libs) )
1359 elif curses_library == 'curses' and host_platform != 'darwin':
1360 # OSX has an old Berkeley curses, not good enough for
1361 # the _curses module.
1362 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
1363 curses_libs = ['curses', 'terminfo']
1364 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
1365 curses_libs = ['curses', 'termcap']
1366 else:
1367 curses_libs = ['curses']
1368
1369 exts.append( Extension('_curses', ['_cursesmodule.c'],
1370 libraries = curses_libs) )
1371 else:
1372 missing.append('_curses')
1373
1374 # If the curses module is enabled, check for the panel module
1375 if (module_enabled(exts, '_curses') and
1376 self.compiler.find_library_file(lib_dirs, panel_library)):
1377 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
1378 libraries = [panel_library] + curses_libs) )
1379 else:
1380 missing.append('_curses_panel')
1381
1382 # Andrew Kuchling's zlib module. Note that some versions of zlib
1383 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1384 # http://www.cert.org/advisories/CA-2002-07.html
1385 #
1386 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1387 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1388 # now, we still accept 1.1.3, because we think it's difficult to
1389 # exploit this in Python, and we'd rather make it RedHat's problem
1390 # than our problem <wink>.
1391 #
1392 # You can upgrade zlib to version 1.1.4 yourself by going to
1393 # http://www.gzip.org/zlib/
1394 zlib_inc = find_file('zlib.h', [], inc_dirs)
1395 have_zlib = False
1396 if zlib_inc is not None:
1397 zlib_h = zlib_inc[0] + '/zlib.h'
1398 version = '"0.0.0"'
1399 version_req = '"1.1.3"'
1400 if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
1401 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
1402 fp = open(zlib_h)
1403 while 1:
1404 line = fp.readline()
1405 if not line:
1406 break
1407 if line.startswith('#define ZLIB_VERSION'):
1408 version = line.split()[2]
1409 break
1410 if version >= version_req:
1411 if (self.compiler.find_library_file(lib_dirs, 'z')):
1412 if host_platform == "darwin":
1413 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1414 else:
1415 zlib_extra_link_args = ()
1416 exts.append( Extension('zlib', ['zlibmodule.c'],
1417 libraries = ['z'],
1418 extra_link_args = zlib_extra_link_args))
1419 have_zlib = True
1420 else:
1421 missing.append('zlib')
1422 else:
1423 missing.append('zlib')
1424 else:
1425 missing.append('zlib')
1426
1427 # Helper module for various ascii-encoders. Uses zlib for an optimized
1428 # crc32 if we have it. Otherwise binascii uses its own.
1429 if have_zlib:
1430 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1431 libraries = ['z']
1432 extra_link_args = zlib_extra_link_args
1433 else:
1434 extra_compile_args = []
1435 libraries = []
1436 extra_link_args = []
1437 exts.append( Extension('binascii', ['binascii.c'],
1438 extra_compile_args = extra_compile_args,
1439 libraries = libraries,
1440 extra_link_args = extra_link_args) )
1441
1442 # Gustavo Niemeyer's bz2 module.
1443 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
1444 if host_platform == "darwin":
1445 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1446 else:
1447 bz2_extra_link_args = ()
1448 exts.append( Extension('bz2', ['bz2module.c'],
1449 libraries = ['bz2'],
1450 extra_link_args = bz2_extra_link_args) )
1451 else:
1452 missing.append('bz2')
1453
1454 # Interface to the Expat XML parser
1455 #
1456 # Expat was written by James Clark and is now maintained by a group of
1457 # developers on SourceForge; see www.libexpat.org for more information.
1458 # The pyexpat module was written by Paul Prescod after a prototype by
1459 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1460 # of a system shared libexpat.so is possible with --with-system-expat
1461 # configure option.
1462 #
1463 # More information on Expat can be found at www.libexpat.org.
1464 #
1465 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1466 expat_inc = []
1467 define_macros = []
1468 expat_lib = ['expat']
1469 expat_sources = []
1470 expat_depends = []
1471 else:
1472 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1473 define_macros = [
1474 ('HAVE_EXPAT_CONFIG_H', '1'),
1475 ]
1476 expat_lib = []
1477 expat_sources = ['expat/xmlparse.c',
1478 'expat/xmlrole.c',
1479 'expat/xmltok.c']
1480 expat_depends = ['expat/ascii.h',
1481 'expat/asciitab.h',
1482 'expat/expat.h',
1483 'expat/expat_config.h',
1484 'expat/expat_external.h',
1485 'expat/internal.h',
1486 'expat/latin1tab.h',
1487 'expat/utf8tab.h',
1488 'expat/xmlrole.h',
1489 'expat/xmltok.h',
1490 'expat/xmltok_impl.h'
1491 ]
1492
1493 exts.append(Extension('pyexpat',
1494 define_macros = define_macros,
1495 include_dirs = expat_inc,
1496 libraries = expat_lib,
1497 sources = ['pyexpat.c'] + expat_sources,
1498 depends = expat_depends,
1499 ))
1500
1501 # Fredrik Lundh's cElementTree module. Note that this also
1502 # uses expat (via the CAPI hook in pyexpat).
1503
1504 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
1505 define_macros.append(('USE_PYEXPAT_CAPI', None))
1506 exts.append(Extension('_elementtree',
1507 define_macros = define_macros,
1508 include_dirs = expat_inc,
1509 libraries = expat_lib,
1510 sources = ['_elementtree.c'],
1511 depends = ['pyexpat.c'] + expat_sources +
1512 expat_depends,
1513 ))
1514 else:
1515 missing.append('_elementtree')
1516
1517 # Hye-Shik Chang's CJKCodecs modules.
1518 if have_unicode:
1519 exts.append(Extension('_multibytecodec',
1520 ['cjkcodecs/multibytecodec.c']))
1521 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1522 exts.append(Extension('_codecs_%s' % loc,
1523 ['cjkcodecs/_codecs_%s.c' % loc]))
1524 else:
1525 missing.append('_multibytecodec')
1526 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1527 missing.append('_codecs_%s' % loc)
1528
1529 # Dynamic loading module
1530 if sys.maxint == 0x7fffffff:
1531 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1532 dl_inc = find_file('dlfcn.h', [], inc_dirs)
1533 if (dl_inc is not None) and (host_platform not in ['atheos']):
1534 exts.append( Extension('dl', ['dlmodule.c']) )
1535 else:
1536 missing.append('dl')
1537 else:
1538 missing.append('dl')
1539
1540 # Thomas Heller's _ctypes module
1541 self.detect_ctypes(inc_dirs, lib_dirs)
1542
1543 # Richard Oudkerk's multiprocessing module
1544 if host_platform == 'win32': # Windows
1545 macros = dict()
1546 libraries = ['ws2_32']
1547
1548 elif host_platform == 'darwin': # Mac OSX
1549 macros = dict()
1550 libraries = []
1551
1552 elif host_platform == 'cygwin': # Cygwin
1553 macros = dict()
1554 libraries = []
1555
1556 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
1557 # FreeBSD's P1003.1b semaphore support is very experimental
1558 # and has many known problems. (as of June 2008)
1559 macros = dict()
1560 libraries = []
1561
1562 elif host_platform.startswith('openbsd'):
1563 macros = dict()
1564 libraries = []
1565
1566 elif host_platform.startswith('netbsd'):
1567 macros = dict()
1568 libraries = []
1569
1570 else: # Linux and other unices
1571 macros = dict()
1572 libraries = ['rt']
1573
1574 if host_platform == 'win32':
1575 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1576 '_multiprocessing/semaphore.c',
1577 '_multiprocessing/pipe_connection.c',
1578 '_multiprocessing/socket_connection.c',
1579 '_multiprocessing/win32_functions.c'
1580 ]
1581
1582 else:
1583 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1584 '_multiprocessing/socket_connection.c'
1585 ]
1586 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1587 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
1588 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1589
1590 if sysconfig.get_config_var('WITH_THREAD'):
1591 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1592 define_macros=macros.items(),
1593 include_dirs=["Modules/_multiprocessing"]))
1594 else:
1595 missing.append('_multiprocessing')
1596
1597 # End multiprocessing
1598
1599
1600 # Platform-specific libraries
1601 if host_platform == 'linux2':
1602 # Linux-specific modules
1603 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
1604 else:
1605 missing.append('linuxaudiodev')
1606
1607 if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1608 'freebsd7', 'freebsd8')
1609 or host_platform.startswith("gnukfreebsd")):
1610 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
1611 else:
1612 missing.append('ossaudiodev')
1613
1614 if host_platform == 'sunos5':
1615 # SunOS specific modules
1616 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
1617 else:
1618 missing.append('sunaudiodev')
1619
1620 if host_platform == 'darwin':
1621 # _scproxy
1622 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1623 extra_link_args= [
1624 '-framework', 'SystemConfiguration',
1625 '-framework', 'CoreFoundation'
1626 ]))
1627
1628
1629 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
1630 sysconfig.get_config_var("CONFIG_ARGS")):
1631
1632 if int(os.uname()[2].split('.')[0]) >= 8:
1633 # We're on Mac OS X 10.4 or later, the compiler should
1634 # support '-Wno-deprecated-declarations'. This will
1635 # surpress deprecation warnings for the Carbon extensions,
1636 # these extensions wrap the Carbon APIs and even those
1637 # parts that are deprecated.
1638 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1639 else:
1640 carbon_extra_compile_args = []
1641
1642 # Mac OS X specific modules.
1643 def macSrcExists(name1, name2=''):
1644 if not name1:
1645 return None
1646 names = (name1,)
1647 if name2:
1648 names = (name1, name2)
1649 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1650 return os.path.exists(path)
1651
1652 def addMacExtension(name, kwds, extra_srcs=[]):
1653 dirname = ''
1654 if name[0] == '_':
1655 dirname = name[1:].lower()
1656 cname = name + '.c'
1657 cmodulename = name + 'module.c'
1658 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1659 if macSrcExists(cname):
1660 srcs = [cname]
1661 elif macSrcExists(cmodulename):
1662 srcs = [cmodulename]
1663 elif macSrcExists(dirname, cname):
1664 # XXX(nnorwitz): If all the names ended with module, we
1665 # wouldn't need this condition. ibcarbon is the only one.
1666 srcs = [os.path.join(dirname, cname)]
1667 elif macSrcExists(dirname, cmodulename):
1668 srcs = [os.path.join(dirname, cmodulename)]
1669 else:
1670 raise RuntimeError("%s not found" % name)
1671
1672 # Here's the whole point: add the extension with sources
1673 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1674
1675 # Core Foundation
1676 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1677 'extra_link_args': ['-framework', 'CoreFoundation'],
1678 }
1679 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1680 addMacExtension('autoGIL', core_kwds)
1681
1682
1683
1684 # Carbon
1685 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1686 'extra_link_args': ['-framework', 'Carbon'],
1687 }
1688 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1689 'OSATerminology', 'icglue',
1690 # All these are in subdirs
1691 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
1692 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
1693 '_Help', '_Icn', '_IBCarbon', '_List',
1694 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
1695 '_Scrap', '_Snd', '_TE',
1696 ]
1697 for name in CARBON_EXTS:
1698 addMacExtension(name, carbon_kwds)
1699
1700 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1701 # The _Win extension should build just like the other Carbon extensions, but
1702 # this actually results in a hard crash of the linker.
1703 #
1704 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1705 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1706 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1707 }
1708 addMacExtension('_Win', win_kwds)
1709 else:
1710 addMacExtension('_Win', carbon_kwds)
1711
1712
1713 # Application Services & QuickTime
1714 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1715 'extra_link_args': ['-framework','ApplicationServices'],
1716 }
1717 addMacExtension('_Launch', app_kwds)
1718 addMacExtension('_CG', app_kwds)
1719
1720 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
1721 extra_compile_args=carbon_extra_compile_args,
1722 extra_link_args=['-framework', 'QuickTime',
1723 '-framework', 'Carbon']) )
1724
1725
1726 self.extensions.extend(exts)
1727
1728 # Call the method for detecting whether _tkinter can be compiled
1729 self.detect_tkinter(inc_dirs, lib_dirs)
1730
1731 if '_tkinter' not in [e.name for e in self.extensions]:
1732 missing.append('_tkinter')
1733
1734## # Uncomment these lines if you want to play with xxmodule.c
1735## ext = Extension('xx', ['xxmodule.c'])
1736## self.extensions.append(ext)
1737
1738 return missing
1739
1740 def detect_tkinter_explicitly(self):
1741 # Build _tkinter using explicit locations for Tcl/Tk.
1742 #
1743 # This is enabled when both arguments are given to ./configure:
1744 #
1745 # --with-tcltk-includes="-I/path/to/tclincludes \
1746 # -I/path/to/tkincludes"
1747 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1748 # -L/path/to/tklibs -ltkm.n"
1749 #
1750 # These values can also be specified or overriden via make:
1751 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1752 #
1753 # This can be useful for building and testing tkinter with multiple
1754 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1755 # build of Tcl so you need to specify both arguments and use care when
1756 # overriding.
1757
1758 # The _TCLTK variables are created in the Makefile sharedmods target.
1759 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1760 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1761 if not (tcltk_includes and tcltk_libs):
1762 # Resume default configuration search.
1763 return 0
1764
1765 extra_compile_args = tcltk_includes.split()
1766 extra_link_args = tcltk_libs.split()
1767 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1768 define_macros=[('WITH_APPINIT', 1)],
1769 extra_compile_args = extra_compile_args,
1770 extra_link_args = extra_link_args,
1771 )
1772 self.extensions.append(ext)
1773 return 1
1774
1775 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1776 # The _tkinter module, using frameworks. Since frameworks are quite
1777 # different the UNIX search logic is not sharable.
1778 from os.path import join, exists
1779 framework_dirs = [
1780 '/Library/Frameworks',
1781 '/System/Library/Frameworks/',
1782 join(os.getenv('HOME'), '/Library/Frameworks')
1783 ]
1784
1785 sysroot = macosx_sdk_root()
1786
1787 # Find the directory that contains the Tcl.framework and Tk.framework
1788 # bundles.
1789 # XXX distutils should support -F!
1790 for F in framework_dirs:
1791 # both Tcl.framework and Tk.framework should be present
1792
1793
1794 for fw in 'Tcl', 'Tk':
1795 if is_macosx_sdk_path(F):
1796 if not exists(join(sysroot, F[1:], fw + '.framework')):
1797 break
1798 else:
1799 if not exists(join(F, fw + '.framework')):
1800 break
1801 else:
1802 # ok, F is now directory with both frameworks. Continure
1803 # building
1804 break
1805 else:
1806 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1807 # will now resume.
1808 return 0
1809
1810 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1811 # frameworks. In later release we should hopefully be able to pass
1812 # the -F option to gcc, which specifies a framework lookup path.
1813 #
1814 include_dirs = [
1815 join(F, fw + '.framework', H)
1816 for fw in 'Tcl', 'Tk'
1817 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1818 ]
1819
1820 # For 8.4a2, the X11 headers are not included. Rather than include a
1821 # complicated search, this is a hard-coded path. It could bail out
1822 # if X11 libs are not found...
1823 include_dirs.append('/usr/X11R6/include')
1824 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1825
1826 # All existing framework builds of Tcl/Tk don't support 64-bit
1827 # architectures.
1828 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1829 archs = re.findall('-arch\s+(\w+)', cflags)
1830
1831 if is_macosx_sdk_path(F):
1832 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1833 else:
1834 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1835
1836 detected_archs = []
1837 for ln in fp:
1838 a = ln.split()[-1]
1839 if a in archs:
1840 detected_archs.append(ln.split()[-1])
1841 fp.close()
1842
1843 for a in detected_archs:
1844 frameworks.append('-arch')
1845 frameworks.append(a)
1846
1847 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1848 define_macros=[('WITH_APPINIT', 1)],
1849 include_dirs = include_dirs,
1850 libraries = [],
1851 extra_compile_args = frameworks[2:],
1852 extra_link_args = frameworks,
1853 )
1854 self.extensions.append(ext)
1855 return 1
1856
1857 def detect_tkinter(self, inc_dirs, lib_dirs):
1858 # The _tkinter module.
1859
1860 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1861 # configured or passed into the make target. If so, use these values
1862 # to build tkinter and bypass the searches for Tcl and TK in standard
1863 # locations.
1864 if self.detect_tkinter_explicitly():
1865 return
1866
1867 # Rather than complicate the code below, detecting and building
1868 # AquaTk is a separate method. Only one Tkinter will be built on
1869 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1870 if (host_platform == 'darwin' and
1871 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
1872 return
1873
1874 # Assume we haven't found any of the libraries or include files
1875 # The versions with dots are used on Unix, and the versions without
1876 # dots on Windows, for detection by cygwin.
1877 tcllib = tklib = tcl_includes = tk_includes = None
1878 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1879 '8.2', '82', '8.1', '81', '8.0', '80']:
1880 tklib = self.compiler.find_library_file(lib_dirs,
1881 'tk' + version)
1882 tcllib = self.compiler.find_library_file(lib_dirs,
1883 'tcl' + version)
1884 if tklib and tcllib:
1885 # Exit the loop when we've found the Tcl/Tk libraries
1886 break
1887
1888 # Now check for the header files
1889 if tklib and tcllib:
1890 # Check for the include files on Debian and {Free,Open}BSD, where
1891 # they're put in /usr/include/{tcl,tk}X.Y
1892 dotversion = version
1893 if '.' not in dotversion and "bsd" in host_platform.lower():
1894 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1895 # but the include subdirs are named like .../include/tcl8.3.
1896 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1897 tcl_include_sub = []
1898 tk_include_sub = []
1899 for dir in inc_dirs:
1900 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1901 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1902 tk_include_sub += tcl_include_sub
1903 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1904 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
1905
1906 if (tcllib is None or tklib is None or
1907 tcl_includes is None or tk_includes is None):
1908 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
1909 return
1910
1911 # OK... everything seems to be present for Tcl/Tk.
1912
1913 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1914 for dir in tcl_includes + tk_includes:
1915 if dir not in include_dirs:
1916 include_dirs.append(dir)
1917
1918 # Check for various platform-specific directories
1919 if host_platform == 'sunos5':
1920 include_dirs.append('/usr/openwin/include')
1921 added_lib_dirs.append('/usr/openwin/lib')
1922 elif os.path.exists('/usr/X11R6/include'):
1923 include_dirs.append('/usr/X11R6/include')
1924 added_lib_dirs.append('/usr/X11R6/lib64')
1925 added_lib_dirs.append('/usr/X11R6/lib')
1926 elif os.path.exists('/usr/X11R5/include'):
1927 include_dirs.append('/usr/X11R5/include')
1928 added_lib_dirs.append('/usr/X11R5/lib')
1929 else:
1930 # Assume default location for X11
1931 include_dirs.append('/usr/X11/include')
1932 added_lib_dirs.append('/usr/X11/lib')
1933
1934 # If Cygwin, then verify that X is installed before proceeding
1935 if host_platform == 'cygwin':
1936 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1937 if x11_inc is None:
1938 return
1939
1940 # Check for BLT extension
1941 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1942 'BLT8.0'):
1943 defs.append( ('WITH_BLT', 1) )
1944 libs.append('BLT8.0')
1945 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1946 'BLT'):
1947 defs.append( ('WITH_BLT', 1) )
1948 libs.append('BLT')
1949
1950 # Add the Tcl/Tk libraries
1951 libs.append('tk'+ version)
1952 libs.append('tcl'+ version)
1953
1954 if host_platform in ['aix3', 'aix4']:
1955 libs.append('ld')
1956
1957 # Finally, link with the X11 libraries (not appropriate on cygwin)
1958 if host_platform != "cygwin":
1959 libs.append('X11')
1960
1961 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1962 define_macros=[('WITH_APPINIT', 1)] + defs,
1963 include_dirs = include_dirs,
1964 libraries = libs,
1965 library_dirs = added_lib_dirs,
1966 )
1967 self.extensions.append(ext)
1968
1969 # XXX handle these, but how to detect?
1970 # *** Uncomment and edit for PIL (TkImaging) extension only:
1971 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
1972 # *** Uncomment and edit for TOGL extension only:
1973 # -DWITH_TOGL togl.c \
1974 # *** Uncomment these for TOGL extension only:
1975 # -lGL -lGLU -lXext -lXmu \
1976
1977 def configure_ctypes_darwin(self, ext):
1978 # Darwin (OS X) uses preconfigured files, in
1979 # the Modules/_ctypes/libffi_osx directory.
1980 srcdir = sysconfig.get_config_var('srcdir')
1981 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1982 '_ctypes', 'libffi_osx'))
1983 sources = [os.path.join(ffi_srcdir, p)
1984 for p in ['ffi.c',
1985 'x86/darwin64.S',
1986 'x86/x86-darwin.S',
1987 'x86/x86-ffi_darwin.c',
1988 'x86/x86-ffi64.c',
1989 'powerpc/ppc-darwin.S',
1990 'powerpc/ppc-darwin_closure.S',
1991 'powerpc/ppc-ffi_darwin.c',
1992 'powerpc/ppc64-darwin_closure.S',
1993 ]]
1994
1995 # Add .S (preprocessed assembly) to C compiler source extensions.
1996 self.compiler.src_extensions.append('.S')
1997
1998 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1999 os.path.join(ffi_srcdir, 'powerpc')]
2000 ext.include_dirs.extend(include_dirs)
2001 ext.sources.extend(sources)
2002 return True
2003
2004 def configure_ctypes(self, ext):
2005 if not self.use_system_libffi:
2006 if host_platform == 'darwin':
2007 return self.configure_ctypes_darwin(ext)
2008
2009 srcdir = sysconfig.get_config_var('srcdir')
2010 ffi_builddir = os.path.join(self.build_temp, 'libffi')
2011 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
2012 '_ctypes', 'libffi'))
2013 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
2014
2015 from distutils.dep_util import newer_group
2016
2017 config_sources = [os.path.join(ffi_srcdir, fname)
2018 for fname in os.listdir(ffi_srcdir)
2019 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
2020 if self.force or newer_group(config_sources,
2021 ffi_configfile):
2022 from distutils.dir_util import mkpath
2023 mkpath(ffi_builddir)
2024 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
2025 if (('--host=' in arg) or ('--build=' in arg))]
2026 if not self.verbose:
2027 config_args.append("-q")
2028
2029 # Pass empty CFLAGS because we'll just append the resulting
2030 # CFLAGS to Python's; -g or -O2 is to be avoided.
2031 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
2032 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
2033
2034 res = os.system(cmd)
2035 if res or not os.path.exists(ffi_configfile):
2036 print "Failed to configure _ctypes module"
2037 return False
2038
2039 fficonfig = {}
2040 with open(ffi_configfile) as f:
2041 exec f in fficonfig
2042
2043 # Add .S (preprocessed assembly) to C compiler source extensions.
2044 self.compiler.src_extensions.append('.S')
2045
2046 include_dirs = [os.path.join(ffi_builddir, 'include'),
2047 ffi_builddir,
2048 os.path.join(ffi_srcdir, 'src')]
2049 extra_compile_args = fficonfig['ffi_cflags'].split()
2050
2051 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
2052 fficonfig['ffi_sources'])
2053 ext.include_dirs.extend(include_dirs)
2054 ext.extra_compile_args.extend(extra_compile_args)
2055 return True
2056
2057 def detect_ctypes(self, inc_dirs, lib_dirs):
2058 self.use_system_libffi = False
2059 include_dirs = []
2060 extra_compile_args = []
2061 extra_link_args = []
2062 sources = ['_ctypes/_ctypes.c',
2063 '_ctypes/callbacks.c',
2064 '_ctypes/callproc.c',
2065 '_ctypes/stgdict.c',
2066 '_ctypes/cfield.c']
2067 depends = ['_ctypes/ctypes.h']
2068
2069 if host_platform == 'darwin':
2070 sources.append('_ctypes/malloc_closure.c')
2071 sources.append('_ctypes/darwin/dlfcn_simple.c')
2072 extra_compile_args.append('-DMACOSX')
2073 include_dirs.append('_ctypes/darwin')
2074# XXX Is this still needed?
2075## extra_link_args.extend(['-read_only_relocs', 'warning'])
2076
2077 elif host_platform == 'sunos5':
2078 # XXX This shouldn't be necessary; it appears that some
2079 # of the assembler code is non-PIC (i.e. it has relocations
2080 # when it shouldn't. The proper fix would be to rewrite
2081 # the assembler code to be PIC.
2082 # This only works with GCC; the Sun compiler likely refuses
2083 # this option. If you want to compile ctypes with the Sun
2084 # compiler, please research a proper solution, instead of
2085 # finding some -z option for the Sun compiler.
2086 extra_link_args.append('-mimpure-text')
2087
2088 elif host_platform.startswith('hp-ux'):
2089 extra_link_args.append('-fPIC')
2090
2091 ext = Extension('_ctypes',
2092 include_dirs=include_dirs,
2093 extra_compile_args=extra_compile_args,
2094 extra_link_args=extra_link_args,
2095 libraries=[],
2096 sources=sources,
2097 depends=depends)
2098 ext_test = Extension('_ctypes_test',
2099 sources=['_ctypes/_ctypes_test.c'])
2100 self.extensions.extend([ext, ext_test])
2101
2102 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
2103 return
2104
2105 if host_platform == 'darwin':
2106 # OS X 10.5 comes with libffi.dylib; the include files are
2107 # in /usr/include/ffi
2108 inc_dirs.append('/usr/include/ffi')
2109
2110 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
2111 if not ffi_inc or ffi_inc[0] == '':
2112 ffi_inc = find_file('ffi.h', [], inc_dirs)
2113 if ffi_inc is not None:
2114 ffi_h = ffi_inc[0] + '/ffi.h'
2115 fp = open(ffi_h)
2116 while 1:
2117 line = fp.readline()
2118 if not line:
2119 ffi_inc = None
2120 break
2121 if line.startswith('#define LIBFFI_H'):
2122 break
2123 ffi_lib = None
2124 if ffi_inc is not None:
2125 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
2126 if (self.compiler.find_library_file(lib_dirs, lib_name)):
2127 ffi_lib = lib_name
2128 break
2129
2130 if ffi_inc and ffi_lib:
2131 ext.include_dirs.extend(ffi_inc)
2132 ext.libraries.append(ffi_lib)
2133 self.use_system_libffi = True
2134
2135
2136class PyBuildInstall(install):
2137 # Suppress the warning about installation into the lib_dynload
2138 # directory, which is not in sys.path when running Python during
2139 # installation:
2140 def initialize_options (self):
2141 install.initialize_options(self)
2142 self.warn_dir=0
2143
2144class PyBuildInstallLib(install_lib):
2145 # Do exactly what install_lib does but make sure correct access modes get
2146 # set on installed directories and files. All installed files with get
2147 # mode 644 unless they are a shared library in which case they will get
2148 # mode 755. All installed directories will get mode 755.
2149
2150 so_ext = sysconfig.get_config_var("SO")
2151
2152 def install(self):
2153 outfiles = install_lib.install(self)
2154 self.set_file_modes(outfiles, 0644, 0755)
2155 self.set_dir_modes(self.install_dir, 0755)
2156 return outfiles
2157
2158 def set_file_modes(self, files, defaultMode, sharedLibMode):
2159 if not self.is_chmod_supported(): return
2160 if not files: return
2161
2162 for filename in files:
2163 if os.path.islink(filename): continue
2164 mode = defaultMode
2165 if filename.endswith(self.so_ext): mode = sharedLibMode
2166 log.info("changing mode of %s to %o", filename, mode)
2167 if not self.dry_run: os.chmod(filename, mode)
2168
2169 def set_dir_modes(self, dirname, mode):
2170 if not self.is_chmod_supported(): return
2171 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2172
2173 def set_dir_modes_visitor(self, mode, dirname, names):
2174 if os.path.islink(dirname): return
2175 log.info("changing mode of %s to %o", dirname, mode)
2176 if not self.dry_run: os.chmod(dirname, mode)
2177
2178 def is_chmod_supported(self):
2179 return hasattr(os, 'chmod')
2180
2181SUMMARY = """
2182Python is an interpreted, interactive, object-oriented programming
2183language. It is often compared to Tcl, Perl, Scheme or Java.
2184
2185Python combines remarkable power with very clear syntax. It has
2186modules, classes, exceptions, very high level dynamic data types, and
2187dynamic typing. There are interfaces to many system calls and
2188libraries, as well as to various windowing systems (X11, Motif, Tk,
2189Mac, MFC). New built-in modules are easily written in C or C++. Python
2190is also usable as an extension language for applications that need a
2191programmable interface.
2192
2193The Python implementation is portable: it runs on many brands of UNIX,
2194on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2195listed here, it may still be supported, if there's a C compiler for
2196it. Ask around on comp.lang.python -- or just try compiling Python
2197yourself.
2198"""
2199
2200CLASSIFIERS = """
2201Development Status :: 6 - Mature
2202License :: OSI Approved :: Python Software Foundation License
2203Natural Language :: English
2204Programming Language :: C
2205Programming Language :: Python
2206Topic :: Software Development
2207"""
2208
2209def main():
2210 # turn off warnings when deprecated modules are imported
2211 import warnings
2212 warnings.filterwarnings("ignore",category=DeprecationWarning)
2213 setup(# PyPI Metadata (PEP 301)
2214 name = "Python",
2215 version = sys.version.split()[0],
2216 url = "http://www.python.org/%s" % sys.version[:3],
2217 maintainer = "Guido van Rossum and the Python community",
2218 maintainer_email = "python-dev@python.org",
2219 description = "A high-level object-oriented programming language",
2220 long_description = SUMMARY.strip(),
2221 license = "PSF license",
2222 classifiers = filter(None, CLASSIFIERS.split("\n")),
2223 platforms = ["Many"],
2224
2225 # Build info
2226 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2227 'install_lib':PyBuildInstallLib},
2228 # The struct module is defined here, because build_ext won't be
2229 # called unless there's at least one extension module defined.
2230 ext_modules=[Extension('_struct', ['_struct.c'])],
2231
2232 # Scripts to install
2233 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
2234 'Tools/scripts/2to3',
2235 'Lib/smtpd.py']
2236 )
2237
2238# --install-platlib
2239if __name__ == '__main__':
2240 main()
Note: See TracBrowser for help on using the repository browser.