Attachment 'setup.py'
Download 1 # Autodetecting setup.py script for building the Python extensions
2 #
3
4 __version__ = "$Revision: 53777 $"
5
6 import sys, os, imp, re, optparse
7
8 from distutils import log
9 from distutils import sysconfig
10 from distutils import text_file
11 from distutils.errors import *
12 from distutils.core import Extension, setup
13 from distutils.command.build_ext import build_ext
14 from distutils.command.install import install
15 from distutils.command.install_lib import install_lib
16
17 # This global variable is used to hold the list of modules to be disabled.
18 disabled_module_list = []
19
20 def add_dir_to_list(dirlist, dir):
21 """Add the directory 'dir' to the list 'dirlist' (at the front) if
22 1) 'dir' is not already in 'dirlist'
23 2) 'dir' actually exists, and is a directory."""
24 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
25 dirlist.insert(0, dir)
26
27 def find_file(filename, std_dirs, paths):
28 """Searches for the directory where a given file is located,
29 and returns a possibly-empty list of additional directories, or None
30 if the file couldn't be found at all.
31
32 'filename' is the name of a file, such as readline.h or libcrypto.a.
33 'std_dirs' is the list of standard system directories; if the
34 file is found in one of them, no additional directives are needed.
35 'paths' is a list of additional locations to check; if the file is
36 found in one of them, the resulting list will contain the directory.
37 """
38
39 # Check the standard locations
40 for dir in std_dirs:
41 f = os.path.join(dir, filename)
42 if os.path.exists(f): return []
43
44 # Check the additional directories
45 for dir in paths:
46 f = os.path.join(dir, filename)
47 if os.path.exists(f):
48 return [dir]
49
50 # Not found anywhere
51 return None
52
53 def find_library_file(compiler, libname, std_dirs, paths):
54 result = compiler.find_library_file(std_dirs + paths, libname)
55 if result is None:
56 return None
57
58 # Check whether the found file is in one of the standard directories
59 dirname = os.path.dirname(result)
60 for p in std_dirs:
61 # Ensure path doesn't end with path separator
62 p = p.rstrip(os.sep)
63 if p == dirname:
64 return [ ]
65
66 # Otherwise, it must have been in one of the additional directories,
67 # so we have to figure out which one.
68 for p in paths:
69 # Ensure path doesn't end with path separator
70 p = p.rstrip(os.sep)
71 if p == dirname:
72 return [p]
73 else:
74 assert False, "Internal error: Path not found in std_dirs or paths"
75
76 def module_enabled(extlist, modname):
77 """Returns whether the module 'modname' is present in the list
78 of extensions 'extlist'."""
79 extlist = [ext for ext in extlist if ext.name == modname]
80 return len(extlist)
81
82 def find_module_file(module, dirlist):
83 """Find a module in a set of possible folders. If it is not found
84 return the unadorned filename"""
85 list = find_file(module, [], dirlist)
86 if not list:
87 return module
88 if len(list) > 1:
89 log.info("WARNING: multiple copies of %s found"%module)
90 return os.path.join(list[0], module)
91
92 class PyBuildExt(build_ext):
93
94 def build_extensions(self):
95
96 # Detect which modules should be compiled
97 self.detect_modules()
98
99 # Remove modules that are present on the disabled list
100 self.extensions = [ext for ext in self.extensions
101 if ext.name not in disabled_module_list]
102
103 # Fix up the autodetected modules, prefixing all the source files
104 # with Modules/ and adding Python's include directory to the path.
105 (srcdir,) = sysconfig.get_config_vars('srcdir')
106 if not srcdir:
107 # Maybe running on Windows but not using CYGWIN?
108 raise ValueError("No source directory; cannot proceed.")
109
110 # Figure out the location of the source code for extension modules
111 moddir = os.path.join(os.getcwd(), srcdir, 'Modules')
112 moddir = os.path.normpath(moddir)
113 srcdir, tail = os.path.split(moddir)
114 srcdir = os.path.normpath(srcdir)
115 moddir = os.path.normpath(moddir)
116
117 moddirlist = [moddir]
118 incdirlist = ['./Include']
119
120 # Platform-dependent module source and include directories
121 platform = self.get_platform()
122 if platform in ('darwin', 'mac') and ("--disable-toolbox-glue" not in
123 sysconfig.get_config_var("CONFIG_ARGS")):
124 # Mac OS X also includes some mac-specific modules
125 macmoddir = os.path.join(os.getcwd(), srcdir, 'Mac/Modules')
126 moddirlist.append(macmoddir)
127 incdirlist.append('./Mac/Include')
128
129 alldirlist = moddirlist + incdirlist
130
131 # Fix up the paths for scripts, too
132 self.distribution.scripts = [os.path.join(srcdir, filename)
133 for filename in self.distribution.scripts]
134
135 for ext in self.extensions[:]:
136 ext.sources = [ find_module_file(filename, moddirlist)
137 for filename in ext.sources ]
138 if ext.depends is not None:
139 ext.depends = [find_module_file(filename, alldirlist)
140 for filename in ext.depends]
141 ext.include_dirs.append( '.' ) # to get config.h
142 for incdir in incdirlist:
143 ext.include_dirs.append( os.path.join(srcdir, incdir) )
144
145 # If a module has already been built statically,
146 # don't build it here
147 if ext.name in sys.builtin_module_names:
148 self.extensions.remove(ext)
149
150 if platform != 'mac':
151 # Parse Modules/Setup and Modules/Setup.local to figure out which
152 # modules are turned on in the file.
153 remove_modules = []
154 for filename in ('Modules/Setup', 'Modules/Setup.local'):
155 input = text_file.TextFile(filename, join_lines=1)
156 while 1:
157 line = input.readline()
158 if not line: break
159 line = line.split()
160 remove_modules.append(line[0])
161 input.close()
162
163 for ext in self.extensions[:]:
164 if ext.name in remove_modules:
165 self.extensions.remove(ext)
166
167 # When you run "make CC=altcc" or something similar, you really want
168 # those environment variables passed into the setup.py phase. Here's
169 # a small set of useful ones.
170 compiler = os.environ.get('CC')
171 args = {}
172 # unfortunately, distutils doesn't let us provide separate C and C++
173 # compilers
174 if compiler is not None:
175 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
176 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
177 self.compiler.set_executables(**args)
178
179 build_ext.build_extensions(self)
180
181 def build_extension(self, ext):
182
183 if ext.name == '_ctypes':
184 assert False
185 if not self.configure_ctypes(ext):
186 return
187
188 try:
189 build_ext.build_extension(self, ext)
190 return
191 except (CCompilerError, DistutilsError), why:
192 self.announce('WARNING: building of extension "%s" failed: %s' %
193 (ext.name, sys.exc_info()[1]))
194 return
195 # Workaround for Mac OS X: The Carbon-based modules cannot be
196 # reliably imported into a command-line Python
197 if 'Carbon' in ext.extra_link_args:
198 self.announce(
199 'WARNING: skipping import check for Carbon-based "%s"' %
200 ext.name)
201 return
202 # Workaround for Cygwin: Cygwin currently has fork issues when many
203 # modules have been imported
204 if self.get_platform() == 'cygwin':
205 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
206 % ext.name)
207 return
208 ext_filename = os.path.join(
209 self.build_lib,
210 self.get_ext_filename(self.get_ext_fullname(ext.name)))
211 try:
212 imp.load_dynamic(ext.name, ext_filename)
213 except ImportError, why:
214 self.announce('*** WARNING: renaming "%s" since importing it'
215 ' failed: %s' % (ext.name, why), level=3)
216 assert not self.inplace
217 basename, tail = os.path.splitext(ext_filename)
218 newname = basename + "_failed" + tail
219 if os.path.exists(newname):
220 os.remove(newname)
221 os.rename(ext_filename, newname)
222
223 # XXX -- This relies on a Vile HACK in
224 # distutils.command.build_ext.build_extension(). The
225 # _built_objects attribute is stored there strictly for
226 # use here.
227 # If there is a failure, _built_objects may not be there,
228 # so catch the AttributeError and move on.
229 try:
230 for filename in self._built_objects:
231 os.remove(filename)
232 except AttributeError:
233 self.announce('unable to remove files (ignored)')
234 except:
235 exc_type, why, tb = sys.exc_info()
236 self.announce('*** WARNING: importing extension "%s" '
237 'failed with %s: %s' % (ext.name, exc_type, why),
238 level=3)
239
240 def get_platform(self):
241 # Get value of sys.platform
242 for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
243 if sys.platform.startswith(platform):
244 return platform
245 return sys.platform
246
247 def detect_modules(self):
248 # Ensure that /usr/local is always used
249 #add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
250 #add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
251
252 # Add paths specified in the environment variables LDFLAGS and
253 # CPPFLAGS for header and library files.
254 # We must get the values from the Makefile and not the environment
255 # directly since an inconsistently reproducible issue comes up where
256 # the environment variable is not set even though the value were passed
257 # into configure and stored in the Makefile (issue found on OS X 10.3).
258 for env_var, arg_name, dir_list in (
259 ('LDFLAGS', '-L', self.compiler.library_dirs),
260 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
261 env_val = sysconfig.get_config_var(env_var)
262 if env_val:
263 # To prevent optparse from raising an exception about any
264 # options in env_val that is doesn't know about we strip out
265 # all double dashes and any dashes followed by a character
266 # that is not for the option we are dealing with.
267 #
268 # Please note that order of the regex is important! We must
269 # strip out double-dashes first so that we don't end up with
270 # substituting "--Long" to "-Long" and thus lead to "ong" being
271 # used for a library directory.
272 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1], '', env_val)
273 parser = optparse.OptionParser()
274 # Make sure that allowing args interspersed with options is
275 # allowed
276 parser.allow_interspersed_args = True
277 parser.error = lambda msg: None
278 parser.add_option(arg_name, dest="dirs", action="append")
279 options = parser.parse_args(env_val.split())[0]
280 if options.dirs:
281 for directory in options.dirs:
282 add_dir_to_list(dir_list, directory)
283
284 if os.path.normpath(sys.prefix) != '/usr':
285 add_dir_to_list(self.compiler.library_dirs,
286 sysconfig.get_config_var("LIBDIR"))
287 add_dir_to_list(self.compiler.include_dirs,
288 sysconfig.get_config_var("INCLUDEDIR"))
289
290 try:
291 have_unicode = unicode
292 except NameError:
293 have_unicode = 0
294
295 # lib_dirs and inc_dirs are used to search for files;
296 # if a file is found in one of those directories, it can
297 # be assumed that no additional -I,-L directives are needed.
298 lib_dirs = self.compiler.library_dirs
299 #lib_dirs = self.compiler.library_dirs + [
300 # '/lib64', '/usr/lib64',
301 # '/lib', '/usr/lib',
302 # ]
303
304 #inc_dirs = self.compiler.include_dirs + ['/usr/include']
305 inc_dirs = self.compiler.include_dirs
306 exts = []
307
308 config_h = sysconfig.get_config_h_filename()
309 config_h_vars = sysconfig.parse_config_h(open(config_h))
310
311 platform = self.get_platform()
312 (srcdir,) = sysconfig.get_config_vars('srcdir')
313
314 # Check for AtheOS which has libraries in non-standard locations
315 if platform == 'atheos':
316 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
317 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
318 inc_dirs += ['/system/include', '/atheos/autolnk/include']
319 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
320
321 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
322 if platform in ['osf1', 'unixware7', 'openunix8']:
323 lib_dirs += ['/usr/ccs/lib']
324
325 if platform == 'darwin':
326 # This should work on any unixy platform ;-)
327 # If the user has bothered specifying additional -I and -L flags
328 # in OPT and LDFLAGS we might as well use them here.
329 # NOTE: using shlex.split would technically be more correct, but
330 # also gives a bootstrap problem. Let's hope nobody uses directories
331 # with whitespace in the name to store libraries.
332 cflags, ldflags = sysconfig.get_config_vars(
333 'CFLAGS', 'LDFLAGS')
334 for item in cflags.split():
335 if item.startswith('-I'):
336 inc_dirs.append(item[2:])
337
338 for item in ldflags.split():
339 if item.startswith('-L'):
340 lib_dirs.append(item[2:])
341
342 # Check for MacOS X, which doesn't need libm.a at all
343 math_libs = ['m']
344 if platform in ['darwin', 'beos', 'mac']:
345 math_libs = []
346
347 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
348
349 #
350 # The following modules are all pretty straightforward, and compile
351 # on pretty much any POSIXish platform.
352 #
353
354 # Some modules that are normally always on:
355 exts.append( Extension('_weakref', ['_weakref.c']) )
356
357 # array objects
358 exts.append( Extension('array', ['arraymodule.c']) )
359 # complex math library functions
360 #exts.append( Extension('cmath', ['cmathmodule.c'],
361 # libraries=math_libs) )
362
363 # math library functions, e.g. sin()
364 exts.append( Extension('math', ['mathmodule.c'],
365 libraries=math_libs) )
366 # fast string operations implemented in C
367 exts.append( Extension('strop', ['stropmodule.c']) )
368 # time operations and variables
369 exts.append( Extension('time', ['timemodule.c'],
370 libraries=math_libs) )
371 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
372 libraries=math_libs) )
373 # random number generator implemented in C
374 exts.append( Extension("_random", ["_randommodule.c"]) )
375 # fast iterator tools implemented in C
376 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
377 # high-performance collections
378 exts.append( Extension("collections", ["collectionsmodule.c"]) )
379 # bisect
380 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
381 # heapq
382 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
383 # operator.add() and similar goodies
384 exts.append( Extension('operator', ['operator.c']) )
385 # _functools
386 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
387 # Python C API test module
388 #exts.append( Extension('_testcapi', ['_testcapimodule.c']) )
389 # profilers (_lsprof is for cProfile.py)
390 exts.append( Extension('_hotshot', ['_hotshot.c']) )
391 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
392 # static Unicode character database
393 if have_unicode:
394 exts.append( Extension('unicodedata', ['unicodedata.c']) )
395 # access to ISO C locale support
396 data = open('pyconfig.h').read()
397 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
398 if m is not None:
399 locale_libs = ['intl']
400 else:
401 locale_libs = []
402 if platform == 'darwin':
403 locale_extra_link_args = ['-framework', 'CoreFoundation']
404 else:
405 locale_extra_link_args = []
406
407
408 exts.append( Extension('_locale', ['_localemodule.c'],
409 libraries=locale_libs,
410 extra_link_args=locale_extra_link_args) )
411
412 # Modules with some UNIX dependencies -- on by default:
413 # (If you have a really backward UNIX, select and socket may not be
414 # supported...)
415
416 # fcntl(2) and ioctl(2)
417 exts.append( Extension('fcntl', ['fcntlmodule.c']) )
418 #if platform not in ['mac']:
419 # # pwd(3)
420 # exts.append( Extension('pwd', ['pwdmodule.c']) )
421 # # grp(3)
422 # exts.append( Extension('grp', ['grpmodule.c']) )
423 # # spwd, shadow passwords
424 # if (config_h_vars.get('HAVE_GETSPNAM', False) or
425 # config_h_vars.get('HAVE_GETSPENT', False)):
426 # exts.append( Extension('spwd', ['spwdmodule.c']) )
427 # select(2); not on ancient System V
428 exts.append( Extension('select', ['selectmodule.c']) )
429
430 # Helper module for various ascii-encoders
431 exts.append( Extension('binascii', ['binascii.c']) )
432
433 # Fred Drake's interface to the Python parser
434 exts.append( Extension('parser', ['parsermodule.c']) )
435
436 # cStringIO and cPickle
437 exts.append( Extension('cStringIO', ['cStringIO.c']) )
438 exts.append( Extension('cPickle', ['cPickle.c']) )
439
440 # Memory-mapped files (also works on Win32).
441 #if platform not in ['atheos', 'mac']:
442 # exts.append( Extension('mmap', ['mmapmodule.c']) )
443
444 # Lance Ellinghaus's syslog module
445 if platform not in ['mac']:
446 # syslog daemon interface
447 exts.append( Extension('syslog', ['syslogmodule.c']) )
448
449 # George Neville-Neil's timing module:
450 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
451 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
452 #exts.append( Extension('timing', ['timingmodule.c']) )
453
454 #
455 # Here ends the simple stuff. From here on, modules need certain
456 # libraries, are platform-specific, or present other surprises.
457 #
458
459 # Multimedia modules
460 # These don't work for 64-bit platforms!!!
461 # These represent audio samples or images as strings:
462
463 # Operations on audio samples
464 # According to #993173, this one should actually work fine on
465 # 64-bit platforms.
466 #exts.append( Extension('audioop', ['audioop.c']) )
467
468 # Disabled on 64-bit platforms
469 #if sys.maxint != 9223372036854775807L:
470 # # Operations on images
471 # exts.append( Extension('imageop', ['imageop.c']) )
472 # # Read SGI RGB image files (but coded portably)
473 # exts.append( Extension('rgbimg', ['rgbimgmodule.c']) )
474
475 # readline
476 #do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
477 #if platform == 'darwin':
478 # # MacOSX 10.4 has a broken readline. Don't try to build
479 # # the readline module unless the user has installed a fixed
480 # # readline package
481 # if find_file('readline/rlconf.h', inc_dirs, []) is None:
482 # do_readline = False
483 #if do_readline:
484 # if sys.platform == 'darwin':
485 # # In every directory on the search path search for a dynamic
486 # # library and then a static library, instead of first looking
487 # # for dynamic libraries on the entiry path.
488 # # This way a staticly linked custom readline gets picked up
489 # # before the (broken) dynamic library in /usr/lib.
490 # readline_extra_link_args = ('-Wl,-search_paths_first',)
491 # else:
492 # readline_extra_link_args = ()
493
494 # readline_libs = ['readline']
495 # if self.compiler.find_library_file(lib_dirs,
496 # 'ncursesw'):
497 # readline_libs.append('ncursesw')
498 # elif self.compiler.find_library_file(lib_dirs,
499 # 'ncurses'):
500 # readline_libs.append('ncurses')
501 # elif self.compiler.find_library_file(lib_dirs, 'curses'):
502 # readline_libs.append('curses')
503 # elif self.compiler.find_library_file(lib_dirs +
504 # ['/usr/lib/termcap'],
505 # 'termcap'):
506 # readline_libs.append('termcap')
507 # exts.append( Extension('readline', ['readline.c'],
508 # library_dirs=['/usr/lib/termcap'],
509 # extra_link_args=readline_extra_link_args,
510 # libraries=readline_libs) )
511 if platform not in ['mac']:
512 # crypt module.
513
514 if self.compiler.find_library_file(lib_dirs, 'crypt'):
515 libs = ['crypt']
516 else:
517 libs = []
518 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
519
520 # CSV files
521 exts.append( Extension('_csv', ['_csv.c']) )
522
523 # socket(2)
524 exts.append( Extension('_socket', ['socketmodule.c'],
525 depends = ['socketmodule.h']) )
526 # Detect SSL support for the socket module (via _ssl)
527 #search_for_ssl_incs_in = [
528 # '/usr/local/ssl/include',
529 # '/usr/contrib/ssl/include/'
530 # ]
531 #ssl_incs = find_file('openssl/ssl.h', inc_dirs,
532 # search_for_ssl_incs_in
533 # )
534 #if ssl_incs is not None:
535 # krb5_h = find_file('krb5.h', inc_dirs,
536 # ['/usr/kerberos/include'])
537 # if krb5_h:
538 # ssl_incs += krb5_h
539 #ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
540 # ['/usr/local/ssl/lib',
541 # '/usr/contrib/ssl/lib/'
542 # ] )
543
544 #if (ssl_incs is not None and
545 # ssl_libs is not None):
546 # exts.append( Extension('_ssl', ['_ssl.c'],
547 # include_dirs = ssl_incs,
548 # library_dirs = ssl_libs,
549 # libraries = ['ssl', 'crypto'],
550 # depends = ['socketmodule.h']), )
551
552 ## find out which version of OpenSSL we have
553 #openssl_ver = 0
554 #openssl_ver_re = re.compile(
555 # '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
556 #for ssl_inc_dir in inc_dirs + search_for_ssl_incs_in:
557 # name = os.path.join(ssl_inc_dir, 'openssl', 'opensslv.h')
558 # if os.path.isfile(name):
559 # try:
560 # incfile = open(name, 'r')
561 # for line in incfile:
562 # m = openssl_ver_re.match(line)
563 # if m:
564 # openssl_ver = eval(m.group(1))
565 # break
566 # except IOError:
567 # pass
568
569 # # first version found is what we'll use (as the compiler should)
570 # if openssl_ver:
571 # break
572
573 #print 'openssl_ver = 0x%08x' % openssl_ver
574
575 #if (ssl_incs is not None and
576 # ssl_libs is not None and
577 # openssl_ver >= 0x00907000):
578 # # The _hashlib module wraps optimized implementations
579 # # of hash functions from the OpenSSL library.
580 # exts.append( Extension('_hashlib', ['_hashopenssl.c'],
581 # include_dirs = ssl_incs,
582 # library_dirs = ssl_libs,
583 # libraries = ['ssl', 'crypto']) )
584 #else:
585 # The _sha module implements the SHA1 hash algorithm.
586 exts.append( Extension('_sha', ['shamodule.c']) )
587 # The _md5 module implements the RSA Data Security, Inc. MD5
588 # Message-Digest Algorithm, described in RFC 1321. The
589 # necessary files md5.c and md5.h are included here.
590 exts.append( Extension('_md5',
591 sources = ['md5module.c', 'md5.c'],
592 depends = ['md5.h']) )
593
594 #if (openssl_ver < 0x00908000):
595 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
596 exts.append( Extension('_sha256', ['sha256module.c']) )
597 # exts.append( Extension('_sha512', ['sha512module.c']) )
598
599
600 # Modules that provide persistent dictionary-like semantics. You will
601 # probably want to arrange for at least one of them to be available on
602 # your machine, though none are defined by default because of library
603 # dependencies. The Python module anydbm.py provides an
604 # implementation independent wrapper for these; dumbdbm.py provides
605 # similar functionality (but slower of course) implemented in Python.
606
607 # Sleepycat Berkeley DB interface. http://www.sleepycat.com
608 #
609 # This requires the Sleepycat DB code. The supported versions
610 # are set below. Visit http://www.sleepycat.com/ to download
611 # a release. Most open source OSes come with one or more
612 # versions of BerkeleyDB already installed.
613
614 #max_db_ver = (4, 5)
615 #min_db_ver = (3, 3)
616 #db_setup_debug = False # verbose debug prints from this script?
617
618 ## construct a list of paths to look for the header file in on
619 ## top of the normal inc_dirs.
620 #db_inc_paths = [
621 # '/usr/include/db4',
622 # '/usr/local/include/db4',
623 # '/opt/sfw/include/db4',
624 # '/sw/include/db4',
625 # '/usr/include/db3',
626 # '/usr/local/include/db3',
627 # '/opt/sfw/include/db3',
628 # '/sw/include/db3',
629 #]
630 ## 4.x minor number specific paths
631 #for x in (0,1,2,3,4,5):
632 # db_inc_paths.append('/usr/include/db4%d' % x)
633 # db_inc_paths.append('/usr/include/db4.%d' % x)
634 # db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
635 # db_inc_paths.append('/usr/local/include/db4%d' % x)
636 # db_inc_paths.append('/pkg/db-4.%d/include' % x)
637 # db_inc_paths.append('/opt/db-4.%d/include' % x)
638 ## 3.x minor number specific paths
639 #for x in (3,):
640 # db_inc_paths.append('/usr/include/db3%d' % x)
641 # db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
642 # db_inc_paths.append('/usr/local/include/db3%d' % x)
643 # db_inc_paths.append('/pkg/db-3.%d/include' % x)
644 # db_inc_paths.append('/opt/db-3.%d/include' % x)
645
646 ## Add some common subdirectories for Sleepycat DB to the list,
647 ## based on the standard include directories. This way DB3/4 gets
648 ## picked up when it is installed in a non-standard prefix and
649 ## the user has added that prefix into inc_dirs.
650 #std_variants = []
651 #for dn in inc_dirs:
652 # std_variants.append(os.path.join(dn, 'db3'))
653 # std_variants.append(os.path.join(dn, 'db4'))
654 # for x in (0,1,2,3,4):
655 # std_variants.append(os.path.join(dn, "db4%d"%x))
656 # std_variants.append(os.path.join(dn, "db4.%d"%x))
657 # for x in (2,3):
658 # std_variants.append(os.path.join(dn, "db3%d"%x))
659 # std_variants.append(os.path.join(dn, "db3.%d"%x))
660
661 #db_inc_paths = std_variants + db_inc_paths
662
663
664 #db_ver_inc_map = {}
665
666 #class db_found(Exception): pass
667 #try:
668 # # See whether there is a Sleepycat header in the standard
669 # # search path.
670 # for d in inc_dirs + db_inc_paths:
671 # f = os.path.join(d, "db.h")
672 # if db_setup_debug: print "db: looking for db.h in", f
673 # if os.path.exists(f):
674 # f = open(f).read()
675 # m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
676 # if m:
677 # db_major = int(m.group(1))
678 # m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
679 # db_minor = int(m.group(1))
680 # db_ver = (db_major, db_minor)
681
682 # if ( (not db_ver_inc_map.has_key(db_ver)) and
683 # (db_ver <= max_db_ver and db_ver >= min_db_ver) ):
684 # # save the include directory with the db.h version
685 # # (first occurrance only)
686 # db_ver_inc_map[db_ver] = d
687 # print "db.h: found", db_ver, "in", d
688 # else:
689 # # we already found a header for this library version
690 # if db_setup_debug: print "db.h: ignoring", d
691 # else:
692 # # ignore this header, it didn't contain a version number
693 # if db_setup_debug: print "db.h: unsupported version", db_ver, "in", d
694
695 # db_found_vers = db_ver_inc_map.keys()
696 # db_found_vers.sort()
697
698 # while db_found_vers:
699 # db_ver = db_found_vers.pop()
700 # db_incdir = db_ver_inc_map[db_ver]
701
702 # # check lib directories parallel to the location of the header
703 # db_dirs_to_check = [
704 # os.path.join(db_incdir, '..', 'lib64'),
705 # os.path.join(db_incdir, '..', 'lib'),
706 # os.path.join(db_incdir, '..', '..', 'lib64'),
707 # os.path.join(db_incdir, '..', '..', 'lib'),
708 # ]
709 # db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
710
711 # # Look for a version specific db-X.Y before an ambiguoius dbX
712 # # XXX should we -ever- look for a dbX name? Do any
713 # # systems really not name their library by version and
714 # # symlink to more general names?
715 # for dblib in (('db-%d.%d' % db_ver),
716 # ('db%d%d' % db_ver),
717 # ('db%d' % db_ver[0])):
718 # dblib_file = self.compiler.find_library_file(
719 # db_dirs_to_check + lib_dirs, dblib )
720 # if dblib_file:
721 # dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
722 # raise db_found
723 # else:
724 # if db_setup_debug: print "db lib: ", dblib, "not found"
725
726 #except db_found:
727 # print "db lib: using", db_ver, dblib
728 # if db_setup_debug: print "db: lib dir", dblib_dir, "inc dir", db_incdir
729 # db_incs = [db_incdir]
730 # dblibs = [dblib]
731 # # We add the runtime_library_dirs argument because the
732 # # BerkeleyDB lib we're linking against often isn't in the
733 # # system dynamic library search path. This is usually
734 # # correct and most trouble free, but may cause problems in
735 # # some unusual system configurations (e.g. the directory
736 # # is on an NFS server that goes away).
737 # exts.append(Extension('_bsddb', ['_bsddb.c'],
738 # library_dirs=dblib_dir,
739 # runtime_library_dirs=dblib_dir,
740 # include_dirs=db_incs,
741 # libraries=dblibs))
742 #else:
743 # if db_setup_debug: print "db: no appropriate library found"
744 # db_incs = None
745 # dblibs = []
746 # dblib_dir = None
747
748 # The sqlite interface
749 sqlite_setup_debug = True # verbose debug prints from this script?
750
751 # We hunt for #define SQLITE_VERSION "n.n.n"
752 # We need to find >= sqlite version 3.0.8
753 sqlite_incdir = sqlite_libdir = None
754 sqlite_inc_paths = [ '/usr/include',
755 '/usr/include/sqlite',
756 '/usr/include/sqlite3',
757 '/usr/local/include',
758 '/usr/local/include/sqlite',
759 '/usr/local/include/sqlite3',
760 ]
761 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
762 MIN_SQLITE_VERSION = ".".join([str(x)
763 for x in MIN_SQLITE_VERSION_NUMBER])
764
765 # Scan the default include directories before the SQLite specific
766 # ones. This allows one to override the copy of sqlite on OSX,
767 # where /usr/include contains an old version of sqlite.
768 #for d in inc_dirs + sqlite_inc_paths:
769 for d in ['/usr/local/arm/3.3.2/include']:
770 f = os.path.join(d, "sqlite3.h")
771 if os.path.exists(f):
772 if sqlite_setup_debug: print "sqlite: found %s"%f
773 incf = open(f).read()
774 m = re.search(
775 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
776 if m:
777 sqlite_version = m.group(1)
778 sqlite_version_tuple = tuple([int(x)
779 for x in sqlite_version.split(".")])
780 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
781 # we win!
782 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
783 sqlite_incdir = d
784 break
785 else:
786 if sqlite_setup_debug:
787 print "%s: version %d is too old, need >= %s"%(d,
788 sqlite_version, MIN_SQLITE_VERSION)
789 elif sqlite_setup_debug:
790 print "sqlite: %s had no SQLITE_VERSION"%(f,)
791
792 if sqlite_incdir:
793 sqlite_dirs_to_check = [
794 os.path.join(sqlite_incdir, '..', 'lib64'),
795 os.path.join(sqlite_incdir, '..', 'lib'),
796 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
797 os.path.join(sqlite_incdir, '..', '..', 'lib'),
798 ]
799 sqlite_libfile = self.compiler.find_library_file(
800 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
801 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
802
803 if sqlite_incdir and sqlite_libdir:
804 sqlite_srcs = ['_sqlite/cache.c',
805 '_sqlite/connection.c',
806 '_sqlite/cursor.c',
807 '_sqlite/microprotocols.c',
808 '_sqlite/module.c',
809 '_sqlite/prepare_protocol.c',
810 '_sqlite/row.c',
811 '_sqlite/statement.c',
812 '_sqlite/util.c', ]
813
814 sqlite_defines = []
815 if sys.platform != "win32":
816 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
817 else:
818 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
819
820
821 if sys.platform == 'darwin':
822 # In every directory on the search path search for a dynamic
823 # library and then a static library, instead of first looking
824 # for dynamic libraries on the entiry path.
825 # This way a staticly linked custom sqlite gets picked up
826 # before the dynamic library in /usr/lib.
827 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
828 else:
829 sqlite_extra_link_args = ()
830
831 exts.append(Extension('_sqlite3', sqlite_srcs,
832 define_macros=sqlite_defines,
833 include_dirs=["Modules/_sqlite",
834 sqlite_incdir],
835 library_dirs=sqlite_libdir,
836 runtime_library_dirs=sqlite_libdir,
837 extra_link_args=sqlite_extra_link_args,
838 libraries=["sqlite3",]))
839
840 # Look for Berkeley db 1.85. Note that it is built as a different
841 # module name so it can be included even when later versions are
842 # available. A very restrictive search is performed to avoid
843 # accidentally building this module with a later version of the
844 # underlying db library. May BSD-ish Unixes incorporate db 1.85
845 # symbols into libc and place the include file in /usr/include.
846 #f = "/usr/include/db.h"
847 #if os.path.exists(f):
848 # data = open(f).read()
849 # m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
850 # if m is not None:
851 # # bingo - old version used hash file format version 2
852 # ### XXX this should be fixed to not be platform-dependent
853 # ### but I don't have direct access to an osf1 platform and
854 # ### seemed to be muffing the search somehow
855 # libraries = platform == "osf1" and ['db'] or None
856 # if libraries is not None:
857 # exts.append(Extension('bsddb185', ['bsddbmodule.c'],
858 # libraries=libraries))
859 # else:
860 # exts.append(Extension('bsddb185', ['bsddbmodule.c']))
861
862 # The standard Unix dbm module:
863 #if platform not in ['cygwin']:
864 # if find_file("ndbm.h", inc_dirs, []) is not None:
865 # # Some systems have -lndbm, others don't
866 # if self.compiler.find_library_file(lib_dirs, 'ndbm'):
867 # ndbm_libs = ['ndbm']
868 # else:
869 # ndbm_libs = []
870 # exts.append( Extension('dbm', ['dbmmodule.c'],
871 # define_macros=[('HAVE_NDBM_H',None)],
872 # libraries = ndbm_libs ) )
873 # elif (self.compiler.find_library_file(lib_dirs, 'gdbm')
874 # and find_file("gdbm/ndbm.h", inc_dirs, []) is not None):
875 # exts.append( Extension('dbm', ['dbmmodule.c'],
876 # define_macros=[('HAVE_GDBM_NDBM_H',None)],
877 # libraries = ['gdbm'] ) )
878 # elif db_incs is not None:
879 # exts.append( Extension('dbm', ['dbmmodule.c'],
880 # library_dirs=dblib_dir,
881 # runtime_library_dirs=dblib_dir,
882 # include_dirs=db_incs,
883 # define_macros=[('HAVE_BERKDB_H',None),
884 # ('DB_DBM_HSEARCH',None)],
885 # libraries=dblibs))
886
887 ## Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
888 #if (self.compiler.find_library_file(lib_dirs, 'gdbm')):
889 # exts.append( Extension('gdbm', ['gdbmmodule.c'],
890 # libraries = ['gdbm'] ) )
891
892 # Unix-only modules
893 #if platform not in ['mac', 'win32']:
894 # # Steen Lumholt's termios module
895 # exts.append( Extension('termios', ['termios.c']) )
896 # # Jeremy Hylton's rlimit interface
897 # if platform not in ['atheos']:
898 # exts.append( Extension('resource', ['resource.c']) )
899
900 # # Sun yellow pages. Some systems have the functions in libc.
901 # if platform not in ['cygwin', 'atheos']:
902 # if (self.compiler.find_library_file(lib_dirs, 'nsl')):
903 # libs = ['nsl']
904 # else:
905 # libs = []
906 # exts.append( Extension('nis', ['nismodule.c'],
907 # libraries = libs) )
908
909 # Curses support, requiring the System V version of curses, often
910 # provided by the ncurses library.
911 #panel_library = 'panel'
912 #if (self.compiler.find_library_file(lib_dirs, 'ncursesw')):
913 # curses_libs = ['ncursesw']
914 # # Bug 1464056: If _curses.so links with ncursesw,
915 # # _curses_panel.so must link with panelw.
916 # panel_library = 'panelw'
917 # exts.append( Extension('_curses', ['_cursesmodule.c'],
918 # libraries = curses_libs) )
919 #elif (self.compiler.find_library_file(lib_dirs, 'ncurses')):
920 # curses_libs = ['ncurses']
921 # exts.append( Extension('_curses', ['_cursesmodule.c'],
922 # libraries = curses_libs) )
923 #elif (self.compiler.find_library_file(lib_dirs, 'curses')
924 # and platform != 'darwin'):
925 # # OSX has an old Berkeley curses, not good enough for
926 # # the _curses module.
927 # if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
928 # curses_libs = ['curses', 'terminfo']
929 # elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
930 # curses_libs = ['curses', 'termcap']
931 # else:
932 # curses_libs = ['curses']
933
934 # exts.append( Extension('_curses', ['_cursesmodule.c'],
935 # libraries = curses_libs) )
936
937 ## If the curses module is enabled, check for the panel module
938 #if (module_enabled(exts, '_curses') and
939 # self.compiler.find_library_file(lib_dirs, panel_library)):
940 # exts.append( Extension('_curses_panel', ['_curses_panel.c'],
941 # libraries = [panel_library] + curses_libs) )
942
943
944 # Andrew Kuchling's zlib module. Note that some versions of zlib
945 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
946 # http://www.cert.org/advisories/CA-2002-07.html
947 #
948 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
949 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
950 # now, we still accept 1.1.3, because we think it's difficult to
951 # exploit this in Python, and we'd rather make it RedHat's problem
952 # than our problem <wink>.
953 #
954 # You can upgrade zlib to version 1.1.4 yourself by going to
955 # http://www.gzip.org/zlib/
956 zlib_inc = find_file('zlib.h', [], inc_dirs)
957 if zlib_inc is not None:
958 zlib_h = zlib_inc[0] + '/zlib.h'
959 version = '"0.0.0"'
960 version_req = '"1.1.3"'
961 fp = open(zlib_h)
962 while 1:
963 line = fp.readline()
964 if not line:
965 break
966 if line.startswith('#define ZLIB_VERSION'):
967 version = line.split()[2]
968 break
969 if version >= version_req:
970 if (self.compiler.find_library_file(lib_dirs, 'z')):
971 if sys.platform == "darwin":
972 zlib_extra_link_args = ('-Wl,-search_paths_first',)
973 else:
974 zlib_extra_link_args = ()
975 exts.append( Extension('zlib', ['zlibmodule.c'],
976 libraries = ['z'],
977 extra_link_args = zlib_extra_link_args))
978
979 # Gustavo Niemeyer's bz2 module.
980 #if (self.compiler.find_library_file(lib_dirs, 'bz2')):
981 # if sys.platform == "darwin":
982 # bz2_extra_link_args = ('-Wl,-search_paths_first',)
983 # else:
984 # bz2_extra_link_args = ()
985 # exts.append( Extension('bz2', ['bz2module.c'],
986 # libraries = ['bz2'],
987 # extra_link_args = bz2_extra_link_args) )
988
989 # Interface to the Expat XML parser
990 #
991 # Expat was written by James Clark and is now maintained by a
992 # group of developers on SourceForge; see www.libexpat.org for
993 # more information. The pyexpat module was written by Paul
994 # Prescod after a prototype by Jack Jansen. The Expat source
995 # is included in Modules/expat/. Usage of a system
996 # shared libexpat.so/expat.dll is not advised.
997 #
998 # More information on Expat can be found at www.libexpat.org.
999 #
1000 expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')
1001 define_macros = [
1002 ('HAVE_EXPAT_CONFIG_H', '1'),
1003 ]
1004
1005 exts.append(Extension('pyexpat',
1006 define_macros = define_macros,
1007 include_dirs = [expatinc],
1008 sources = ['pyexpat.c',
1009 'expat/xmlparse.c',
1010 'expat/xmlrole.c',
1011 'expat/xmltok.c',
1012 ],
1013 ))
1014
1015 # Fredrik Lundh's cElementTree module. Note that this also
1016 # uses expat (via the CAPI hook in pyexpat).
1017
1018 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
1019 define_macros.append(('USE_PYEXPAT_CAPI', None))
1020 exts.append(Extension('_elementtree',
1021 define_macros = define_macros,
1022 include_dirs = [expatinc],
1023 sources = ['_elementtree.c'],
1024 ))
1025
1026 # Hye-Shik Chang's CJKCodecs modules.
1027 if have_unicode:
1028 exts.append(Extension('_multibytecodec',
1029 ['cjkcodecs/multibytecodec.c']))
1030 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1031 exts.append(Extension('_codecs_' + loc,
1032 ['cjkcodecs/_codecs_%s.c' % loc]))
1033
1034 # Dynamic loading module
1035 if sys.maxint == 0x7fffffff:
1036 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1037 dl_inc = find_file('dlfcn.h', [], inc_dirs)
1038 if (dl_inc is not None) and (platform not in ['atheos']):
1039 exts.append( Extension('dl', ['dlmodule.c']) )
1040
1041 # Thomas Heller's _ctypes module
1042 #self.detect_ctypes(inc_dirs, lib_dirs)
1043
1044 # Platform-specific libraries
1045 #if platform == 'linux2':
1046 # # Linux-specific modules
1047 # exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
1048
1049 #if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1050 # 'freebsd7'):
1051 # exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
1052
1053 if platform == 'sunos5':
1054 # SunOS specific modules
1055 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
1056
1057 if platform == 'darwin' and ("--disable-toolbox-glue" not in
1058 sysconfig.get_config_var("CONFIG_ARGS")):
1059
1060 if os.uname()[2] > '8.':
1061 # We're on Mac OS X 10.4 or later, the compiler should
1062 # support '-Wno-deprecated-declarations'. This will
1063 # surpress deprecation warnings for the Carbon extensions,
1064 # these extensions wrap the Carbon APIs and even those
1065 # parts that are deprecated.
1066 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1067 else:
1068 carbon_extra_compile_args = []
1069
1070 # Mac OS X specific modules.
1071 def macSrcExists(name1, name2=''):
1072 if not name1:
1073 return None
1074 names = (name1,)
1075 if name2:
1076 names = (name1, name2)
1077 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1078 return os.path.exists(path)
1079
1080 def addMacExtension(name, kwds, extra_srcs=[]):
1081 dirname = ''
1082 if name[0] == '_':
1083 dirname = name[1:].lower()
1084 cname = name + '.c'
1085 cmodulename = name + 'module.c'
1086 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1087 if macSrcExists(cname):
1088 srcs = [cname]
1089 elif macSrcExists(cmodulename):
1090 srcs = [cmodulename]
1091 elif macSrcExists(dirname, cname):
1092 # XXX(nnorwitz): If all the names ended with module, we
1093 # wouldn't need this condition. ibcarbon is the only one.
1094 srcs = [os.path.join(dirname, cname)]
1095 elif macSrcExists(dirname, cmodulename):
1096 srcs = [os.path.join(dirname, cmodulename)]
1097 else:
1098 raise RuntimeError("%s not found" % name)
1099
1100 # Here's the whole point: add the extension with sources
1101 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1102
1103 # Core Foundation
1104 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1105 'extra_link_args': ['-framework', 'CoreFoundation'],
1106 }
1107 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1108 addMacExtension('autoGIL', core_kwds)
1109
1110 # Carbon
1111 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1112 'extra_link_args': ['-framework', 'Carbon'],
1113 }
1114 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1115 'OSATerminology', 'icglue',
1116 # All these are in subdirs
1117 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
1118 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
1119 '_Help', '_Icn', '_IBCarbon', '_List',
1120 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
1121 '_Scrap', '_Snd', '_TE', '_Win',
1122 ]
1123 for name in CARBON_EXTS:
1124 addMacExtension(name, carbon_kwds)
1125
1126 # Application Services & QuickTime
1127 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1128 'extra_link_args': ['-framework','ApplicationServices'],
1129 }
1130 addMacExtension('_Launch', app_kwds)
1131 addMacExtension('_CG', app_kwds)
1132
1133 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
1134 extra_compile_args=carbon_extra_compile_args,
1135 extra_link_args=['-framework', 'QuickTime',
1136 '-framework', 'Carbon']) )
1137
1138
1139 self.extensions.extend(exts)
1140
1141 # Call the method for detecting whether _tkinter can be compiled
1142 #self.detect_tkinter(inc_dirs, lib_dirs)
1143
1144 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1145 # The _tkinter module, using frameworks. Since frameworks are quite
1146 # different the UNIX search logic is not sharable.
1147 from os.path import join, exists
1148 framework_dirs = [
1149 '/System/Library/Frameworks/',
1150 '/Library/Frameworks',
1151 join(os.getenv('HOME'), '/Library/Frameworks')
1152 ]
1153
1154 # Find the directory that contains the Tcl.framework and Tk.framework
1155 # bundles.
1156 # XXX distutils should support -F!
1157 for F in framework_dirs:
1158 # both Tcl.framework and Tk.framework should be present
1159 for fw in 'Tcl', 'Tk':
1160 if not exists(join(F, fw + '.framework')):
1161 break
1162 else:
1163 # ok, F is now directory with both frameworks. Continure
1164 # building
1165 break
1166 else:
1167 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1168 # will now resume.
1169 return 0
1170
1171 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1172 # frameworks. In later release we should hopefully be able to pass
1173 # the -F option to gcc, which specifies a framework lookup path.
1174 #
1175 include_dirs = [
1176 join(F, fw + '.framework', H)
1177 for fw in 'Tcl', 'Tk'
1178 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1179 ]
1180
1181 # For 8.4a2, the X11 headers are not included. Rather than include a
1182 # complicated search, this is a hard-coded path. It could bail out
1183 # if X11 libs are not found...
1184 include_dirs.append('/usr/X11R6/include')
1185 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1186
1187 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1188 define_macros=[('WITH_APPINIT', 1)],
1189 include_dirs = include_dirs,
1190 libraries = [],
1191 extra_compile_args = frameworks,
1192 extra_link_args = frameworks,
1193 )
1194 self.extensions.append(ext)
1195 return 1
1196
1197
1198 def detect_tkinter(self, inc_dirs, lib_dirs):
1199 # The _tkinter module.
1200
1201 # Rather than complicate the code below, detecting and building
1202 # AquaTk is a separate method. Only one Tkinter will be built on
1203 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1204 platform = self.get_platform()
1205 if (platform == 'darwin' and
1206 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
1207 return
1208
1209 # Assume we haven't found any of the libraries or include files
1210 # The versions with dots are used on Unix, and the versions without
1211 # dots on Windows, for detection by cygwin.
1212 tcllib = tklib = tcl_includes = tk_includes = None
1213 for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2',
1214 '82', '8.1', '81', '8.0', '80']:
1215 tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version)
1216 tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version)
1217 if tklib and tcllib:
1218 # Exit the loop when we've found the Tcl/Tk libraries
1219 break
1220
1221 # Now check for the header files
1222 if tklib and tcllib:
1223 # Check for the include files on Debian and {Free,Open}BSD, where
1224 # they're put in /usr/include/{tcl,tk}X.Y
1225 dotversion = version
1226 if '.' not in dotversion and "bsd" in sys.platform.lower():
1227 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1228 # but the include subdirs are named like .../include/tcl8.3.
1229 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1230 tcl_include_sub = []
1231 tk_include_sub = []
1232 for dir in inc_dirs:
1233 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1234 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1235 tk_include_sub += tcl_include_sub
1236 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1237 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
1238
1239 if (tcllib is None or tklib is None or
1240 tcl_includes is None or tk_includes is None):
1241 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
1242 return
1243
1244 # OK... everything seems to be present for Tcl/Tk.
1245
1246 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1247 for dir in tcl_includes + tk_includes:
1248 if dir not in include_dirs:
1249 include_dirs.append(dir)
1250
1251 # Check for various platform-specific directories
1252 if platform == 'sunos5':
1253 include_dirs.append('/usr/openwin/include')
1254 added_lib_dirs.append('/usr/openwin/lib')
1255 elif os.path.exists('/usr/X11R6/include'):
1256 include_dirs.append('/usr/X11R6/include')
1257 added_lib_dirs.append('/usr/X11R6/lib64')
1258 added_lib_dirs.append('/usr/X11R6/lib')
1259 elif os.path.exists('/usr/X11R5/include'):
1260 include_dirs.append('/usr/X11R5/include')
1261 added_lib_dirs.append('/usr/X11R5/lib')
1262 else:
1263 # Assume default location for X11
1264 include_dirs.append('/usr/X11/include')
1265 added_lib_dirs.append('/usr/X11/lib')
1266
1267 # If Cygwin, then verify that X is installed before proceeding
1268 if platform == 'cygwin':
1269 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1270 if x11_inc is None:
1271 return
1272
1273 # Check for BLT extension
1274 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1275 'BLT8.0'):
1276 defs.append( ('WITH_BLT', 1) )
1277 libs.append('BLT8.0')
1278 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1279 'BLT'):
1280 defs.append( ('WITH_BLT', 1) )
1281 libs.append('BLT')
1282
1283 # Add the Tcl/Tk libraries
1284 libs.append('tk'+ version)
1285 libs.append('tcl'+ version)
1286
1287 if platform in ['aix3', 'aix4']:
1288 libs.append('ld')
1289
1290 # Finally, link with the X11 libraries (not appropriate on cygwin)
1291 if platform != "cygwin":
1292 libs.append('X11')
1293
1294 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1295 define_macros=[('WITH_APPINIT', 1)] + defs,
1296 include_dirs = include_dirs,
1297 libraries = libs,
1298 library_dirs = added_lib_dirs,
1299 )
1300 self.extensions.append(ext)
1301
1302 ## # Uncomment these lines if you want to play with xxmodule.c
1303 ## ext = Extension('xx', ['xxmodule.c'])
1304 ## self.extensions.append(ext)
1305
1306 # XXX handle these, but how to detect?
1307 # *** Uncomment and edit for PIL (TkImaging) extension only:
1308 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
1309 # *** Uncomment and edit for TOGL extension only:
1310 # -DWITH_TOGL togl.c \
1311 # *** Uncomment these for TOGL extension only:
1312 # -lGL -lGLU -lXext -lXmu \
1313
1314 def configure_ctypes(self, ext):
1315 if not self.use_system_libffi:
1316 (srcdir,) = sysconfig.get_config_vars('srcdir')
1317 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1318 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1319 '_ctypes', 'libffi'))
1320 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
1321
1322 from distutils.dep_util import newer_group
1323
1324 config_sources = [os.path.join(ffi_srcdir, fname)
1325 for fname in os.listdir(ffi_srcdir)
1326 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
1327 if self.force or newer_group(config_sources,
1328 ffi_configfile):
1329 from distutils.dir_util import mkpath
1330 mkpath(ffi_builddir)
1331 config_args = []
1332
1333 # Pass empty CFLAGS because we'll just append the resulting
1334 # CFLAGS to Python's; -g or -O2 is to be avoided.
1335 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1336 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
1337
1338 res = os.system(cmd)
1339 if res or not os.path.exists(ffi_configfile):
1340 print "Failed to configure _ctypes module"
1341 return False
1342
1343 fficonfig = {}
1344 execfile(ffi_configfile, globals(), fficonfig)
1345 ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src')
1346
1347 # Add .S (preprocessed assembly) to C compiler source extensions.
1348 self.compiler.src_extensions.append('.S')
1349
1350 include_dirs = [os.path.join(ffi_builddir, 'include'),
1351 ffi_builddir, ffi_srcdir]
1352 extra_compile_args = fficonfig['ffi_cflags'].split()
1353
1354 ext.sources.extend(fficonfig['ffi_sources'])
1355 ext.include_dirs.extend(include_dirs)
1356 ext.extra_compile_args.extend(extra_compile_args)
1357 return True
1358
1359 def detect_ctypes(self, inc_dirs, lib_dirs):
1360 self.use_system_libffi = False
1361 include_dirs = []
1362 extra_compile_args = []
1363 extra_link_args = []
1364 sources = ['_ctypes/_ctypes.c',
1365 '_ctypes/callbacks.c',
1366 '_ctypes/callproc.c',
1367 '_ctypes/stgdict.c',
1368 '_ctypes/cfield.c',
1369 '_ctypes/malloc_closure.c']
1370 depends = ['_ctypes/ctypes.h']
1371
1372 if sys.platform == 'darwin':
1373 sources.append('_ctypes/darwin/dlfcn_simple.c')
1374 include_dirs.append('_ctypes/darwin')
1375 # XXX Is this still needed?
1376 ## extra_link_args.extend(['-read_only_relocs', 'warning'])
1377
1378 elif sys.platform == 'sunos5':
1379 # XXX This shouldn't be necessary; it appears that some
1380 # of the assembler code is non-PIC (i.e. it has relocations
1381 # when it shouldn't. The proper fix would be to rewrite
1382 # the assembler code to be PIC.
1383 # This only works with GCC; the Sun compiler likely refuses
1384 # this option. If you want to compile ctypes with the Sun
1385 # compiler, please research a proper solution, instead of
1386 # finding some -z option for the Sun compiler.
1387 extra_link_args.append('-mimpure-text')
1388
1389 ext = Extension('_ctypes',
1390 include_dirs=include_dirs,
1391 extra_compile_args=extra_compile_args,
1392 extra_link_args=extra_link_args,
1393 libraries=[],
1394 sources=sources,
1395 depends=depends)
1396 ext_test = Extension('_ctypes_test',
1397 sources=['_ctypes/_ctypes_test.c'])
1398 self.extensions.extend([ext, ext_test])
1399
1400 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1401 return
1402
1403 ffi_inc = find_file('ffi.h', [], inc_dirs)
1404 if ffi_inc is not None:
1405 ffi_h = ffi_inc[0] + '/ffi.h'
1406 fp = open(ffi_h)
1407 while 1:
1408 line = fp.readline()
1409 if not line:
1410 ffi_inc = None
1411 break
1412 if line.startswith('#define LIBFFI_H'):
1413 break
1414 ffi_lib = None
1415 if ffi_inc is not None:
1416 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
1417 if (self.compiler.find_library_file(lib_dirs, lib_name)):
1418 ffi_lib = lib_name
1419 break
1420
1421 if ffi_inc and ffi_lib:
1422 ext.include_dirs.extend(ffi_inc)
1423 ext.libraries.append(ffi_lib)
1424 self.use_system_libffi = True
1425
1426
1427 class PyBuildInstall(install):
1428 # Suppress the warning about installation into the lib_dynload
1429 # directory, which is not in sys.path when running Python during
1430 # installation:
1431 def initialize_options (self):
1432 install.initialize_options(self)
1433 self.warn_dir=0
1434
1435 class PyBuildInstallLib(install_lib):
1436 # Do exactly what install_lib does but make sure correct access modes get
1437 # set on installed directories and files. All installed files with get
1438 # mode 644 unless they are a shared library in which case they will get
1439 # mode 755. All installed directories will get mode 755.
1440
1441 so_ext = sysconfig.get_config_var("SO")
1442
1443 def install(self):
1444 outfiles = install_lib.install(self)
1445 self.set_file_modes(outfiles, 0644, 0755)
1446 self.set_dir_modes(self.install_dir, 0755)
1447 return outfiles
1448
1449 def set_file_modes(self, files, defaultMode, sharedLibMode):
1450 if not self.is_chmod_supported(): return
1451 if not files: return
1452
1453 for filename in files:
1454 if os.path.islink(filename): continue
1455 mode = defaultMode
1456 if filename.endswith(self.so_ext): mode = sharedLibMode
1457 log.info("changing mode of %s to %o", filename, mode)
1458 if not self.dry_run: os.chmod(filename, mode)
1459
1460 def set_dir_modes(self, dirname, mode):
1461 if not self.is_chmod_supported(): return
1462 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
1463
1464 def set_dir_modes_visitor(self, mode, dirname, names):
1465 if os.path.islink(dirname): return
1466 log.info("changing mode of %s to %o", dirname, mode)
1467 if not self.dry_run: os.chmod(dirname, mode)
1468
1469 def is_chmod_supported(self):
1470 return hasattr(os, 'chmod')
1471
1472 SUMMARY = """
1473 Python is an interpreted, interactive, object-oriented programming
1474 language. It is often compared to Tcl, Perl, Scheme or Java.
1475
1476 Python combines remarkable power with very clear syntax. It has
1477 modules, classes, exceptions, very high level dynamic data types, and
1478 dynamic typing. There are interfaces to many system calls and
1479 libraries, as well as to various windowing systems (X11, Motif, Tk,
1480 Mac, MFC). New built-in modules are easily written in C or C++. Python
1481 is also usable as an extension language for applications that need a
1482 programmable interface.
1483
1484 The Python implementation is portable: it runs on many brands of UNIX,
1485 on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
1486 listed here, it may still be supported, if there's a C compiler for
1487 it. Ask around on comp.lang.python -- or just try compiling Python
1488 yourself.
1489 """
1490
1491 CLASSIFIERS = """
1492 Development Status :: 3 - Alpha
1493 Development Status :: 6 - Mature
1494 License :: OSI Approved :: Python Software Foundation License
1495 Natural Language :: English
1496 Programming Language :: C
1497 Programming Language :: Python
1498 Topic :: Software Development
1499 """
1500
1501 def main():
1502 # turn off warnings when deprecated modules are imported
1503 import warnings
1504 warnings.filterwarnings("ignore",category=DeprecationWarning)
1505 setup(# PyPI Metadata (PEP 301)
1506 name = "Python",
1507 version = sys.version.split()[0],
1508 url = "http://www.python.org/%s" % sys.version[:3],
1509 maintainer = "Guido van Rossum and the Python community",
1510 maintainer_email = "[email protected]",
1511 description = "A high-level object-oriented programming language",
1512 long_description = SUMMARY.strip(),
1513 license = "PSF license",
1514 classifiers = filter(None, CLASSIFIERS.split("\n")),
1515 platforms = ["Many"],
1516
1517 # Build info
1518 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
1519 'install_lib':PyBuildInstallLib},
1520 # The struct module is defined here, because build_ext won't be
1521 # called unless there's at least one extension module defined.
1522 ext_modules=[Extension('_struct', ['_struct.c'])],
1523
1524 # Scripts to install
1525 #scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
1526 # 'Lib/smtpd.py']
1527 scripts = []
1528 )
1529
1530 # --install-platlib
1531 if __name__ == '__main__':
1532 main()
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.