blob: 28092e5b3e36a5769d8d89428159517323943ae9 [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:581# Autodetecting setup.py script for building the Python extensions
2#
Fredrik Lundhade711a2001-01-24 08:00:283
Andrew M. Kuchling66012fe2001-01-26 21:56:584__version__ = "$Revision$"
5
Martin v. Löwis05d4d562002-12-06 10:25:026import sys, os, getopt, imp, re
Michael W. Hudson529a5052002-12-17 16:47:177
8from distutils import log
Andrew M. Kuchling00e0f212001-01-17 15:23:239from distutils import sysconfig
Andrew M. Kuchling8d7f0862001-02-23 16:32:3210from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:2411from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:2312from distutils.core import Extension, setup
13from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:2714from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:1715from distutils.command.install_lib import install_lib
Andrew M. Kuchling00e0f212001-01-17 15:23:2316
17# This global variable is used to hold the list of modules to be disabled.
18disabled_module_list = []
19
Michael W. Hudson39230b32002-01-16 15:26:4820def 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."""
Jack Jansen4439b7c2002-06-26 15:44:3024 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
Michael W. Hudson39230b32002-01-16 15:26:4825 dirlist.insert(0, dir)
26
Andrew M. Kuchlingfbe73762001-01-18 18:44:2027def 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.
Fredrik Lundhade711a2001-01-24 08:00:2831
Andrew M. Kuchlingfbe73762001-01-18 18:44:2032 '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
Andrew M. Kuchling00e0f212001-01-17 15:23:2351 return None
52
Andrew M. Kuchlingfbe73762001-01-18 18:44:2053def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:4654 result = compiler.find_library_file(std_dirs + paths, libname)
55 if result is None:
56 return None
Fredrik Lundhade711a2001-01-24 08:00:2857
Andrew M. Kuchlinga246d9f2002-11-27 13:43:4658 # 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
Skip Montanaro9f5178a2003-05-06 20:59:5762 p = p.rstrip(os.sep)
Andrew M. Kuchlinga246d9f2002-11-27 13:43:4663 if p == dirname:
64 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:2065
Andrew M. Kuchlinga246d9f2002-11-27 13:43:4666 # 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
Skip Montanaro9f5178a2003-05-06 20:59:5770 p = p.rstrip(os.sep)
Andrew M. Kuchlinga246d9f2002-11-27 13:43:4671 if p == dirname:
72 return [p]
73 else:
74 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:4375
Andrew M. Kuchling00e0f212001-01-17 15:23:2376def 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)
Fredrik Lundhade711a2001-01-24 08:00:2881
Jack Jansen144ebcc2001-08-05 22:31:1982def 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:
Guido van Rossum12471d62003-02-20 02:11:4389 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:1990 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:4191
Andrew M. Kuchling00e0f212001-01-17 15:23:2392class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:2893
Andrew M. Kuchling00e0f212001-01-17 15:23:2394 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:2395
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]
Fredrik Lundhade711a2001-01-24 08:00:28102
Andrew M. Kuchling00e0f212001-01-17 15:23:23103 # 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')
Guido van Rossume0fea6c2002-10-14 20:48:09106 if not srcdir:
107 # Maybe running on Windows but not using CYGWIN?
108 raise ValueError("No source directory; cannot proceed.")
Andrew M. Kuchling00e0f212001-01-17 15:23:23109
Neil Schemenauer726b78e2001-01-24 17:18:21110 # Figure out the location of the source code for extension modules
111 moddir = os.path.join(os.getcwd(), srcdir, 'Modules')
Andrew M. Kuchling00e0f212001-01-17 15:23:23112 moddir = os.path.normpath(moddir)
113 srcdir, tail = os.path.split(moddir)
114 srcdir = os.path.normpath(srcdir)
115 moddir = os.path.normpath(moddir)
Michael W. Hudson5b109102002-01-23 15:04:41116
Jack Jansen144ebcc2001-08-05 22:31:19117 moddirlist = [moddir]
118 incdirlist = ['./Include']
Michael W. Hudson5b109102002-01-23 15:04:41119
Jack Jansen144ebcc2001-08-05 22:31:19120 # Platform-dependent module source and include directories
121 platform = self.get_platform()
Tim Peters66cb0182004-08-26 05:23:19122 if platform in ('darwin', 'mac') and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07123 sysconfig.get_config_var("CONFIG_ARGS")):
Jack Jansen144ebcc2001-08-05 22:31:19124 # 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')
Andrew M. Kuchling00e0f212001-01-17 15:23:23128
Jeremy Hylton340043e2002-06-13 17:38:11129 alldirlist = moddirlist + incdirlist
130
Andrew M. Kuchling3da989c2001-02-28 22:49:26131 # Fix up the paths for scripts, too
132 self.distribution.scripts = [os.path.join(srcdir, filename)
133 for filename in self.distribution.scripts]
134
Andrew M. Kuchlingfbe73762001-01-18 18:44:20135 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19136 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23137 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11138 if ext.depends is not None:
139 ext.depends = [find_module_file(filename, alldirlist)
140 for filename in ext.depends]
Jack Jansen144ebcc2001-08-05 22:31:19141 ext.include_dirs.append( '.' ) # to get config.h
142 for incdir in incdirlist:
143 ext.include_dirs.append( os.path.join(srcdir, incdir) )
Andrew M. Kuchlingfbe73762001-01-18 18:44:20144
Andrew M. Kuchlinge7c87322001-01-19 16:58:21145 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20146 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21147 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20148 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34149
Jack Jansen4439b7c2002-06-26 15:44:30150 if platform != 'mac':
Georg Brandl20434722005-12-27 18:24:30151 # Parse Modules/Setup and Modules/Setup.local to figure out which
152 # modules are turned on in the file.
Jack Jansen4439b7c2002-06-26 15:44:30153 remove_modules = []
Georg Brandl20434722005-12-27 18:24:30154 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()
Tim Petersa6c0c202006-03-23 19:07:46162
Jack Jansen4439b7c2002-06-26 15:44:30163 for ext in self.extensions[:]:
164 if ext.name in remove_modules:
165 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41166
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34167 # 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')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34171 args = {}
172 # unfortunately, distutils doesn't let us provide separate C and C++
173 # compilers
174 if compiler is not None:
Skip Montanarodecc6a42003-01-01 20:07:49175 (ccshared,opt,base) = sysconfig.get_config_vars('CCSHARED','OPT','BASECFLAGS')
176 args['compiler_so'] = compiler + ' ' + opt + ' ' + ccshared + ' ' + base
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34177 self.compiler.set_executables(**args)
178
Andrew M. Kuchling00e0f212001-01-17 15:23:23179 build_ext.build_extensions(self)
180
Marc-André Lemburg7c6fcda2001-01-26 18:03:24181 def build_extension(self, ext):
182
183 try:
184 build_ext.build_extension(self, ext)
185 except (CCompilerError, DistutilsError), why:
186 self.announce('WARNING: building of extension "%s" failed: %s' %
187 (ext.name, sys.exc_info()[1]))
Andrew M. Kuchling62686692001-05-21 20:48:09188 return
Jack Jansenf49c6f92001-11-01 14:44:15189 # Workaround for Mac OS X: The Carbon-based modules cannot be
190 # reliably imported into a command-line Python
191 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41192 self.announce(
193 'WARNING: skipping import check for Carbon-based "%s"' %
194 ext.name)
195 return
Jason Tishler24cf7762002-05-22 16:46:15196 # Workaround for Cygwin: Cygwin currently has fork issues when many
197 # modules have been imported
198 if self.get_platform() == 'cygwin':
199 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
200 % ext.name)
201 return
Michael W. Hudsonaf142892002-01-23 15:07:46202 ext_filename = os.path.join(
203 self.build_lib,
204 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Andrew M. Kuchling62686692001-05-21 20:48:09205 try:
Michael W. Hudsonaf142892002-01-23 15:07:46206 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42207 except ImportError, why:
208 self.announce('*** WARNING: renaming "%s" since importing it'
209 ' failed: %s' % (ext.name, why), level=3)
210 assert not self.inplace
211 basename, tail = os.path.splitext(ext_filename)
212 newname = basename + "_failed" + tail
213 if os.path.exists(newname):
214 os.remove(newname)
215 os.rename(ext_filename, newname)
216
217 # XXX -- This relies on a Vile HACK in
218 # distutils.command.build_ext.build_extension(). The
219 # _built_objects attribute is stored there strictly for
220 # use here.
221 # If there is a failure, _built_objects may not be there,
222 # so catch the AttributeError and move on.
223 try:
224 for filename in self._built_objects:
225 os.remove(filename)
226 except AttributeError:
227 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39228 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39229 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42230 self.announce('*** WARNING: importing extension "%s" '
231 'failed with %s: %s' % (ext.name, exc_type, why),
232 level=3)
Fred Drake9028d0a2001-12-06 22:59:54233
Neal Norwitz51dead72003-06-17 02:51:28234 def get_platform(self):
Fredrik Lundhade711a2001-01-24 08:00:28235 # Get value of sys.platform
Neal Norwitz51dead72003-06-17 02:51:28236 for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
237 if sys.platform.startswith(platform):
238 return platform
239 return sys.platform
Andrew M. Kuchling34febf52001-01-24 03:31:07240
Andrew M. Kuchling00e0f212001-01-17 15:23:23241 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28242 # Ensure that /usr/local is always used
Michael W. Hudson39230b32002-01-16 15:26:48243 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
244 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
245
Brett Cannon35b93d92004-09-28 03:49:52246 # Add paths to popular package managers on OS X/darwin
Skip Montanarodecc6a42003-01-01 20:07:49247 if sys.platform == "darwin":
Brett Cannon35b93d92004-09-28 03:49:52248 # Fink installs into /sw by default
Skip Montanarodecc6a42003-01-01 20:07:49249 add_dir_to_list(self.compiler.library_dirs, '/sw/lib')
250 add_dir_to_list(self.compiler.include_dirs, '/sw/include')
Brett Cannon35b93d92004-09-28 03:49:52251 # DarwinPorts installs into /opt/local by default
Ronald Oussoren392cafb2006-10-08 17:41:25252 #add_dir_to_list(self.compiler.library_dirs, '/opt/local/lib')
253 #add_dir_to_list(self.compiler.include_dirs, '/opt/local/include')
Skip Montanarodecc6a42003-01-01 20:07:49254
Michael W. Hudson90b8e4d2002-08-02 13:55:50255 if os.path.normpath(sys.prefix) != '/usr':
256 add_dir_to_list(self.compiler.library_dirs,
257 sysconfig.get_config_var("LIBDIR"))
258 add_dir_to_list(self.compiler.include_dirs,
259 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20260
Martin v. Löwis339d0f72001-08-17 18:39:25261 try:
262 have_unicode = unicode
263 except NameError:
264 have_unicode = 0
265
Andrew M. Kuchlingfbe73762001-01-18 18:44:20266 # lib_dirs and inc_dirs are used to search for files;
267 # if a file is found in one of those directories, it can
268 # be assumed that no additional -I,-L directives are needed.
Martin v. Löwisfba73692004-11-13 11:13:35269 lib_dirs = self.compiler.library_dirs + [
270 '/lib64', '/usr/lib64',
271 '/lib', '/usr/lib',
272 ]
Michael W. Hudson5b109102002-01-23 15:04:41273 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23274 exts = []
275
Fredrik Lundhade711a2001-01-24 08:00:28276 platform = self.get_platform()
Martin v. Löwis83012562002-02-14 01:25:37277 (srcdir,) = sysconfig.get_config_vars('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41278
Martin v. Löwisf90ae202002-06-11 06:22:31279 # Check for AtheOS which has libraries in non-standard locations
280 if platform == 'atheos':
281 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
282 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
283 inc_dirs += ['/system/include', '/atheos/autolnk/include']
284 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
285
Andrew M. Kuchling7883dc82003-10-24 18:26:26286 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
287 if platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34288 lib_dirs += ['/usr/ccs/lib']
289
Ronald Oussoren392cafb2006-10-08 17:41:25290 if platform == 'darwin':
291 # This should work on any unixy platform ;-)
292 # If the user has bothered specifying additional -I and -L flags
293 # in OPT and LDFLAGS we might as well use them here.
294 # NOTE: using shlex.split would technically be more correct, but
295 # also gives a bootstrap problem. Let's hope nobody uses directories
296 # with whitespace in the name to store libraries.
297 cflags, ldflags = sysconfig.get_config_vars(
298 'CFLAGS', 'LDFLAGS')
299 for item in cflags.split():
300 if item.startswith('-I'):
301 inc_dirs.append(item[2:])
302
303 for item in ldflags.split():
304 if item.startswith('-L'):
305 lib_dirs.append(item[2:])
306
Fredrik Lundhade711a2001-01-24 08:00:28307 # Check for MacOS X, which doesn't need libm.a at all
308 math_libs = ['m']
Jack Jansen4439b7c2002-06-26 15:44:30309 if platform in ['darwin', 'beos', 'mac']:
Fredrik Lundhade711a2001-01-24 08:00:28310 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41311
Andrew M. Kuchling00e0f212001-01-17 15:23:23312 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
313
314 #
315 # The following modules are all pretty straightforward, and compile
316 # on pretty much any POSIXish platform.
317 #
Fredrik Lundhade711a2001-01-24 08:00:28318
Andrew M. Kuchling00e0f212001-01-17 15:23:23319 # Some modules that are normally always on:
320 exts.append( Extension('regex', ['regexmodule.c', 'regexpr.c']) )
Fredrik Lundhade711a2001-01-24 08:00:28321
Fred Drake3a40f322001-10-12 21:00:48322 exts.append( Extension('_hotshot', ['_hotshot.c']) )
Fred Drake2de74712001-02-01 05:26:54323 exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23324
325 # array objects
326 exts.append( Extension('array', ['arraymodule.c']) )
327 # complex math library functions
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11328 exts.append( Extension('cmath', ['cmathmodule.c'],
329 libraries=math_libs) )
Fredrik Lundhade711a2001-01-24 08:00:28330
Andrew M. Kuchling00e0f212001-01-17 15:23:23331 # math library functions, e.g. sin()
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11332 exts.append( Extension('math', ['mathmodule.c'],
333 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23334 # fast string operations implemented in C
335 exts.append( Extension('strop', ['stropmodule.c']) )
336 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11337 exts.append( Extension('time', ['timemodule.c'],
338 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47339 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57340 libraries=math_libs) )
Raymond Hettinger40f62172002-12-29 23:03:38341 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43342 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger96ef8112003-02-01 00:10:11343 # fast iterator tools implemented in C
344 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52345 # high-performance collections
346 exts.append( Extension("collections", ["collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35347 # bisect
348 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38349 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21350 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23351 # operator.add() and similar goodies
352 exts.append( Extension('operator', ['operator.c']) )
Marc-André Lemburg261b8e22001-02-02 12:12:44353 # Python C API test module
Tim Petersd66595f2001-02-04 03:09:53354 exts.append( Extension('_testcapi', ['_testcapimodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23355 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25356 if have_unicode:
357 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23358 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05359 data = open('pyconfig.h').read()
360 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
361 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52362 locale_libs = ['intl']
363 else:
364 locale_libs = []
Jack Jansen84b74472004-07-15 19:56:25365 if platform == 'darwin':
366 locale_extra_link_args = ['-framework', 'CoreFoundation']
367 else:
368 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09369
Jack Jansen84b74472004-07-15 19:56:25370
Jason Tishlerd28216b2002-08-14 11:13:52371 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25372 libraries=locale_libs,
373 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23374
375 # Modules with some UNIX dependencies -- on by default:
376 # (If you have a really backward UNIX, select and socket may not be
377 # supported...)
378
379 # fcntl(2) and ioctl(2)
380 exts.append( Extension('fcntl', ['fcntlmodule.c']) )
Jack Jansen73aa1ff2002-06-27 22:06:49381 if platform not in ['mac']:
382 # pwd(3)
Tim Peters2c60f7a2003-01-29 03:49:43383 exts.append( Extension('pwd', ['pwdmodule.c']) )
384 # grp(3)
385 exts.append( Extension('grp', ['grpmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23386 # select(2); not on ancient System V
387 exts.append( Extension('select', ['selectmodule.c']) )
388
389 # The md5 module implements the RSA Data Security, Inc. MD5
Fred Drake38419c02001-12-06 22:24:47390 # Message-Digest Algorithm, described in RFC 1321. The
391 # necessary files md5c.c and md5.h are included here.
Andrew M. Kuchling00e0f212001-01-17 15:23:23392 exts.append( Extension('md5', ['md5module.c', 'md5c.c']) )
393
394 # The sha module implements the SHA checksum algorithm.
395 # (NIST's Secure Hash Algorithm.)
396 exts.append( Extension('sha', ['shamodule.c']) )
397
Andrew M. Kuchling00e0f212001-01-17 15:23:23398 # Helper module for various ascii-encoders
399 exts.append( Extension('binascii', ['binascii.c']) )
400
401 # Fred Drake's interface to the Python parser
402 exts.append( Extension('parser', ['parsermodule.c']) )
403
Guido van Rossum2e1c09c2002-04-04 17:52:50404 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23405 exts.append( Extension('cStringIO', ['cStringIO.c']) )
406 exts.append( Extension('cPickle', ['cPickle.c']) )
407
408 # Memory-mapped files (also works on Win32).
Jack Jansen73aa1ff2002-06-27 22:06:49409 if platform not in ['atheos', 'mac']:
Martin v. Löwisf90ae202002-06-11 06:22:31410 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23411
Andrew M. Kuchling57269d02004-08-31 13:37:25412 # Lance Ellinghaus's syslog module
Jack Jansen73aa1ff2002-06-27 22:06:49413 if platform not in ['mac']:
Tim Peters2c60f7a2003-01-29 03:49:43414 # syslog daemon interface
415 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23416
417 # George Neville-Neil's timing module:
418 exts.append( Extension('timing', ['timingmodule.c']) )
419
420 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34421 # Here ends the simple stuff. From here on, modules need certain
422 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23423 #
424
425 # Multimedia modules
426 # These don't work for 64-bit platforms!!!
427 # These represent audio samples or images as strings:
428
Neal Norwitz5e4a3b82004-07-19 16:55:07429 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10430 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20431 # 64-bit platforms.
432 exts.append( Extension('audioop', ['audioop.c']) )
433
Fredrik Lundhade711a2001-01-24 08:00:28434 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23435 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23436 # Operations on images
437 exts.append( Extension('imageop', ['imageop.c']) )
438 # Read SGI RGB image files (but coded portably)
439 exts.append( Extension('rgbimg', ['rgbimgmodule.c']) )
440
441 # readline
Marc-André Lemburg2efc3232001-01-26 18:23:02442 if self.compiler.find_library_file(lib_dirs, 'readline'):
443 readline_libs = ['readline']
Andrew M. Kuchling5aa3c4a2001-08-16 20:30:18444 if self.compiler.find_library_file(lib_dirs,
Martin v. Löwisbdba3b62006-02-11 15:55:22445 'ncursesw'):
446 readline_libs.append('ncursesw')
447 elif self.compiler.find_library_file(lib_dirs,
Andrew M. Kuchling5aa3c4a2001-08-16 20:30:18448 'ncurses'):
449 readline_libs.append('ncurses')
Neal Norwitz0b27ff92003-03-31 15:53:49450 elif self.compiler.find_library_file(lib_dirs, 'curses'):
451 readline_libs.append('curses')
Andrew M. Kuchling5aa3c4a2001-08-16 20:30:18452 elif self.compiler.find_library_file(lib_dirs +
Marc-André Lemburg2efc3232001-01-26 18:23:02453 ['/usr/lib/termcap'],
454 'termcap'):
455 readline_libs.append('termcap')
Ronald Oussoren392cafb2006-10-08 17:41:25456
457 if sys.platform == 'darwin':
458 # In every directory on the search path search for a dynamic
459 # library and then a static library, instead of first looking
460 # for dynamic libraries on the entiry path.
461 # This way a staticly linked custom readline gets picked up
462 # before the (broken) dynamic library in /usr/lib.
463 readline_extra_link_args = ('-Wl,-search_paths_first',)
464 else:
465 readline_extra_link_args = ()
466
Andrew M. Kuchling00e0f212001-01-17 15:23:23467 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24468 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren392cafb2006-10-08 17:41:25469 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02470 libraries=readline_libs) )
Jack Jansen73aa1ff2002-06-27 22:06:49471 if platform not in ['mac']:
Andrew M. Kuchling7883dc82003-10-24 18:26:26472 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43473
474 if self.compiler.find_library_file(lib_dirs, 'crypt'):
475 libs = ['crypt']
476 else:
477 libs = []
478 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23479
Skip Montanaroba9e9782003-03-20 23:34:22480 # CSV files
481 exts.append( Extension('_csv', ['_csv.c']) )
482
Andrew M. Kuchling00e0f212001-01-17 15:23:23483 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32484 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11485 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30486 # Detect SSL support for the socket module (via _ssl)
Michael W. Hudsonc4c71802002-08-03 16:39:22487 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21488 ['/usr/local/ssl/include',
489 '/usr/contrib/ssl/include/'
490 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20491 )
Martin v. Löwisa950f7f2003-05-09 09:05:19492 if ssl_incs is not None:
493 krb5_h = find_file('krb5.h', inc_dirs,
494 ['/usr/kerberos/include'])
495 if krb5_h:
496 ssl_incs += krb5_h
Andrew M. Kuchlingfbe73762001-01-18 18:44:20497 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21498 ['/usr/local/ssl/lib',
499 '/usr/contrib/ssl/lib/'
500 ] )
Fredrik Lundhade711a2001-01-24 08:00:28501
Andrew M. Kuchlingfbe73762001-01-18 18:44:20502 if (ssl_incs is not None and
503 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30504 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20505 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28506 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32507 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11508 depends = ['socketmodule.h']), )
Andrew M. Kuchling00e0f212001-01-17 15:23:23509
510 # Modules that provide persistent dictionary-like semantics. You will
511 # probably want to arrange for at least one of them to be available on
512 # your machine, though none are defined by default because of library
513 # dependencies. The Python module anydbm.py provides an
514 # implementation independent wrapper for these; dumbdbm.py provides
515 # similar functionality (but slower of course) implemented in Python.
516
Barry Warsaw40819d52002-12-30 20:51:12517 # Sleepycat Berkeley DB interface. http://www.sleepycat.com
Skip Montanaro57454e52002-06-14 20:30:31518 #
Barry Warsaw40819d52002-12-30 20:51:12519 # This requires the Sleepycat DB code. The earliest supported version
Gregory P. Smith88f669a2006-01-24 10:02:02520 # of that library is 3.2, the latest supported version is 4.4. A list
Barry Warsaw40819d52002-12-30 20:51:12521 # of available releases can be found at
Skip Montanaro57454e52002-06-14 20:30:31522 #
Martin v. Löwis05d4d562002-12-06 10:25:02523 # http://www.sleepycat.com/update/index.html
Skip Montanaro57454e52002-06-14 20:30:31524
Gregory P. Smith88f669a2006-01-24 10:02:02525 max_db_ver = (4, 4)
Gregory P. Smitha5debf72004-12-19 22:25:32526 min_db_ver = (3, 2)
527 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31528
Gregory P. Smitha5debf72004-12-19 22:25:32529 # construct a list of paths to look for the header file in on
530 # top of the normal inc_dirs.
531 db_inc_paths = [
532 '/usr/include/db4',
533 '/usr/local/include/db4',
534 '/opt/sfw/include/db4',
535 '/sw/include/db4',
536 '/usr/include/db3',
537 '/usr/local/include/db3',
538 '/opt/sfw/include/db3',
539 '/sw/include/db3',
540 ]
541 # 4.x minor number specific paths
Gregory P. Smith88f669a2006-01-24 10:02:02542 for x in (0,1,2,3,4):
Gregory P. Smitha5debf72004-12-19 22:25:32543 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz4f702c42006-01-25 08:18:43544 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smitha5debf72004-12-19 22:25:32545 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
546 db_inc_paths.append('/usr/local/include/db4%d' % x)
547 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith88f669a2006-01-24 10:02:02548 db_inc_paths.append('/opt/db-4.%d/include' % x)
Gregory P. Smitha5debf72004-12-19 22:25:32549 # 3.x minor number specific paths
550 for x in (2,3):
551 db_inc_paths.append('/usr/include/db3%d' % x)
552 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
553 db_inc_paths.append('/usr/local/include/db3%d' % x)
554 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith88f669a2006-01-24 10:02:02555 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43556
Ronald Oussoren392cafb2006-10-08 17:41:25557 # Add some common subdirectories for Sleepycat DB to the list,
558 # based on the standard include directories. This way DB3/4 gets
559 # picked up when it is installed in a non-standard prefix and
560 # the user has added that prefix into inc_dirs.
561 std_variants = []
562 for dn in inc_dirs:
563 std_variants.append(os.path.join(dn, 'db3'))
564 std_variants.append(os.path.join(dn, 'db4'))
565 for x in (0,1,2,3,4):
566 std_variants.append(os.path.join(dn, "db4%d"%x))
567 std_variants.append(os.path.join(dn, "db4.%d"%x))
568 for x in (2,3):
569 std_variants.append(os.path.join(dn, "db3%d"%x))
570 std_variants.append(os.path.join(dn, "db3.%d"%x))
571
572 db_inc_paths = std_variants + db_inc_paths
573
Gregory P. Smitha5debf72004-12-19 22:25:32574 db_ver_inc_map = {}
575
576 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31577 try:
Martin v. Löwis05d4d562002-12-06 10:25:02578 # See whether there is a Sleepycat header in the standard
579 # search path.
Gregory P. Smitha5debf72004-12-19 22:25:32580 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02581 f = os.path.join(d, "db.h")
Gregory P. Smitha5debf72004-12-19 22:25:32582 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02583 if os.path.exists(f):
584 f = open(f).read()
Gregory P. Smitha5debf72004-12-19 22:25:32585 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02586 if m:
Gregory P. Smitha5debf72004-12-19 22:25:32587 db_major = int(m.group(1))
588 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
589 db_minor = int(m.group(1))
590 db_ver = (db_major, db_minor)
591
592 if ( (not db_ver_inc_map.has_key(db_ver)) and
593 (db_ver <= max_db_ver and db_ver >= min_db_ver) ):
594 # save the include directory with the db.h version
595 # (first occurrance only)
596 db_ver_inc_map[db_ver] = d
597 print "db.h: found", db_ver, "in", d
598 else:
599 # we already found a header for this library version
600 if db_setup_debug: print "db.h: ignoring", d
601 else:
602 # ignore this header, it didn't contain a version number
603 if db_setup_debug: print "db.h: unsupported version", db_ver, "in", d
604
605 db_found_vers = db_ver_inc_map.keys()
606 db_found_vers.sort()
607
608 while db_found_vers:
609 db_ver = db_found_vers.pop()
610 db_incdir = db_ver_inc_map[db_ver]
611
612 # check lib directories parallel to the location of the header
613 db_dirs_to_check = [
614 os.path.join(db_incdir, '..', 'lib64'),
615 os.path.join(db_incdir, '..', 'lib'),
616 os.path.join(db_incdir, '..', '..', 'lib64'),
617 os.path.join(db_incdir, '..', '..', 'lib'),
618 ]
619 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
620
621 # Look for a version specific db-X.Y before an ambiguoius dbX
622 # XXX should we -ever- look for a dbX name? Do any
623 # systems really not name their library by version and
624 # symlink to more general names?
Andrew MacIntyre2ad58482005-03-09 22:27:24625 for dblib in (('db-%d.%d' % db_ver),
626 ('db%d%d' % db_ver),
627 ('db%d' % db_ver[0])):
Gregory P. Smitha5debf72004-12-19 22:25:32628 dblib_file = self.compiler.find_library_file(
629 db_dirs_to_check + lib_dirs, dblib )
630 if dblib_file:
631 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
632 raise db_found
633 else:
634 if db_setup_debug: print "db lib: ", dblib, "not found"
635
636 except db_found:
637 print "db lib: using", db_ver, dblib
638 if db_setup_debug: print "db: lib dir", dblib_dir, "inc dir", db_incdir
639 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36640 dblibs = [dblib]
Gregory P. Smitha5debf72004-12-19 22:25:32641 # We add the runtime_library_dirs argument because the
642 # BerkeleyDB lib we're linking against often isn't in the
643 # system dynamic library search path. This is usually
644 # correct and most trouble free, but may cause problems in
645 # some unusual system configurations (e.g. the directory
646 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52647 exts.append(Extension('_bsddb', ['_bsddb.c'],
Martin v. Löwis05d4d562002-12-06 10:25:02648 library_dirs=dblib_dir,
649 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52650 include_dirs=db_incs,
651 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31652 else:
Gregory P. Smitha5debf72004-12-19 22:25:32653 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31654 db_incs = None
655 dblibs = []
656 dblib_dir = None
657
Skip Montanaro22e00c42003-05-06 20:43:34658
659 # Look for Berkeley db 1.85. Note that it is built as a different
660 # module name so it can be included even when later versions are
661 # available. A very restrictive search is performed to avoid
662 # accidentally building this module with a later version of the
663 # underlying db library. May BSD-ish Unixes incorporate db 1.85
664 # symbols into libc and place the include file in /usr/include.
665 f = "/usr/include/db.h"
666 if os.path.exists(f):
667 data = open(f).read()
668 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
669 if m is not None:
670 # bingo - old version used hash file format version 2
671 ### XXX this should be fixed to not be platform-dependent
672 ### but I don't have direct access to an osf1 platform and
673 ### seemed to be muffing the search somehow
674 libraries = platform == "osf1" and ['db'] or None
675 if libraries is not None:
676 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
677 libraries=libraries))
678 else:
679 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
680
Andrew M. Kuchling00e0f212001-01-17 15:23:23681 # The standard Unix dbm module:
Jack Jansend1b20452002-07-08 21:39:36682 if platform not in ['cygwin']:
Martin v. Löwisa37d61f2002-12-07 14:41:17683 if find_file("ndbm.h", inc_dirs, []) is not None:
684 # Some systems have -lndbm, others don't
685 if self.compiler.find_library_file(lib_dirs, 'ndbm'):
686 ndbm_libs = ['ndbm']
687 else:
688 ndbm_libs = []
Andrew M. Kuchling34febf52001-01-24 03:31:07689 exts.append( Extension('dbm', ['dbmmodule.c'],
Jack Jansend1b20452002-07-08 21:39:36690 define_macros=[('HAVE_NDBM_H',None)],
Martin v. Löwisa37d61f2002-12-07 14:41:17691 libraries = ndbm_libs ) )
Jack Jansend1b20452002-07-08 21:39:36692 elif (self.compiler.find_library_file(lib_dirs, 'gdbm')
693 and find_file("gdbm/ndbm.h", inc_dirs, []) is not None):
694 exts.append( Extension('dbm', ['dbmmodule.c'],
695 define_macros=[('HAVE_GDBM_NDBM_H',None)],
Skip Montanaro57454e52002-06-14 20:30:31696 libraries = ['gdbm'] ) )
697 elif db_incs is not None:
698 exts.append( Extension('dbm', ['dbmmodule.c'],
Martin v. Löwisa37d61f2002-12-07 14:41:17699 library_dirs=dblib_dir,
700 runtime_library_dirs=dblib_dir,
Skip Montanaro57454e52002-06-14 20:30:31701 include_dirs=db_incs,
Jack Jansend1b20452002-07-08 21:39:36702 define_macros=[('HAVE_BERKDB_H',None),
703 ('DB_DBM_HSEARCH',None)],
Skip Montanaro57454e52002-06-14 20:30:31704 libraries=dblibs))
Fredrik Lundhade711a2001-01-24 08:00:28705
Andrew M. Kuchling00e0f212001-01-17 15:23:23706 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
707 if (self.compiler.find_library_file(lib_dirs, 'gdbm')):
708 exts.append( Extension('gdbm', ['gdbmmodule.c'],
709 libraries = ['gdbm'] ) )
710
Andrew M. Kuchling00e0f212001-01-17 15:23:23711 # Unix-only modules
Andrew M. Kuchling34febf52001-01-24 03:31:07712 if platform not in ['mac', 'win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23713 # Steen Lumholt's termios module
714 exts.append( Extension('termios', ['termios.c']) )
715 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43716 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31717 exts.append( Extension('resource', ['resource.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23718
Andrew M. Kuchlingcf393f32001-02-21 02:38:24719 # Sun yellow pages. Some systems have the functions in libc.
Martin v. Löwisf90ae202002-06-11 06:22:31720 if platform not in ['cygwin', 'atheos']:
Andrew M. Kuchling6efc6e72001-02-27 20:54:23721 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
722 libs = ['nsl']
723 else:
724 libs = []
725 exts.append( Extension('nis', ['nismodule.c'],
726 libraries = libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23727
Skip Montanaro72092942004-02-07 12:50:19728 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28729 # provided by the ncurses library.
Andrew M. Kuchling12b23ca2006-08-07 00:37:19730 panel_library = 'panel'
Martin v. Löwisbdba3b62006-02-11 15:55:22731 if (self.compiler.find_library_file(lib_dirs, 'ncursesw')):
732 curses_libs = ['ncursesw']
Andrew M. Kuchling12b23ca2006-08-07 00:37:19733 # Bug 1464056: If _curses.so links with ncursesw,
734 # _curses_panel.so must link with panelw.
735 panel_library = 'panelw'
Martin v. Löwisbdba3b62006-02-11 15:55:22736 exts.append( Extension('_curses', ['_cursesmodule.c'],
737 libraries = curses_libs) )
738 elif (self.compiler.find_library_file(lib_dirs, 'ncurses')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23739 curses_libs = ['ncurses']
740 exts.append( Extension('_curses', ['_cursesmodule.c'],
741 libraries = curses_libs) )
Fred Drake38419c02001-12-06 22:24:47742 elif (self.compiler.find_library_file(lib_dirs, 'curses')
743 and platform != 'darwin'):
Michael W. Hudson5b109102002-01-23 15:04:41744 # OSX has an old Berkeley curses, not good enough for
745 # the _curses module.
Andrew M. Kuchling00e0f212001-01-17 15:23:23746 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
747 curses_libs = ['curses', 'terminfo']
Neal Norwitz0b27ff92003-03-31 15:53:49748 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23749 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49750 else:
751 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28752
Andrew M. Kuchling00e0f212001-01-17 15:23:23753 exts.append( Extension('_curses', ['_cursesmodule.c'],
754 libraries = curses_libs) )
Fredrik Lundhade711a2001-01-24 08:00:28755
Andrew M. Kuchling00e0f212001-01-17 15:23:23756 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16757 if (module_enabled(exts, '_curses') and
Andrew M. Kuchling12b23ca2006-08-07 00:37:19758 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23759 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling12b23ca2006-08-07 00:37:19760 libraries = [panel_library] + curses_libs) )
Fredrik Lundhade711a2001-01-24 08:00:28761
762
Barry Warsaw259b1e12002-08-13 20:09:26763 # Andrew Kuchling's zlib module. Note that some versions of zlib
764 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
765 # http://www.cert.org/advisories/CA-2002-07.html
766 #
767 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
768 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
769 # now, we still accept 1.1.3, because we think it's difficult to
770 # exploit this in Python, and we'd rather make it RedHat's problem
771 # than our problem <wink>.
772 #
773 # You can upgrade zlib to version 1.1.4 yourself by going to
774 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12775 zlib_inc = find_file('zlib.h', [], inc_dirs)
776 if zlib_inc is not None:
777 zlib_h = zlib_inc[0] + '/zlib.h'
778 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26779 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12780 fp = open(zlib_h)
781 while 1:
782 line = fp.readline()
783 if not line:
784 break
Guido van Rossum8cdc03d2002-08-06 17:28:30785 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12786 version = line.split()[2]
787 break
788 if version >= version_req:
789 if (self.compiler.find_library_file(lib_dirs, 'z')):
790 exts.append( Extension('zlib', ['zlibmodule.c'],
791 libraries = ['z']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23792
Gustavo Niemeyerf8ca8362002-11-05 16:50:05793 # Gustavo Niemeyer's bz2 module.
794 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
795 exts.append( Extension('bz2', ['bz2module.c'],
796 libraries = ['bz2']) )
797
Andrew M. Kuchling00e0f212001-01-17 15:23:23798 # Interface to the Expat XML parser
799 #
Fred Drakefc8341d2002-06-17 17:55:30800 # Expat was written by James Clark and is now maintained by a
801 # group of developers on SourceForge; see www.libexpat.org for
802 # more information. The pyexpat module was written by Paul
Andrew M. Kuchling99f3ba12003-09-15 12:27:18803 # Prescod after a prototype by Jack Jansen. The Expat source
804 # is included in Modules/expat/. Usage of a system
Fred Drakefc8341d2002-06-17 17:55:30805 # shared libexpat.so/expat.dll is not advised.
806 #
807 # More information on Expat can be found at www.libexpat.org.
808 #
Martin v. Löwis83012562002-02-14 01:25:37809 expatinc = os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')
Fred Drake2d59a492003-10-21 15:41:15810 define_macros = [
Ronald Oussoren392cafb2006-10-08 17:41:25811 ('HAVE_EXPAT_CONFIG_H', '1'),
Fred Drake2d59a492003-10-21 15:41:15812 ]
Fred Drake2d59a492003-10-21 15:41:15813 exts.append(Extension('pyexpat',
814 define_macros = define_macros,
815 include_dirs = [expatinc],
816 sources = ['pyexpat.c',
817 'expat/xmlparse.c',
818 'expat/xmlrole.c',
819 'expat/xmltok.c',
820 ],
821 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23822
Hye-Shik Chang3e2a3062004-01-17 14:29:29823 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwisad80c6b2005-03-08 15:05:18824 if have_unicode:
825 exts.append(Extension('_multibytecodec',
826 ['cjkcodecs/multibytecodec.c']))
827 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
828 exts.append(Extension('_codecs_' + loc,
829 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29830
Michael W. Hudson5b109102002-01-23 15:04:41831 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20832 if sys.maxint == 0x7fffffff:
833 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
834 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Jack Jansen0feb8c32003-02-18 10:24:34835 if (dl_inc is not None) and (platform not in ['atheos', 'darwin']):
Guido van Rossum770acd32002-09-12 14:41:20836 exts.append( Extension('dl', ['dlmodule.c']) )
Michael W. Hudson5b109102002-01-23 15:04:41837
Andrew M. Kuchling00e0f212001-01-17 15:23:23838 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07839 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23840 # Linux-specific modules
841 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Greg Ward0a6355e2003-01-08 01:37:41842
Hye-Shik Changf64700a2004-08-18 15:13:41843 if platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6'):
Guido van Rossum0c016a92003-02-13 16:12:21844 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23845
Andrew M. Kuchling34febf52001-01-24 03:31:07846 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28847 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23848 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Michael W. Hudson5b109102002-01-23 15:04:41849
Tim Peters66cb0182004-08-26 05:23:19850 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07851 sysconfig.get_config_var("CONFIG_ARGS")):
Just van Rossum05ced6a2002-11-24 23:15:57852 # Mac OS X specific modules.
Jack Jansen0b06be72002-06-21 14:48:38853 exts.append( Extension('_CF', ['cf/_CFmodule.c', 'cf/pycfbridge.c'],
Michael W. Hudson0c46c0c2002-03-07 09:58:56854 extra_link_args=['-framework', 'CoreFoundation']) )
Jack Jansend1b20452002-07-08 21:39:36855
Just van Rossumebc198f2003-05-24 20:21:50856 exts.append( Extension('ColorPicker', ['ColorPickermodule.c'],
857 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum96f7d872003-05-03 00:27:23858 exts.append( Extension('autoGIL', ['autoGIL.c'],
859 extra_link_args=['-framework', 'CoreFoundation']) )
Just van Rossum05ced6a2002-11-24 23:15:57860 exts.append( Extension('gestalt', ['gestaltmodule.c'],
Michael W. Hudson5b109102002-01-23 15:04:41861 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57862 exts.append( Extension('MacOS', ['macosmodule.c'],
Michael W. Hudson5b109102002-01-23 15:04:41863 extra_link_args=['-framework', 'Carbon']) )
Jack Jansen7a251db2003-03-06 23:03:43864 exts.append( Extension('OSATerminology', ['OSATerminology.c'],
865 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57866 exts.append( Extension('icglue', ['icgluemodule.c'],
Jack Jansen983258e2002-08-29 21:09:00867 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57868 exts.append( Extension('_Res', ['res/_Resmodule.c'],
Michael W. Hudson5b109102002-01-23 15:04:41869 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57870 exts.append( Extension('_Snd', ['snd/_Sndmodule.c'],
Michael W. Hudson5b109102002-01-23 15:04:41871 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57872 exts.append( Extension('Nav', ['Nav.c'],
873 extra_link_args=['-framework', 'Carbon']) )
874 exts.append( Extension('_AE', ['ae/_AEmodule.c'],
875 extra_link_args=['-framework', 'Carbon']) )
876 exts.append( Extension('_AH', ['ah/_AHmodule.c'],
877 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57878 exts.append( Extension('_App', ['app/_Appmodule.c'],
879 extra_link_args=['-framework', 'Carbon']) )
880 exts.append( Extension('_CarbonEvt', ['carbonevt/_CarbonEvtmodule.c'],
881 extra_link_args=['-framework', 'Carbon']) )
882 exts.append( Extension('_CG', ['cg/_CGmodule.c'],
Jack Jansend7928482003-03-02 21:31:51883 extra_link_args=['-framework', 'ApplicationServices']) )
Just van Rossum05ced6a2002-11-24 23:15:57884 exts.append( Extension('_Cm', ['cm/_Cmmodule.c'],
885 extra_link_args=['-framework', 'Carbon']) )
886 exts.append( Extension('_Ctl', ['ctl/_Ctlmodule.c'],
887 extra_link_args=['-framework', 'Carbon']) )
888 exts.append( Extension('_Dlg', ['dlg/_Dlgmodule.c'],
889 extra_link_args=['-framework', 'Carbon']) )
890 exts.append( Extension('_Drag', ['drag/_Dragmodule.c'],
891 extra_link_args=['-framework', 'Carbon']) )
892 exts.append( Extension('_Evt', ['evt/_Evtmodule.c'],
893 extra_link_args=['-framework', 'Carbon']) )
894 exts.append( Extension('_File', ['file/_Filemodule.c'],
895 extra_link_args=['-framework', 'Carbon']) )
896 exts.append( Extension('_Folder', ['folder/_Foldermodule.c'],
897 extra_link_args=['-framework', 'Carbon']) )
898 exts.append( Extension('_Fm', ['fm/_Fmmodule.c'],
899 extra_link_args=['-framework', 'Carbon']) )
900 exts.append( Extension('_Help', ['help/_Helpmodule.c'],
901 extra_link_args=['-framework', 'Carbon']) )
902 exts.append( Extension('_Icn', ['icn/_Icnmodule.c'],
903 extra_link_args=['-framework', 'Carbon']) )
904 exts.append( Extension('_IBCarbon', ['ibcarbon/_IBCarbon.c'],
905 extra_link_args=['-framework', 'Carbon']) )
Jack Jansen7d0a6092003-12-02 23:01:43906 exts.append( Extension('_Launch', ['launch/_Launchmodule.c'],
907 extra_link_args=['-framework', 'ApplicationServices']) )
Just van Rossum05ced6a2002-11-24 23:15:57908 exts.append( Extension('_List', ['list/_Listmodule.c'],
909 extra_link_args=['-framework', 'Carbon']) )
910 exts.append( Extension('_Menu', ['menu/_Menumodule.c'],
911 extra_link_args=['-framework', 'Carbon']) )
912 exts.append( Extension('_Mlte', ['mlte/_Mltemodule.c'],
913 extra_link_args=['-framework', 'Carbon']) )
Jack Jansenfe3fe4a2003-12-03 22:34:19914 exts.append( Extension('_OSA', ['osa/_OSAmodule.c'],
915 extra_link_args=['-framework', 'Carbon']) )
Just van Rossum05ced6a2002-11-24 23:15:57916 exts.append( Extension('_Qd', ['qd/_Qdmodule.c'],
917 extra_link_args=['-framework', 'Carbon']) )
918 exts.append( Extension('_Qdoffs', ['qdoffs/_Qdoffsmodule.c'],
919 extra_link_args=['-framework', 'Carbon']) )
920 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
921 extra_link_args=['-framework', 'QuickTime',
922 '-framework', 'Carbon']) )
923 exts.append( Extension('_Scrap', ['scrap/_Scrapmodule.c'],
924 extra_link_args=['-framework', 'Carbon']) )
925 exts.append( Extension('_TE', ['te/_TEmodule.c'],
926 extra_link_args=['-framework', 'Carbon']) )
927 # As there is no standardized place (yet) to put
928 # user-installed Mac libraries on OSX, we search for "waste"
929 # in parent directories of the Python source tree. You
930 # should put a symlink to your Waste installation in the
931 # same folder as your python source tree. Or modify the
932 # next few lines:-)
Tim Peters2c60f7a2003-01-29 03:49:43933 waste_incs = find_file("WASTE.h", [],
Just van Rossum05ced6a2002-11-24 23:15:57934 ['../'*n + 'waste/C_C++ Headers' for n in (0,1,2,3,4)])
935 waste_libs = find_library_file(self.compiler, "WASTE", [],
936 ["../"*n + "waste/Static Libraries" for n in (0,1,2,3,4)])
937 if waste_incs != None and waste_libs != None:
938 (srcdir,) = sysconfig.get_config_vars('srcdir')
939 exts.append( Extension('waste',
940 ['waste/wastemodule.c'] + [
Tim Peters2c60f7a2003-01-29 03:49:43941 os.path.join(srcdir, d) for d in
Just van Rossum05ced6a2002-11-24 23:15:57942 'Mac/Wastemods/WEObjectHandlers.c',
943 'Mac/Wastemods/WETabHooks.c',
944 'Mac/Wastemods/WETabs.c'
945 ],
946 include_dirs = waste_incs + [os.path.join(srcdir, 'Mac/Wastemods')],
947 library_dirs = waste_libs,
948 libraries = ['WASTE'],
949 extra_link_args = ['-framework', 'Carbon'],
950 ) )
951 exts.append( Extension('_Win', ['win/_Winmodule.c'],
952 extra_link_args=['-framework', 'Carbon']) )
Michael W. Hudson5b109102002-01-23 15:04:41953
Andrew M. Kuchlingfbe73762001-01-18 18:44:20954 self.extensions.extend(exts)
955
956 # Call the method for detecting whether _tkinter can be compiled
957 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28958
Jack Jansen0b06be72002-06-21 14:48:38959 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
960 # The _tkinter module, using frameworks. Since frameworks are quite
961 # different the UNIX search logic is not sharable.
962 from os.path import join, exists
963 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43964 '/System/Library/Frameworks/',
965 '/Library/Frameworks',
Jack Jansen0b06be72002-06-21 14:48:38966 join(os.getenv('HOME'), '/Library/Frameworks')
967 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20968
Jack Jansen0b06be72002-06-21 14:48:38969 # Find the directory that contains the Tcl.framwork and Tk.framework
970 # bundles.
971 # XXX distutils should support -F!
972 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43973 # both Tcl.framework and Tk.framework should be present
Jack Jansen0b06be72002-06-21 14:48:38974 for fw in 'Tcl', 'Tk':
Tim Peters2c60f7a2003-01-29 03:49:43975 if not exists(join(F, fw + '.framework')):
Jack Jansen0b06be72002-06-21 14:48:38976 break
977 else:
978 # ok, F is now directory with both frameworks. Continure
979 # building
980 break
981 else:
982 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
983 # will now resume.
984 return 0
Tim Peters2c60f7a2003-01-29 03:49:43985
Jack Jansen0b06be72002-06-21 14:48:38986 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
987 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43988 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38989 #
990 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43991 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38992 for fw in 'Tcl', 'Tk'
993 for H in 'Headers', 'Versions/Current/PrivateHeaders'
994 ]
995
Tim Peters2c60f7a2003-01-29 03:49:43996 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38997 # complicated search, this is a hard-coded path. It could bail out
998 # if X11 libs are not found...
999 include_dirs.append('/usr/X11R6/include')
1000 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1001
1002 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1003 define_macros=[('WITH_APPINIT', 1)],
1004 include_dirs = include_dirs,
1005 libraries = [],
1006 extra_compile_args = frameworks,
1007 extra_link_args = frameworks,
1008 )
1009 self.extensions.append(ext)
1010 return 1
1011
Tim Peters2c60f7a2003-01-29 03:49:431012
Andrew M. Kuchlingfbe73762001-01-18 18:44:201013 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:231014 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:411015
Jack Jansen0b06be72002-06-21 14:48:381016 # Rather than complicate the code below, detecting and building
1017 # AquaTk is a separate method. Only one Tkinter will be built on
1018 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1019 platform = self.get_platform()
1020 if platform == 'darwin' and \
1021 self.detect_tkinter_darwin(inc_dirs, lib_dirs):
Tim Peters2c60f7a2003-01-29 03:49:431022 return
Jack Jansen0b06be72002-06-21 14:48:381023
Andrew M. Kuchlingfbe73762001-01-18 18:44:201024 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:011025 # The versions with dots are used on Unix, and the versions without
1026 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:201027 tcllib = tklib = tcl_includes = tk_includes = None
Andrew M. Kuchling4c4a45d2004-03-21 18:59:461028 for version in ['8.5', '85', '8.4', '84', '8.3', '83', '8.2',
Martin v. Löwis3db5b8c2001-07-24 06:54:011029 '82', '8.1', '81', '8.0', '80']:
Jason Tishlercccac1a2003-02-05 15:06:461030 tklib = self.compiler.find_library_file(lib_dirs, 'tk' + version)
1031 tcllib = self.compiler.find_library_file(lib_dirs, 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:411032 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:231033 # Exit the loop when we've found the Tcl/Tk libraries
1034 break
Andrew M. Kuchling00e0f212001-01-17 15:23:231035
Fredrik Lundhade711a2001-01-24 08:00:281036 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:201037 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:351038 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:201039 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:351040 dotversion = version
1041 if '.' not in dotversion and "bsd" in sys.platform.lower():
1042 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1043 # but the include subdirs are named like .../include/tcl8.3.
1044 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1045 tcl_include_sub = []
1046 tk_include_sub = []
1047 for dir in inc_dirs:
1048 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1049 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1050 tk_include_sub += tcl_include_sub
1051 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1052 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:231053
Martin v. Löwise86a59a2003-05-03 08:45:511054 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:201055 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:351056 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:201057 return
Fredrik Lundhade711a2001-01-24 08:00:281058
Andrew M. Kuchlingfbe73762001-01-18 18:44:201059 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:231060
Andrew M. Kuchlingfbe73762001-01-18 18:44:201061 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1062 for dir in tcl_includes + tk_includes:
1063 if dir not in include_dirs:
1064 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:281065
Andrew M. Kuchlingfbe73762001-01-18 18:44:201066 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:071067 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:201068 include_dirs.append('/usr/openwin/include')
1069 added_lib_dirs.append('/usr/openwin/lib')
1070 elif os.path.exists('/usr/X11R6/include'):
1071 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:351072 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:201073 added_lib_dirs.append('/usr/X11R6/lib')
1074 elif os.path.exists('/usr/X11R5/include'):
1075 include_dirs.append('/usr/X11R5/include')
1076 added_lib_dirs.append('/usr/X11R5/lib')
1077 else:
Fredrik Lundhade711a2001-01-24 08:00:281078 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:201079 include_dirs.append('/usr/X11/include')
1080 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:231081
Jason Tishler9181c942003-02-05 15:16:171082 # If Cygwin, then verify that X is installed before proceeding
1083 if platform == 'cygwin':
1084 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1085 if x11_inc is None:
1086 return
1087
Andrew M. Kuchlingfbe73762001-01-18 18:44:201088 # Check for BLT extension
Fred Drake38419c02001-12-06 22:24:471089 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1090 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:201091 defs.append( ('WITH_BLT', 1) )
1092 libs.append('BLT8.0')
Martin v. Löwis427a2902002-12-12 20:23:381093 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
1094 'BLT'):
1095 defs.append( ('WITH_BLT', 1) )
1096 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:231097
Andrew M. Kuchlingfbe73762001-01-18 18:44:201098 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:461099 libs.append('tk'+ version)
1100 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:281101
Andrew M. Kuchling34febf52001-01-24 03:31:071102 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:201103 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:231104
Martin v. Löwis3db5b8c2001-07-24 06:54:011105 # Finally, link with the X11 libraries (not appropriate on cygwin)
1106 if platform != "cygwin":
1107 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:231108
Andrew M. Kuchlingfbe73762001-01-18 18:44:201109 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1110 define_macros=[('WITH_APPINIT', 1)] + defs,
1111 include_dirs = include_dirs,
1112 libraries = libs,
1113 library_dirs = added_lib_dirs,
1114 )
1115 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:281116
Guido van Rossum6c7438e2003-02-11 20:05:501117## # Uncomment these lines if you want to play with xxmodule.c
1118## ext = Extension('xx', ['xxmodule.c'])
1119## self.extensions.append(ext)
1120
Andrew M. Kuchlingfbe73762001-01-18 18:44:201121 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:231122 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:281123 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:231124 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:281125 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:231126 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:281127 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:231128
Andrew M. Kuchlingf52d27e2001-05-21 20:29:271129class PyBuildInstall(install):
1130 # Suppress the warning about installation into the lib_dynload
1131 # directory, which is not in sys.path when running Python during
1132 # installation:
1133 def initialize_options (self):
1134 install.initialize_options(self)
1135 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:411136
Michael W. Hudson529a5052002-12-17 16:47:171137class PyBuildInstallLib(install_lib):
1138 # Do exactly what install_lib does but make sure correct access modes get
1139 # set on installed directories and files. All installed files with get
1140 # mode 644 unless they are a shared library in which case they will get
1141 # mode 755. All installed directories will get mode 755.
1142
1143 so_ext = sysconfig.get_config_var("SO")
1144
1145 def install(self):
1146 outfiles = install_lib.install(self)
1147 self.set_file_modes(outfiles, 0644, 0755)
1148 self.set_dir_modes(self.install_dir, 0755)
1149 return outfiles
1150
1151 def set_file_modes(self, files, defaultMode, sharedLibMode):
1152 if not self.is_chmod_supported(): return
1153 if not files: return
1154
1155 for filename in files:
1156 if os.path.islink(filename): continue
1157 mode = defaultMode
1158 if filename.endswith(self.so_ext): mode = sharedLibMode
1159 log.info("changing mode of %s to %o", filename, mode)
1160 if not self.dry_run: os.chmod(filename, mode)
1161
1162 def set_dir_modes(self, dirname, mode):
1163 if not self.is_chmod_supported(): return
1164 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
1165
1166 def set_dir_modes_visitor(self, mode, dirname, names):
1167 if os.path.islink(dirname): return
1168 log.info("changing mode of %s to %o", dirname, mode)
1169 if not self.dry_run: os.chmod(dirname, mode)
1170
1171 def is_chmod_supported(self):
1172 return hasattr(os, 'chmod')
1173
Guido van Rossum14ee89c2003-02-20 02:52:041174SUMMARY = """
1175Python is an interpreted, interactive, object-oriented programming
1176language. It is often compared to Tcl, Perl, Scheme or Java.
1177
1178Python combines remarkable power with very clear syntax. It has
1179modules, classes, exceptions, very high level dynamic data types, and
1180dynamic typing. There are interfaces to many system calls and
1181libraries, as well as to various windowing systems (X11, Motif, Tk,
1182Mac, MFC). New built-in modules are easily written in C or C++. Python
1183is also usable as an extension language for applications that need a
1184programmable interface.
1185
1186The Python implementation is portable: it runs on many brands of UNIX,
1187on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
1188listed here, it may still be supported, if there's a C compiler for
1189it. Ask around on comp.lang.python -- or just try compiling Python
1190yourself.
1191"""
1192
1193CLASSIFIERS = """
1194Development Status :: 3 - Alpha
1195Development Status :: 6 - Mature
1196License :: OSI Approved :: Python Software Foundation License
1197Natural Language :: English
1198Programming Language :: C
1199Programming Language :: Python
1200Topic :: Software Development
1201"""
1202
Andrew M. Kuchling00e0f212001-01-17 15:23:231203def main():
Andrew M. Kuchling62686692001-05-21 20:48:091204 # turn off warnings when deprecated modules are imported
1205 import warnings
1206 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:041207 setup(# PyPI Metadata (PEP 301)
1208 name = "Python",
1209 version = sys.version.split()[0],
1210 url = "http://www.python.org/%s" % sys.version[:3],
1211 maintainer = "Guido van Rossum and the Python community",
1212 maintainer_email = "python-dev@python.org",
1213 description = "A high-level object-oriented programming language",
1214 long_description = SUMMARY.strip(),
1215 license = "PSF license",
1216 classifiers = filter(None, CLASSIFIERS.split("\n")),
1217 platforms = ["Many"],
1218
1219 # Build info
Michael W. Hudson529a5052002-12-17 16:47:171220 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
1221 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:231222 # The struct module is defined here, because build_ext won't be
1223 # called unless there's at least one extension module defined.
Andrew M. Kuchlingaece4272001-02-28 20:56:491224 ext_modules=[Extension('struct', ['structmodule.c'])],
1225
1226 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:421227 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
1228 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:231229 )
Fredrik Lundhade711a2001-01-24 08:00:281230
Andrew M. Kuchling00e0f212001-01-17 15:23:231231# --install-platlib
1232if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:231233 main()