blob: 798220b48ecbebab42496de9227e6ec9a763992d [file] [log] [blame]
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00001# Autodetecting setup.py script for building the Python extensions
2#
Fredrik Lundhade711a2001-01-24 08:00:28 +00003
Brett Cannonca5ff3a2013-06-15 17:52:59 -04004import sys, os, importlib.machinery, re, optparse
Christian Heimesaf98da12008-01-27 15:18:18 +00005from glob import glob
Tarek Ziadéedacea32010-01-29 11:41:03 +00006import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +00007
8from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +00009from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000010from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000011from distutils.core import Extension, setup
12from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000013from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000014from distutils.command.install_lib import install_lib
Georg Brandlff52f762010-12-28 09:51:43 +000015from distutils.command.build_scripts import build_scripts
Stefan Krah095b2732010-06-08 13:41:44 +000016from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000017
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020018cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
19
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020020def get_platform():
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020021 # cross build
22 if "_PYTHON_HOST_PLATFORM" in os.environ:
23 return os.environ["_PYTHON_HOST_PLATFORM"]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020024 # Get value of sys.platform
25 if sys.platform.startswith('osf1'):
26 return 'osf1'
27 return sys.platform
28host_platform = get_platform()
29
Gregory P. Smithb04ded42010-01-03 00:38:10 +000030# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +020031COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithb04ded42010-01-03 00:38:10 +000032
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000033# This global variable is used to hold the list of modules to be disabled.
34disabled_module_list = []
35
Michael W. Hudson39230b32002-01-16 15:26:48 +000036def add_dir_to_list(dirlist, dir):
Barry Warsaw807bd0a2010-11-24 20:30:00 +000037 """Add the directory 'dir' to the list 'dirlist' (after any relative
38 directories) if:
39
Michael W. Hudson39230b32002-01-16 15:26:48 +000040 1) 'dir' is not already in 'dirlist'
Barry Warsaw807bd0a2010-11-24 20:30:00 +000041 2) 'dir' actually exists, and is a directory.
42 """
43 if dir is None or not os.path.isdir(dir) or dir in dirlist:
44 return
45 for i, path in enumerate(dirlist):
46 if not os.path.isabs(path):
47 dirlist.insert(i + 1, dir)
Barry Warsaw34520cd2010-11-27 20:03:03 +000048 return
49 dirlist.insert(0, dir)
Michael W. Hudson39230b32002-01-16 15:26:48 +000050
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000051def macosx_sdk_root():
52 """
53 Return the directory of the current OSX SDK,
54 or '/' if no SDK was specified.
55 """
56 cflags = sysconfig.get_config_var('CFLAGS')
57 m = re.search(r'-isysroot\s+(\S+)', cflags)
58 if m is None:
59 sysroot = '/'
60 else:
61 sysroot = m.group(1)
62 return sysroot
63
64def is_macosx_sdk_path(path):
65 """
66 Returns True if 'path' can be located in an OSX SDK
67 """
Ned Deily2910a7b2012-07-30 02:35:58 -070068 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
69 or path.startswith('/System/')
70 or path.startswith('/Library/') )
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000071
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000072def find_file(filename, std_dirs, paths):
73 """Searches for the directory where a given file is located,
74 and returns a possibly-empty list of additional directories, or None
75 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000076
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000077 'filename' is the name of a file, such as readline.h or libcrypto.a.
78 'std_dirs' is the list of standard system directories; if the
79 file is found in one of them, no additional directives are needed.
80 'paths' is a list of additional locations to check; if the file is
81 found in one of them, the resulting list will contain the directory.
82 """
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020083 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000084 # Honor the MacOSX SDK setting when one was specified.
85 # An SDK is a directory with the same structure as a real
86 # system, but with only header files and libraries.
87 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000088
89 # Check the standard locations
90 for dir in std_dirs:
91 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000092
doko@ubuntu.com93df16b2012-06-30 14:32:08 +020093 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +000094 f = os.path.join(sysroot, dir[1:], filename)
95
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000096 if os.path.exists(f): return []
97
98 # Check the additional directories
99 for dir in paths:
100 f = os.path.join(dir, filename)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000101
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200102 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000103 f = os.path.join(sysroot, dir[1:], filename)
104
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000105 if os.path.exists(f):
106 return [dir]
107
108 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000109 return None
110
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000111def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000112 result = compiler.find_library_file(std_dirs + paths, libname)
113 if result is None:
114 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000115
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200116 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000117 sysroot = macosx_sdk_root()
118
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000119 # Check whether the found file is in one of the standard directories
120 dirname = os.path.dirname(result)
121 for p in std_dirs:
122 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000123 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000124
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200125 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000126 if os.path.join(sysroot, p[1:]) == dirname:
127 return [ ]
128
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000129 if p == dirname:
130 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000131
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000132 # Otherwise, it must have been in one of the additional directories,
133 # so we have to figure out which one.
134 for p in paths:
135 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000136 p = p.rstrip(os.sep)
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000137
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200138 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000139 if os.path.join(sysroot, p[1:]) == dirname:
140 return [ p ]
141
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000142 if p == dirname:
143 return [p]
144 else:
145 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000146
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000147def module_enabled(extlist, modname):
148 """Returns whether the module 'modname' is present in the list
149 of extensions 'extlist'."""
150 extlist = [ext for ext in extlist if ext.name == modname]
151 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000152
Jack Jansen144ebcc2001-08-05 22:31:19 +0000153def find_module_file(module, dirlist):
154 """Find a module in a set of possible folders. If it is not found
155 return the unadorned filename"""
156 list = find_file(module, [], dirlist)
157 if not list:
158 return module
159 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000160 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000161 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000162
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000163class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000164
Guido van Rossumd8faa362007-04-27 19:54:29 +0000165 def __init__(self, dist):
166 build_ext.__init__(self, dist)
167 self.failed = []
168
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000169 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000170
171 # Detect which modules should be compiled
doko@ubuntu.comd5537d02013-03-21 13:21:49 -0700172 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000173
174 # Remove modules that are present on the disabled list
Christian Heimes679db4a2008-01-18 09:56:22 +0000175 extensions = [ext for ext in self.extensions
176 if ext.name not in disabled_module_list]
177 # move ctypes to the end, it depends on other modules
178 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
179 if "_ctypes" in ext_map:
180 ctypes = extensions.pop(ext_map["_ctypes"])
181 extensions.append(ctypes)
182 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000183
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000184 # Fix up the autodetected modules, prefixing all the source files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000185 # with Modules/.
186 srcdir = sysconfig.get_config_var('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000187 if not srcdir:
188 # Maybe running on Windows but not using CYGWIN?
189 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer4d491a52009-02-06 00:27:50 +0000190 srcdir = os.path.abspath(srcdir)
Neil Schemenauer014bf282009-02-05 16:35:45 +0000191 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000192
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000193 # Fix up the paths for scripts, too
194 self.distribution.scripts = [os.path.join(srcdir, filename)
195 for filename in self.distribution.scripts]
196
Christian Heimesaf98da12008-01-27 15:18:18 +0000197 # Python header files
Neil Schemenauer014bf282009-02-05 16:35:45 +0000198 headers = [sysconfig.get_config_h_filename()]
Stefan Kraheb977da2012-02-29 14:10:53 +0100199 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Christian Heimesaf98da12008-01-27 15:18:18 +0000200
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000201 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000202 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000203 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000204 if ext.depends is not None:
Neil Schemenauer014bf282009-02-05 16:35:45 +0000205 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000206 for filename in ext.depends]
Christian Heimesaf98da12008-01-27 15:18:18 +0000207 else:
208 ext.depends = []
209 # re-compile extensions if a header file has been changed
210 ext.depends.extend(headers)
211
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000212 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000213 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000214 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000215 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000216
Ronald Oussoren94f25282010-05-05 19:11:21 +0000217 # Parse Modules/Setup and Modules/Setup.local to figure out which
218 # modules are turned on in the file.
219 remove_modules = []
220 for filename in ('Modules/Setup', 'Modules/Setup.local'):
221 input = text_file.TextFile(filename, join_lines=1)
222 while 1:
223 line = input.readline()
224 if not line: break
225 line = line.split()
226 remove_modules.append(line[0])
227 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000228
Ronald Oussoren94f25282010-05-05 19:11:21 +0000229 for ext in self.extensions[:]:
230 if ext.name in remove_modules:
231 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000232
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000233 # When you run "make CC=altcc" or something similar, you really want
234 # those environment variables passed into the setup.py phase. Here's
235 # a small set of useful ones.
236 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000237 args = {}
238 # unfortunately, distutils doesn't let us provide separate C and C++
239 # compilers
240 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000241 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
242 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé36797272010-07-22 12:50:05 +0000243 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000244
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000245 build_ext.build_extensions(self)
246
Guido van Rossumd8faa362007-04-27 19:54:29 +0000247 longest = max([len(e.name) for e in self.extensions])
248 if self.failed:
249 longest = max(longest, max([len(name) for name in self.failed]))
250
251 def print_three_column(lst):
252 lst.sort(key=str.lower)
253 # guarantee zip() doesn't drop anything
254 while len(lst) % 3:
255 lst.append("")
256 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
257 print("%-*s %-*s %-*s" % (longest, e, longest, f,
258 longest, g))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000259
260 if missing:
261 print()
Benjamin Petersonda10d3b2009-01-01 00:23:30 +0000262 print("Python build finished, but the necessary bits to build "
263 "these modules were not found:")
Guido van Rossumd8faa362007-04-27 19:54:29 +0000264 print_three_column(missing)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000265 print("To find the necessary bits, look in setup.py in"
266 " detect_modules() for the module's name.")
267 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000268
269 if self.failed:
270 failed = self.failed[:]
271 print()
272 print("Failed to build these modules:")
273 print_three_column(failed)
Guido van Rossum04110fb2007-08-24 16:32:05 +0000274 print()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000275
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000276 def build_extension(self, ext):
277
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000278 if ext.name == '_ctypes':
279 if not self.configure_ctypes(ext):
280 return
281
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000282 try:
283 build_ext.build_extension(self, ext)
Guido van Rossumb940e112007-01-10 16:19:56 +0000284 except (CCompilerError, DistutilsError) as why:
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000285 self.announce('WARNING: building of extension "%s" failed: %s' %
286 (ext.name, sys.exc_info()[1]))
Guido van Rossumd8faa362007-04-27 19:54:29 +0000287 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000288 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000289 # Workaround for Mac OS X: The Carbon-based modules cannot be
290 # reliably imported into a command-line Python
291 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000292 self.announce(
293 'WARNING: skipping import check for Carbon-based "%s"' %
294 ext.name)
295 return
Georg Brandlfcaf9102008-07-16 02:17:56 +0000296
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200297 if host_platform == 'darwin' and (
Benjamin Petersonfc576352008-07-16 02:39:02 +0000298 sys.maxsize > 2**32 and '-arch' in ext.extra_link_args):
Georg Brandlfcaf9102008-07-16 02:17:56 +0000299 # Don't bother doing an import check when an extension was
300 # build with an explicit '-arch' flag on OSX. That's currently
301 # only used to build 32-bit only extensions in a 4-way
302 # universal build and loading 32-bit code into a 64-bit
303 # process will fail.
304 self.announce(
305 'WARNING: skipping import check for "%s"' %
306 ext.name)
307 return
308
Jason Tishler24cf7762002-05-22 16:46:15 +0000309 # Workaround for Cygwin: Cygwin currently has fork issues when many
310 # modules have been imported
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200311 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000312 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
313 % ext.name)
314 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000315 ext_filename = os.path.join(
316 self.build_lib,
317 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Guido van Rossumc3fee692008-07-17 16:23:53 +0000318
319 # If the build directory didn't exist when setup.py was
320 # started, sys.path_importer_cache has a negative result
321 # cached. Clear that cache before trying to import.
322 sys.path_importer_cache.clear()
323
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200324 # Don't try to load extensions for cross builds
325 if cross_compiling:
326 return
327
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400328 loader = importlib.machinery.ExtensionFileLoader(ext.name, ext_filename)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000329 try:
Brett Cannonca5ff3a2013-06-15 17:52:59 -0400330 loader.load_module()
Guido van Rossumb940e112007-01-10 16:19:56 +0000331 except ImportError as why:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000332 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000333 self.announce('*** WARNING: renaming "%s" since importing it'
334 ' failed: %s' % (ext.name, why), level=3)
335 assert not self.inplace
336 basename, tail = os.path.splitext(ext_filename)
337 newname = basename + "_failed" + tail
338 if os.path.exists(newname):
339 os.remove(newname)
340 os.rename(ext_filename, newname)
341
342 # XXX -- This relies on a Vile HACK in
343 # distutils.command.build_ext.build_extension(). The
344 # _built_objects attribute is stored there strictly for
345 # use here.
346 # If there is a failure, _built_objects may not be there,
347 # so catch the AttributeError and move on.
348 try:
349 for filename in self._built_objects:
350 os.remove(filename)
351 except AttributeError:
352 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000353 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000354 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000355 self.announce('*** WARNING: importing extension "%s" '
356 'failed with %s: %s' % (ext.name, exc_type, why),
357 level=3)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000358 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000359
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400360 def add_multiarch_paths(self):
361 # Debian/Ubuntu multiarch support.
362 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3277b352012-08-08 12:15:55 +0200363 cc = sysconfig.get_config_var('CC')
364 tmpfile = os.path.join(self.build_temp, 'multiarch')
365 if not os.path.exists(self.build_temp):
366 os.makedirs(self.build_temp)
367 ret = os.system(
368 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
369 multiarch_path_component = ''
370 try:
371 if ret >> 8 == 0:
372 with open(tmpfile) as fp:
373 multiarch_path_component = fp.readline().strip()
374 finally:
375 os.unlink(tmpfile)
376
377 if multiarch_path_component != '':
378 add_dir_to_list(self.compiler.library_dirs,
379 '/usr/lib/' + multiarch_path_component)
380 add_dir_to_list(self.compiler.include_dirs,
381 '/usr/include/' + multiarch_path_component)
382 return
383
Barry Warsaw88e19452011-04-07 10:40:36 -0400384 if not find_executable('dpkg-architecture'):
385 return
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200386 opt = ''
387 if cross_compiling:
388 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400389 tmpfile = os.path.join(self.build_temp, 'multiarch')
390 if not os.path.exists(self.build_temp):
391 os.makedirs(self.build_temp)
392 ret = os.system(
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200393 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
394 (opt, tmpfile))
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400395 try:
396 if ret >> 8 == 0:
397 with open(tmpfile) as fp:
398 multiarch_path_component = fp.readline().strip()
399 add_dir_to_list(self.compiler.library_dirs,
400 '/usr/lib/' + multiarch_path_component)
401 add_dir_to_list(self.compiler.include_dirs,
402 '/usr/include/' + multiarch_path_component)
403 finally:
404 os.unlink(tmpfile)
405
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200406 def add_gcc_paths(self):
407 gcc = sysconfig.get_config_var('CC')
408 tmpfile = os.path.join(self.build_temp, 'gccpaths')
409 if not os.path.exists(self.build_temp):
410 os.makedirs(self.build_temp)
411 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
412 is_gcc = False
413 in_incdirs = False
414 inc_dirs = []
415 lib_dirs = []
416 try:
417 if ret >> 8 == 0:
418 with open(tmpfile) as fp:
419 for line in fp.readlines():
420 if line.startswith("gcc version"):
421 is_gcc = True
422 elif line.startswith("#include <...>"):
423 in_incdirs = True
424 elif line.startswith("End of search list"):
425 in_incdirs = False
426 elif is_gcc and line.startswith("LIBRARY_PATH"):
427 for d in line.strip().split("=")[1].split(":"):
428 d = os.path.normpath(d)
429 if '/gcc/' not in d:
430 add_dir_to_list(self.compiler.library_dirs,
431 d)
432 elif is_gcc and in_incdirs and '/gcc/' not in line:
433 add_dir_to_list(self.compiler.include_dirs,
434 line.strip())
435 finally:
436 os.unlink(tmpfile)
437
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000438 def detect_modules(self):
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000439 # Ensure that /usr/local is always used, but the local build
440 # directories (i.e. '.' and 'Include') must be first. See issue
441 # 10520.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200442 if not cross_compiling:
443 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
444 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200445 # only change this for cross builds for 3.3, issues on Mageia
446 if cross_compiling:
447 self.add_gcc_paths()
Barry Warsaw5ca305a2011-04-06 15:18:12 -0400448 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000449
Brett Cannon516592f2004-12-07 00:42:59 +0000450 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000451 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000452 # We must get the values from the Makefile and not the environment
453 # directly since an inconsistently reproducible issue comes up where
454 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000455 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000456 for env_var, arg_name, dir_list in (
Tarek Ziadé36797272010-07-22 12:50:05 +0000457 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
458 ('LDFLAGS', '-L', self.compiler.library_dirs),
459 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000460 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000461 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000462 # To prevent optparse from raising an exception about any
Skip Montanaroa5c2a512008-10-07 02:51:48 +0000463 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000464 # all double dashes and any dashes followed by a character
465 # that is not for the option we are dealing with.
466 #
467 # Please note that order of the regex is important! We must
468 # strip out double-dashes first so that we don't end up with
469 # substituting "--Long" to "-Long" and thus lead to "ong" being
470 # used for a library directory.
Guido van Rossum04110fb2007-08-24 16:32:05 +0000471 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
472 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000473 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000474 # Make sure that allowing args interspersed with options is
475 # allowed
476 parser.allow_interspersed_args = True
477 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000478 parser.add_option(arg_name, dest="dirs", action="append")
479 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000480 if options.dirs:
Christian Heimes292d3512008-02-03 16:51:08 +0000481 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000482 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000483
Vinay Sajip7ded1f02012-05-26 03:45:29 +0100484 if os.path.normpath(sys.base_prefix) != '/usr' \
Ronald Oussorenf3500e12010-10-20 13:10:12 +0000485 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
486 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
487 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
488 # building a framework with different architectures than
489 # the one that is currently installed (issue #7473)
Tarek Ziadé36797272010-07-22 12:50:05 +0000490 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000491 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé36797272010-07-22 12:50:05 +0000492 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000493 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000494
495 # lib_dirs and inc_dirs are used to search for files;
496 # if a file is found in one of those directories, it can
497 # be assumed that no additional -I,-L directives are needed.
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200498 if not cross_compiling:
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200499 lib_dirs = self.compiler.library_dirs + [
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200500 '/lib64', '/usr/lib64',
501 '/lib', '/usr/lib',
doko@ubuntu.comcc5addd2012-07-01 00:23:51 +0200502 ]
503 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Christian Heimesf19529c2012-12-12 12:41:00 +0100504 else:
Christian Heimesd7832612012-12-12 12:56:51 +0100505 lib_dirs = self.compiler.library_dirs[:]
506 inc_dirs = self.compiler.include_dirs[:]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000507 exts = []
Guido van Rossumd8faa362007-04-27 19:54:29 +0000508 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000509
Brett Cannon4454a1f2005-04-15 20:32:39 +0000510 config_h = sysconfig.get_config_h_filename()
Brett Cannon9f5db072010-10-29 20:19:27 +0000511 with open(config_h) as file:
512 config_h_vars = sysconfig.parse_config_h(file)
Brett Cannon4454a1f2005-04-15 20:32:39 +0000513
Neil Schemenauer014bf282009-02-05 16:35:45 +0000514 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000515
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000516 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200517 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000518 lib_dirs += ['/usr/ccs/lib']
519
Charles-François Natali5739e102012-04-12 19:07:25 +0200520 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200521 if host_platform == 'hp-ux11':
Charles-François Natali5739e102012-04-12 19:07:25 +0200522 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
523
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200524 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +0000525 # This should work on any unixy platform ;-)
526 # If the user has bothered specifying additional -I and -L flags
527 # in OPT and LDFLAGS we might as well use them here.
Barry Warsaw807bd0a2010-11-24 20:30:00 +0000528 #
529 # NOTE: using shlex.split would technically be more correct, but
530 # also gives a bootstrap problem. Let's hope nobody uses
531 # directories with whitespace in the name to store libraries.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000532 cflags, ldflags = sysconfig.get_config_vars(
533 'CFLAGS', 'LDFLAGS')
534 for item in cflags.split():
535 if item.startswith('-I'):
536 inc_dirs.append(item[2:])
537
538 for item in ldflags.split():
539 if item.startswith('-L'):
540 lib_dirs.append(item[2:])
541
Fredrik Lundhade711a2001-01-24 08:00:28 +0000542 # Check for MacOS X, which doesn't need libm.a at all
543 math_libs = ['m']
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200544 if host_platform == 'darwin':
Fredrik Lundhade711a2001-01-24 08:00:28 +0000545 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000546
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000547 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
548
549 #
550 # The following modules are all pretty straightforward, and compile
551 # on pretty much any POSIXish platform.
552 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000553
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000554 # array objects
555 exts.append( Extension('array', ['arraymodule.c']) )
556 # complex math library functions
Mark Dickinsonf3718592009-12-21 15:27:41 +0000557 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
558 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000559 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000560 # math library functions, e.g. sin()
Mark Dickinson664b5112009-12-16 20:23:42 +0000561 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson8a591132009-12-17 08:35:56 +0000562 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000563 libraries=math_libs) )
Victor Stinnere0be4232011-10-25 13:06:09 +0200564
565 # time libraries: librt may be needed for clock_gettime()
566 time_libs = []
567 lib = sysconfig.get_config_var('TIMEMODULE_LIB')
568 if lib:
569 time_libs.append(lib)
570
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000571 # time operations and variables
Victor Stinner5d272cc2012-03-13 13:35:55 +0100572 exts.append( Extension('time', ['timemodule.c'],
Victor Stinnere0be4232011-10-25 13:06:09 +0200573 libraries=time_libs) )
Victor Stinner5d272cc2012-03-13 13:35:55 +0100574 exts.append( Extension('_datetime', ['_datetimemodule.c']) )
Christian Heimesfe337bf2008-03-23 21:54:12 +0000575 # random number generator implemented in C
576 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000577 # bisect
578 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000579 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000580 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Alexandre Vassalottica2d6102008-06-12 18:26:05 +0000581 # C-optimized pickle replacement
582 exts.append( Extension("_pickle", ["_pickle.c"]) )
Collin Winter670e6922007-03-21 02:57:17 +0000583 # atexit
584 exts.append( Extension("atexit", ["atexitmodule.c"]) )
Christian Heimes90540002008-05-08 14:29:10 +0000585 # _json speedups
586 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000587 # Python C API test module
Mark Dickinsona06f44b2009-02-10 16:18:22 +0000588 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
589 depends=['testcapi_long.h']) )
Stefan Krah9a2d99e2012-02-25 12:24:21 +0100590 # Python PEP-3118 (buffer protocol) test module
591 exts.append( Extension('_testbuffer', ['_testbuffer.c']) )
Andrew Svetlov6b2cbeb2012-12-14 17:04:59 +0200592 # Test loading multiple modules from one compiled file (http://bugs.python.org/issue16421)
593 exts.append( Extension('_testimportmultiple', ['_testimportmultiple.c']) )
Fred Drake0e474a82007-10-11 18:01:43 +0000594 # profiler (_lsprof is for cProfile.py)
Armin Rigoa871ef22006-02-08 12:53:56 +0000595 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000596 # static Unicode character database
Walter Dörwalde9eaab42007-05-22 16:02:13 +0000597 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000598
599 # Modules with some UNIX dependencies -- on by default:
600 # (If you have a really backward UNIX, select and socket may not be
601 # supported...)
602
603 # fcntl(2) and ioctl(2)
Antoine Pitroua3000072010-09-07 14:52:42 +0000604 libs = []
605 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
606 # May be necessary on AIX for flock function
607 libs = ['bsd']
608 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren94f25282010-05-05 19:11:21 +0000609 # pwd(3)
610 exts.append( Extension('pwd', ['pwdmodule.c']) )
611 # grp(3)
612 exts.append( Extension('grp', ['grpmodule.c']) )
613 # spwd, shadow passwords
614 if (config_h_vars.get('HAVE_GETSPNAM', False) or
615 config_h_vars.get('HAVE_GETSPENT', False)):
616 exts.append( Extension('spwd', ['spwdmodule.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000617 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000618 missing.append('spwd')
Guido van Rossumd8faa362007-04-27 19:54:29 +0000619
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000620 # select(2); not on ancient System V
621 exts.append( Extension('select', ['selectmodule.c']) )
622
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000623 # Fred Drake's interface to the Python parser
624 exts.append( Extension('parser', ['parsermodule.c']) )
625
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000626 # Memory-mapped files (also works on Win32).
Ronald Oussoren94f25282010-05-05 19:11:21 +0000627 exts.append( Extension('mmap', ['mmapmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000628
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000629 # Lance Ellinghaus's syslog module
Ronald Oussoren94f25282010-05-05 19:11:21 +0000630 # syslog daemon interface
631 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000632
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000633 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000634 # Here ends the simple stuff. From here on, modules need certain
635 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000636 #
637
638 # Multimedia modules
639 # These don't work for 64-bit platforms!!!
640 # These represent audio samples or images as strings:
641
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000642 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000643 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000644 # 64-bit platforms.
645 exts.append( Extension('audioop', ['audioop.c']) )
646
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000647 # readline
Tarek Ziadé36797272010-07-22 12:50:05 +0000648 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah095b2732010-06-08 13:41:44 +0000649 readline_termcap_library = ""
650 curses_library = ""
doko@ubuntu.com58844492012-06-30 18:25:32 +0200651 # Cannot use os.popen here in py3k.
652 tmpfile = os.path.join(self.build_temp, 'readline_termcap_lib')
653 if not os.path.exists(self.build_temp):
654 os.makedirs(self.build_temp)
Stefan Krah095b2732010-06-08 13:41:44 +0000655 # Determine if readline is already linked against curses or tinfo.
doko@ubuntu.com58844492012-06-30 18:25:32 +0200656 if do_readline:
657 if cross_compiling:
658 ret = os.system("%s -d %s | grep '(NEEDED)' > %s" \
659 % (sysconfig.get_config_var('READELF'),
660 do_readline, tmpfile))
661 elif find_executable('ldd'):
662 ret = os.system("ldd %s > %s" % (do_readline, tmpfile))
663 else:
664 ret = 256
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200665 if ret >> 8 == 0:
Brett Cannon9f5db072010-10-29 20:19:27 +0000666 with open(tmpfile) as fp:
667 for ln in fp:
668 if 'curses' in ln:
669 readline_termcap_library = re.sub(
670 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
671 ).rstrip()
672 break
673 # termcap interface split out from ncurses
674 if 'tinfo' in ln:
675 readline_termcap_library = 'tinfo'
676 break
doko@ubuntu.com4c990712012-06-30 23:28:09 +0200677 if os.path.exists(tmpfile):
678 os.unlink(tmpfile)
Stefan Krah095b2732010-06-08 13:41:44 +0000679 # Issue 7384: If readline is already linked against curses,
680 # use the same library for the readline and curses modules.
681 if 'curses' in readline_termcap_library:
682 curses_library = readline_termcap_library
Tarek Ziadé36797272010-07-22 12:50:05 +0000683 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah095b2732010-06-08 13:41:44 +0000684 curses_library = 'ncursesw'
Tarek Ziadé36797272010-07-22 12:50:05 +0000685 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000686 curses_library = 'ncurses'
Tarek Ziadé36797272010-07-22 12:50:05 +0000687 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah095b2732010-06-08 13:41:44 +0000688 curses_library = 'curses'
689
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200690 if host_platform == 'darwin':
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000691 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren961683a2010-03-08 07:09:59 +0000692 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
693 if dep_target and dep_target.split('.') < ['10', '5']:
694 os_release = 8
Ronald Oussoren2efd9242009-09-20 14:53:22 +0000695 if os_release < 9:
696 # MacOSX 10.4 has a broken readline. Don't try to build
697 # the readline module unless the user has installed a fixed
698 # readline package
699 if find_file('readline/rlconf.h', inc_dirs, []) is None:
700 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000701 if do_readline:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200702 if host_platform == 'darwin' and os_release < 9:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000703 # In every directory on the search path search for a dynamic
704 # library and then a static library, instead of first looking
Fred Drake0af17612007-09-04 19:43:19 +0000705 # for dynamic libraries on the entire path.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000706 # This way a staticly linked custom readline gets picked up
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000707 # before the (possibly broken) dynamic library in /usr/lib.
Thomas Wouters477c8d52006-05-27 19:21:47 +0000708 readline_extra_link_args = ('-Wl,-search_paths_first',)
709 else:
710 readline_extra_link_args = ()
711
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000712 readline_libs = ['readline']
Stefan Krah095b2732010-06-08 13:41:44 +0000713 if readline_termcap_library:
714 pass # Issue 7384: Already linked against curses or tinfo.
715 elif curses_library:
716 readline_libs.append(curses_library)
Tarek Ziadé36797272010-07-22 12:50:05 +0000717 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadédd07ebb2009-07-06 13:52:17 +0000718 ['/usr/lib/termcap'],
719 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000720 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000721 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000722 library_dirs=['/usr/lib/termcap'],
Thomas Wouters477c8d52006-05-27 19:21:47 +0000723 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000724 libraries=readline_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000725 else:
726 missing.append('readline')
727
Ronald Oussoren94f25282010-05-05 19:11:21 +0000728 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000729
Tarek Ziadé36797272010-07-22 12:50:05 +0000730 if self.compiler.find_library_file(lib_dirs, 'crypt'):
Ronald Oussoren94f25282010-05-05 19:11:21 +0000731 libs = ['crypt']
Guido van Rossumd8faa362007-04-27 19:54:29 +0000732 else:
Ronald Oussoren94f25282010-05-05 19:11:21 +0000733 libs = []
Sean Reifscheidere2dfefb2011-02-22 10:55:44 +0000734 exts.append( Extension('_crypt', ['_cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000735
Skip Montanaroba9e9782003-03-20 23:34:22 +0000736 # CSV files
737 exts.append( Extension('_csv', ['_csv.c']) )
738
Gregory P. Smithfb94c5f2010-03-14 06:49:55 +0000739 # POSIX subprocess module helper.
740 exts.append( Extension('_posixsubprocess', ['_posixsubprocess.c']) )
741
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000742 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000743 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000744 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000745 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000746 search_for_ssl_incs_in = [
747 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000748 '/usr/contrib/ssl/include/'
749 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000750 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
751 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000752 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000753 if ssl_incs is not None:
754 krb5_h = find_file('krb5.h', inc_dirs,
755 ['/usr/kerberos/include'])
756 if krb5_h:
757 ssl_incs += krb5_h
Tarek Ziadé36797272010-07-22 12:50:05 +0000758 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000759 ['/usr/local/ssl/lib',
760 '/usr/contrib/ssl/lib/'
761 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000762
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000763 if (ssl_incs is not None and
764 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000765 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000766 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000767 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000768 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000769 depends = ['socketmodule.h']), )
Guido van Rossumd8faa362007-04-27 19:54:29 +0000770 else:
771 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000772
Gregory P. Smithade97332005-08-23 21:19:40 +0000773 # find out which version of OpenSSL we have
774 openssl_ver = 0
775 openssl_ver_re = re.compile(
776 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000777
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000778 # look for the openssl version header on the compiler search path.
779 opensslv_h = find_file('openssl/opensslv.h', [],
780 inc_dirs + search_for_ssl_incs_in)
781 if opensslv_h:
782 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200783 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000784 name = os.path.join(macosx_sdk_root(), name[1:])
785 try:
Brett Cannon9f5db072010-10-29 20:19:27 +0000786 with open(name, 'r') as incfile:
787 for line in incfile:
788 m = openssl_ver_re.match(line)
789 if m:
Antoine Pitrou2463e5f2013-03-28 22:24:43 +0100790 openssl_ver = int(m.group(1), 16)
791 break
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000792 except IOError as msg:
793 print("IOError while reading opensshv.h:", msg)
Gregory P. Smithade97332005-08-23 21:19:40 +0000794
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000795 #print('openssl_ver = 0x%08x' % openssl_ver)
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000796 min_openssl_ver = 0x00907000
797 have_any_openssl = ssl_incs is not None and ssl_libs is not None
798 have_usable_openssl = (have_any_openssl and
799 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000800
Gregory P. Smithb04ded42010-01-03 00:38:10 +0000801 if have_any_openssl:
802 if have_usable_openssl:
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000803 # The _hashlib module wraps optimized implementations
804 # of hash functions from the OpenSSL library.
805 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
Gregory P. Smith5af7fba2010-01-03 14:51:13 +0000806 depends = ['hashlib.h'],
Guido van Rossumeb1cf4e2007-08-17 17:14:17 +0000807 include_dirs = ssl_incs,
808 library_dirs = ssl_libs,
809 libraries = ['ssl', 'crypto']) )
810 else:
811 print("warning: openssl 0x%08x is too old for _hashlib" %
812 openssl_ver)
813 missing.append('_hashlib')
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000814
Antoine Pitrou019ff192012-05-16 16:41:26 +0200815 # We always compile these even when OpenSSL is available (issue #14693).
816 # It's harmless and the object code is tiny (40-50 KB per module,
817 # only loaded when actually used).
818 exts.append( Extension('_sha256', ['sha256module.c'],
819 depends=['hashlib.h']) )
820 exts.append( Extension('_sha512', ['sha512module.c'],
821 depends=['hashlib.h']) )
822 exts.append( Extension('_md5', ['md5module.c'],
823 depends=['hashlib.h']) )
824 exts.append( Extension('_sha1', ['sha1module.c'],
825 depends=['hashlib.h']) )
Gregory P. Smith2f21eb32007-09-09 06:44:34 +0000826
Christian Heimes4a0270d2012-10-06 02:23:36 +0200827 # SHA-3 (Keccak) module
828 sha3_depends = ['hashlib.h']
829 keccak = os.path.join(os.getcwd(), srcdir, 'Modules', '_sha3',
830 'keccak')
831 for pattern in ('*.c', '*.h', '*.macros'):
832 sha3_depends.extend(glob(os.path.join(keccak, pattern)))
833 exts.append(Extension("_sha3", ["_sha3/sha3module.c"],
834 depends=sha3_depends))
835
Georg Brandl489cb4f2009-07-11 10:08:49 +0000836 # Modules that provide persistent dictionary-like semantics. You will
837 # probably want to arrange for at least one of them to be available on
838 # your machine, though none are defined by default because of library
839 # dependencies. The Python module dbm/__init__.py provides an
840 # implementation independent wrapper for these; dbm/dumb.py provides
841 # similar functionality (but slower of course) implemented in Python.
842
843 # Sleepycat^WOracle Berkeley DB interface.
844 # http://www.oracle.com/database/berkeley-db/db/index.html
845 #
846 # This requires the Sleepycat^WOracle DB code. The supported versions
847 # are set below. Visit the URL above to download
848 # a release. Most open source OSes come with one or more
849 # versions of BerkeleyDB already installed.
850
doko@ubuntu.com15bac0f2012-07-01 10:35:54 +0200851 max_db_ver = (5, 3)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000852 min_db_ver = (3, 3)
853 db_setup_debug = False # verbose debug prints from this script?
854
855 def allow_db_ver(db_ver):
856 """Returns a boolean if the given BerkeleyDB version is acceptable.
857
858 Args:
859 db_ver: A tuple of the version to verify.
860 """
861 if not (min_db_ver <= db_ver <= max_db_ver):
862 return False
863 return True
864
865 def gen_db_minor_ver_nums(major):
866 if major == 4:
867 for x in range(max_db_ver[1]+1):
868 if allow_db_ver((4, x)):
869 yield x
870 elif major == 3:
871 for x in (3,):
872 if allow_db_ver((3, x)):
873 yield x
874 else:
875 raise ValueError("unknown major BerkeleyDB version", major)
876
877 # construct a list of paths to look for the header file in on
878 # top of the normal inc_dirs.
879 db_inc_paths = [
880 '/usr/include/db4',
881 '/usr/local/include/db4',
882 '/opt/sfw/include/db4',
883 '/usr/include/db3',
884 '/usr/local/include/db3',
885 '/opt/sfw/include/db3',
886 # Fink defaults (http://fink.sourceforge.net/)
887 '/sw/include/db4',
888 '/sw/include/db3',
889 ]
890 # 4.x minor number specific paths
891 for x in gen_db_minor_ver_nums(4):
892 db_inc_paths.append('/usr/include/db4%d' % x)
893 db_inc_paths.append('/usr/include/db4.%d' % x)
894 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
895 db_inc_paths.append('/usr/local/include/db4%d' % x)
896 db_inc_paths.append('/pkg/db-4.%d/include' % x)
897 db_inc_paths.append('/opt/db-4.%d/include' % x)
898 # MacPorts default (http://www.macports.org/)
899 db_inc_paths.append('/opt/local/include/db4%d' % x)
900 # 3.x minor number specific paths
901 for x in gen_db_minor_ver_nums(3):
902 db_inc_paths.append('/usr/include/db3%d' % x)
903 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
904 db_inc_paths.append('/usr/local/include/db3%d' % x)
905 db_inc_paths.append('/pkg/db-3.%d/include' % x)
906 db_inc_paths.append('/opt/db-3.%d/include' % x)
907
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +0200908 if cross_compiling:
909 db_inc_paths = []
910
Georg Brandl489cb4f2009-07-11 10:08:49 +0000911 # Add some common subdirectories for Sleepycat DB to the list,
912 # based on the standard include directories. This way DB3/4 gets
913 # picked up when it is installed in a non-standard prefix and
914 # the user has added that prefix into inc_dirs.
915 std_variants = []
916 for dn in inc_dirs:
917 std_variants.append(os.path.join(dn, 'db3'))
918 std_variants.append(os.path.join(dn, 'db4'))
919 for x in gen_db_minor_ver_nums(4):
920 std_variants.append(os.path.join(dn, "db4%d"%x))
921 std_variants.append(os.path.join(dn, "db4.%d"%x))
922 for x in gen_db_minor_ver_nums(3):
923 std_variants.append(os.path.join(dn, "db3%d"%x))
924 std_variants.append(os.path.join(dn, "db3.%d"%x))
925
926 db_inc_paths = std_variants + db_inc_paths
927 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
928
929 db_ver_inc_map = {}
930
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200931 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000932 sysroot = macosx_sdk_root()
933
Georg Brandl489cb4f2009-07-11 10:08:49 +0000934 class db_found(Exception): pass
935 try:
936 # See whether there is a Sleepycat header in the standard
937 # search path.
938 for d in inc_dirs + db_inc_paths:
939 f = os.path.join(d, "db.h")
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200940 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000941 f = os.path.join(sysroot, d[1:], "db.h")
942
Georg Brandl489cb4f2009-07-11 10:08:49 +0000943 if db_setup_debug: print("db: looking for db.h in", f)
944 if os.path.exists(f):
Brett Cannon9f5db072010-10-29 20:19:27 +0000945 with open(f, 'rb') as file:
946 f = file.read()
Benjamin Peterson019f3612009-08-12 18:18:03 +0000947 m = re.search(br"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000948 if m:
949 db_major = int(m.group(1))
Benjamin Peterson019f3612009-08-12 18:18:03 +0000950 m = re.search(br"#define\WDB_VERSION_MINOR\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000951 db_minor = int(m.group(1))
952 db_ver = (db_major, db_minor)
953
954 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
955 if db_ver == (4, 6):
Benjamin Peterson019f3612009-08-12 18:18:03 +0000956 m = re.search(br"#define\WDB_VERSION_PATCH\W(\d+)", f)
Georg Brandl489cb4f2009-07-11 10:08:49 +0000957 db_patch = int(m.group(1))
958 if db_patch < 21:
959 print("db.h:", db_ver, "patch", db_patch,
960 "being ignored (4.6.x must be >= 4.6.21)")
961 continue
962
963 if ( (db_ver not in db_ver_inc_map) and
964 allow_db_ver(db_ver) ):
965 # save the include directory with the db.h version
966 # (first occurrence only)
967 db_ver_inc_map[db_ver] = d
968 if db_setup_debug:
969 print("db.h: found", db_ver, "in", d)
970 else:
971 # we already found a header for this library version
972 if db_setup_debug: print("db.h: ignoring", d)
973 else:
974 # ignore this header, it didn't contain a version number
975 if db_setup_debug:
976 print("db.h: no version number version in", d)
977
978 db_found_vers = list(db_ver_inc_map.keys())
979 db_found_vers.sort()
980
981 while db_found_vers:
982 db_ver = db_found_vers.pop()
983 db_incdir = db_ver_inc_map[db_ver]
984
985 # check lib directories parallel to the location of the header
986 db_dirs_to_check = [
987 db_incdir.replace("include", 'lib64'),
988 db_incdir.replace("include", 'lib'),
989 ]
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000990
doko@ubuntu.com93df16b2012-06-30 14:32:08 +0200991 if host_platform != 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +0000992 db_dirs_to_check = list(filter(os.path.isdir, db_dirs_to_check))
993
994 else:
995 # Same as other branch, but takes OSX SDK into account
996 tmp = []
997 for dn in db_dirs_to_check:
998 if is_macosx_sdk_path(dn):
999 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1000 tmp.append(dn)
1001 else:
1002 if os.path.isdir(dn):
1003 tmp.append(dn)
Ronald Oussorendc969e52010-06-27 12:37:46 +00001004 db_dirs_to_check = tmp
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001005
1006 db_dirs_to_check = tmp
Georg Brandl489cb4f2009-07-11 10:08:49 +00001007
Ezio Melotti42da6632011-03-15 05:18:48 +02001008 # Look for a version specific db-X.Y before an ambiguous dbX
Georg Brandl489cb4f2009-07-11 10:08:49 +00001009 # XXX should we -ever- look for a dbX name? Do any
1010 # systems really not name their library by version and
1011 # symlink to more general names?
1012 for dblib in (('db-%d.%d' % db_ver),
1013 ('db%d%d' % db_ver),
1014 ('db%d' % db_ver[0])):
1015 dblib_file = self.compiler.find_library_file(
1016 db_dirs_to_check + lib_dirs, dblib )
1017 if dblib_file:
1018 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1019 raise db_found
1020 else:
1021 if db_setup_debug: print("db lib: ", dblib, "not found")
1022
1023 except db_found:
1024 if db_setup_debug:
1025 print("bsddb using BerkeleyDB lib:", db_ver, dblib)
1026 print("bsddb lib dir:", dblib_dir, " inc dir:", db_incdir)
1027 db_incs = [db_incdir]
1028 dblibs = [dblib]
1029 else:
1030 if db_setup_debug: print("db: no appropriate library found")
1031 db_incs = None
1032 dblibs = []
1033 dblib_dir = None
1034
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001035 # The sqlite interface
Thomas Wouters89f507f2006-12-13 04:49:30 +00001036 sqlite_setup_debug = False # verbose debug prints from this script?
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001037
1038 # We hunt for #define SQLITE_VERSION "n.n.n"
1039 # We need to find >= sqlite version 3.0.8
1040 sqlite_incdir = sqlite_libdir = None
1041 sqlite_inc_paths = [ '/usr/include',
1042 '/usr/include/sqlite',
1043 '/usr/include/sqlite3',
1044 '/usr/local/include',
1045 '/usr/local/include/sqlite',
1046 '/usr/local/include/sqlite3',
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001047 ]
1048 if cross_compiling:
1049 sqlite_inc_paths = []
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001050 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1051 MIN_SQLITE_VERSION = ".".join([str(x)
1052 for x in MIN_SQLITE_VERSION_NUMBER])
Thomas Wouters477c8d52006-05-27 19:21:47 +00001053
1054 # Scan the default include directories before the SQLite specific
1055 # ones. This allows one to override the copy of sqlite on OSX,
1056 # where /usr/include contains an old version of sqlite.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001057 if host_platform == 'darwin':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001058 sysroot = macosx_sdk_root()
1059
Ned Deily9b635832012-08-05 15:13:33 -07001060 for d_ in inc_dirs + sqlite_inc_paths:
1061 d = d_
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001062 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily9b635832012-08-05 15:13:33 -07001063 d = os.path.join(sysroot, d[1:])
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001064
Ned Deily9b635832012-08-05 15:13:33 -07001065 f = os.path.join(d, "sqlite3.h")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001066 if os.path.exists(f):
Guido van Rossum452bf512007-02-09 05:32:43 +00001067 if sqlite_setup_debug: print("sqlite: found %s"%f)
Brett Cannon9f5db072010-10-29 20:19:27 +00001068 with open(f) as file:
1069 incf = file.read()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001070 m = re.search(
Petri Lehtinened909bc2013-02-23 17:05:28 +01001071 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001072 if m:
1073 sqlite_version = m.group(1)
1074 sqlite_version_tuple = tuple([int(x)
1075 for x in sqlite_version.split(".")])
1076 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
1077 # we win!
Thomas Wouters89f507f2006-12-13 04:49:30 +00001078 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001079 print("%s/sqlite3.h: version %s"%(d, sqlite_version))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001080 sqlite_incdir = d
1081 break
1082 else:
1083 if sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001084 print("%s: version %d is too old, need >= %s"%(d,
1085 sqlite_version, MIN_SQLITE_VERSION))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001086 elif sqlite_setup_debug:
Guido van Rossum452bf512007-02-09 05:32:43 +00001087 print("sqlite: %s had no SQLITE_VERSION"%(f,))
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001088
1089 if sqlite_incdir:
1090 sqlite_dirs_to_check = [
1091 os.path.join(sqlite_incdir, '..', 'lib64'),
1092 os.path.join(sqlite_incdir, '..', 'lib'),
1093 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1094 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1095 ]
Tarek Ziadé36797272010-07-22 12:50:05 +00001096 sqlite_libfile = self.compiler.find_library_file(
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001097 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Benjamin Petersonf10a79a2008-10-11 00:49:57 +00001098 if sqlite_libfile:
1099 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001100
1101 if sqlite_incdir and sqlite_libdir:
Thomas Wouters477c8d52006-05-27 19:21:47 +00001102 sqlite_srcs = ['_sqlite/cache.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001103 '_sqlite/connection.c',
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001104 '_sqlite/cursor.c',
1105 '_sqlite/microprotocols.c',
1106 '_sqlite/module.c',
1107 '_sqlite/prepare_protocol.c',
1108 '_sqlite/row.c',
1109 '_sqlite/statement.c',
1110 '_sqlite/util.c', ]
1111
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001112 sqlite_defines = []
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001113 if host_platform != "win32":
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001114 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
1115 else:
1116 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1117
Benjamin Peterson076ed002010-10-31 17:11:02 +00001118 # Enable support for loadable extensions in the sqlite3 module
1119 # if --enable-loadable-sqlite-extensions configure option is used.
1120 if '--enable-loadable-sqlite-extensions' not in sysconfig.get_config_var("CONFIG_ARGS"):
1121 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Thomas Wouters477c8d52006-05-27 19:21:47 +00001122
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001123 if host_platform == 'darwin':
Thomas Wouters477c8d52006-05-27 19:21:47 +00001124 # In every directory on the search path search for a dynamic
1125 # library and then a static library, instead of first looking
Ezio Melotti13925002011-03-16 11:05:33 +02001126 # for dynamic libraries on the entire path.
1127 # This way a statically linked custom sqlite gets picked up
Thomas Wouters477c8d52006-05-27 19:21:47 +00001128 # before the dynamic library in /usr/lib.
1129 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1130 else:
1131 sqlite_extra_link_args = ()
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001132
Brett Cannonc5011fe2011-06-06 20:09:10 -07001133 include_dirs = ["Modules/_sqlite"]
1134 # Only include the directory where sqlite was found if it does
1135 # not already exist in set include directories, otherwise you
1136 # can end up with a bad search path order.
1137 if sqlite_incdir not in self.compiler.include_dirs:
1138 include_dirs.append(sqlite_incdir)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001139 exts.append(Extension('_sqlite3', sqlite_srcs,
1140 define_macros=sqlite_defines,
Brett Cannonc5011fe2011-06-06 20:09:10 -07001141 include_dirs=include_dirs,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001142 library_dirs=sqlite_libdir,
1143 runtime_library_dirs=sqlite_libdir,
Thomas Wouters477c8d52006-05-27 19:21:47 +00001144 extra_link_args=sqlite_extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001145 libraries=["sqlite3",]))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001146 else:
1147 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001148
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001149 dbm_setup_debug = False # verbose debug prints from this script?
Benjamin Petersond78735d2010-01-01 16:04:23 +00001150 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001151 # The standard Unix dbm module:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001152 if host_platform not in ['cygwin']:
Matthias Klose55708cc2009-04-30 08:06:49 +00001153 config_args = [arg.strip("'")
1154 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersond78735d2010-01-01 16:04:23 +00001155 dbm_args = [arg for arg in config_args
Matthias Klose55708cc2009-04-30 08:06:49 +00001156 if arg.startswith('--with-dbmliborder=')]
1157 if dbm_args:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001158 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001159 else:
Georg Brandl489cb4f2009-07-11 10:08:49 +00001160 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose55708cc2009-04-30 08:06:49 +00001161 dbmext = None
1162 for cand in dbm_order:
1163 if cand == "ndbm":
1164 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan50f147a2012-06-17 18:27:11 +10001165 # Some systems have -lndbm, others have -lgdbm_compat,
1166 # others don't have either
Tarek Ziadé36797272010-07-22 12:50:05 +00001167 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001168 'ndbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001169 ndbm_libs = ['ndbm']
Nick Coghlan50f147a2012-06-17 18:27:11 +10001170 elif self.compiler.find_library_file(lib_dirs,
1171 'gdbm_compat'):
1172 ndbm_libs = ['gdbm_compat']
Matthias Klose55708cc2009-04-30 08:06:49 +00001173 else:
1174 ndbm_libs = []
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001175 if dbm_setup_debug: print("building dbm using ndbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001176 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1177 define_macros=[
1178 ('HAVE_NDBM_H',None),
1179 ],
1180 libraries=ndbm_libs)
1181 break
1182
1183 elif cand == "gdbm":
Tarek Ziadé36797272010-07-22 12:50:05 +00001184 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001185 gdbm_libs = ['gdbm']
Tarek Ziadé36797272010-07-22 12:50:05 +00001186 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001187 'gdbm_compat'):
Matthias Klose55708cc2009-04-30 08:06:49 +00001188 gdbm_libs.append('gdbm_compat')
1189 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001190 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001191 dbmext = Extension(
1192 '_dbm', ['_dbmmodule.c'],
1193 define_macros=[
1194 ('HAVE_GDBM_NDBM_H', None),
1195 ],
1196 libraries = gdbm_libs)
1197 break
1198 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001199 if dbm_setup_debug: print("building dbm using gdbm")
Matthias Klose55708cc2009-04-30 08:06:49 +00001200 dbmext = Extension(
1201 '_dbm', ['_dbmmodule.c'],
1202 define_macros=[
1203 ('HAVE_GDBM_DASH_NDBM_H', None),
1204 ],
1205 libraries = gdbm_libs)
1206 break
Georg Brandl489cb4f2009-07-11 10:08:49 +00001207 elif cand == "bdb":
1208 if db_incs is not None:
Ross Lagerwall0b63b562012-04-15 08:19:35 +02001209 if dbm_setup_debug: print("building dbm using bdb")
Georg Brandl489cb4f2009-07-11 10:08:49 +00001210 dbmext = Extension('_dbm', ['_dbmmodule.c'],
1211 library_dirs=dblib_dir,
1212 runtime_library_dirs=dblib_dir,
1213 include_dirs=db_incs,
1214 define_macros=[
1215 ('HAVE_BERKDB_H', None),
1216 ('DB_DBM_HSEARCH', None),
1217 ],
1218 libraries=dblibs)
Matthias Klose55708cc2009-04-30 08:06:49 +00001219 break
1220 if dbmext is not None:
1221 exts.append(dbmext)
Guido van Rossumd8faa362007-04-27 19:54:29 +00001222 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001223 missing.append('_dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001224
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001225 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersond78735d2010-01-01 16:04:23 +00001226 if ('gdbm' in dbm_order and
Tarek Ziadé36797272010-07-22 12:50:05 +00001227 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001228 exts.append( Extension('_gdbm', ['_gdbmmodule.c'],
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001229 libraries = ['gdbm'] ) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001230 else:
Georg Brandl0a7ac7d2008-05-26 10:29:35 +00001231 missing.append('_gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001232
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001233 # Unix-only modules
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001234 if host_platform != 'win32':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001235 # Steen Lumholt's termios module
1236 exts.append( Extension('termios', ['termios.c']) )
1237 # Jeremy Hylton's rlimit interface
Antoine Pitrou6103ab12009-10-24 20:11:21 +00001238 exts.append( Extension('resource', ['resource.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001239
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001240 # Sun yellow pages. Some systems have the functions in libc.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001241 if (host_platform not in ['cygwin', 'qnx6'] and
Benjamin Peterson588009e2009-12-30 03:03:54 +00001242 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé36797272010-07-22 12:50:05 +00001243 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001244 libs = ['nsl']
1245 else:
1246 libs = []
1247 exts.append( Extension('nis', ['nismodule.c'],
1248 libraries = libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001249 else:
1250 missing.append('nis')
1251 else:
1252 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001253
Skip Montanaro72092942004-02-07 12:50:19 +00001254 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001255 # provided by the ncurses library.
Victor Stinneraa35b002011-11-29 00:08:12 +01001256 curses_defines = []
Victor Stinner756c6ec2011-11-27 00:19:53 +01001257 curses_includes = []
Victor Stinneraa35b002011-11-29 00:08:12 +01001258 panel_library = 'panel'
1259 if curses_library == 'ncursesw':
1260 curses_defines.append(('HAVE_NCURSESW', '1'))
1261 curses_includes.append('/usr/include/ncursesw')
1262 # Bug 1464056: If _curses.so links with ncursesw,
1263 # _curses_panel.so must link with panelw.
1264 panel_library = 'panelw'
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001265 if host_platform == 'darwin':
Ned Deily69192232012-06-20 23:47:14 -07001266 # On OS X, there is no separate /usr/lib/libncursesw nor
1267 # libpanelw. If we are here, we found a locally-supplied
1268 # version of libncursesw. There should be also be a
1269 # libpanelw. _XOPEN_SOURCE defines are usually excluded
1270 # for OS X but we need _XOPEN_SOURCE_EXTENDED here for
1271 # ncurses wide char support
1272 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001273 elif host_platform == 'darwin' and curses_library == 'ncurses':
Ned Deily69192232012-06-20 23:47:14 -07001274 # Building with the system-suppied combined libncurses/libpanel
1275 curses_defines.append(('HAVE_NCURSESW', '1'))
1276 curses_defines.append(('_XOPEN_SOURCE_EXTENDED', '1'))
Victor Stinneraa35b002011-11-29 00:08:12 +01001277
Stefan Krah095b2732010-06-08 13:41:44 +00001278 if curses_library.startswith('ncurses'):
Stefan Krah095b2732010-06-08 13:41:44 +00001279 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001280 exts.append( Extension('_curses', ['_cursesmodule.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001281 include_dirs=curses_includes,
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001282 define_macros=curses_defines,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001283 libraries = curses_libs) )
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001284 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001285 # OSX has an old Berkeley curses, not good enough for
1286 # the _curses module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001287 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001288 curses_libs = ['curses', 'terminfo']
Tarek Ziadé36797272010-07-22 12:50:05 +00001289 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001290 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001291 else:
1292 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001293
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001294 exts.append( Extension('_curses', ['_cursesmodule.c'],
Nadeem Vawda9e2e9902011-07-31 15:01:11 +02001295 define_macros=curses_defines,
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001296 libraries = curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001297 else:
1298 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001299
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001300 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001301 if (module_enabled(exts, '_curses') and
Tarek Ziadé36797272010-07-22 12:50:05 +00001302 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001303 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Victor Stinner756c6ec2011-11-27 00:19:53 +01001304 include_dirs=curses_includes,
Ned Deily69192232012-06-20 23:47:14 -07001305 define_macros=curses_defines,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001306 libraries = [panel_library] + curses_libs) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001307 else:
1308 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001309
Barry Warsaw259b1e12002-08-13 20:09:26 +00001310 # Andrew Kuchling's zlib module. Note that some versions of zlib
1311 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1312 # http://www.cert.org/advisories/CA-2002-07.html
1313 #
1314 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1315 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1316 # now, we still accept 1.1.3, because we think it's difficult to
1317 # exploit this in Python, and we'd rather make it RedHat's problem
1318 # than our problem <wink>.
1319 #
1320 # You can upgrade zlib to version 1.1.4 yourself by going to
1321 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001322 zlib_inc = find_file('zlib.h', [], inc_dirs)
Christian Heimes1dc54002008-03-24 02:19:29 +00001323 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001324 if zlib_inc is not None:
1325 zlib_h = zlib_inc[0] + '/zlib.h'
1326 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001327 version_req = '"1.1.3"'
Brett Cannon9f5db072010-10-29 20:19:27 +00001328 with open(zlib_h) as fp:
1329 while 1:
1330 line = fp.readline()
1331 if not line:
1332 break
1333 if line.startswith('#define ZLIB_VERSION'):
1334 version = line.split()[2]
1335 break
Guido van Rossume6970912001-04-15 15:16:12 +00001336 if version >= version_req:
Tarek Ziadé36797272010-07-22 12:50:05 +00001337 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001338 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001339 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1340 else:
1341 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001342 exts.append( Extension('zlib', ['zlibmodule.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001343 libraries = ['z'],
1344 extra_link_args = zlib_extra_link_args))
Christian Heimes1dc54002008-03-24 02:19:29 +00001345 have_zlib = True
Guido van Rossumd8faa362007-04-27 19:54:29 +00001346 else:
1347 missing.append('zlib')
1348 else:
1349 missing.append('zlib')
1350 else:
1351 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001352
Christian Heimes1dc54002008-03-24 02:19:29 +00001353 # Helper module for various ascii-encoders. Uses zlib for an optimized
1354 # crc32 if we have it. Otherwise binascii uses its own.
1355 if have_zlib:
1356 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1357 libraries = ['z']
1358 extra_link_args = zlib_extra_link_args
1359 else:
1360 extra_compile_args = []
1361 libraries = []
1362 extra_link_args = []
1363 exts.append( Extension('binascii', ['binascii.c'],
1364 extra_compile_args = extra_compile_args,
1365 libraries = libraries,
1366 extra_link_args = extra_link_args) )
1367
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001368 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé36797272010-07-22 12:50:05 +00001369 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001370 if host_platform == "darwin":
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001371 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1372 else:
1373 bz2_extra_link_args = ()
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001374 exts.append( Extension('_bz2', ['_bz2module.c'],
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001375 libraries = ['bz2'],
1376 extra_link_args = bz2_extra_link_args) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001377 else:
Antoine Pitrou37dc5f82011-04-03 17:05:46 +02001378 missing.append('_bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001379
Nadeem Vawda3ff069e2011-11-30 00:25:06 +02001380 # LZMA compression support.
1381 if self.compiler.find_library_file(lib_dirs, 'lzma'):
1382 exts.append( Extension('_lzma', ['_lzmamodule.c'],
1383 libraries = ['lzma']) )
1384 else:
1385 missing.append('_lzma')
1386
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001387 # Interface to the Expat XML parser
1388 #
Benjamin Petersona28e7022010-01-09 18:53:06 +00001389 # Expat was written by James Clark and is now maintained by a group of
1390 # developers on SourceForge; see www.libexpat.org for more information.
1391 # The pyexpat module was written by Paul Prescod after a prototype by
1392 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1393 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Petersonc73206c2010-10-31 16:38:19 +00001394 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001395 #
1396 # More information on Expat can be found at www.libexpat.org.
1397 #
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001398 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1399 expat_inc = []
1400 define_macros = []
1401 expat_lib = ['expat']
1402 expat_sources = []
Christian Heimesd489c7a2013-02-09 17:02:06 +01001403 expat_depends = []
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001404 else:
1405 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1406 define_macros = [
1407 ('HAVE_EXPAT_CONFIG_H', '1'),
1408 ]
1409 expat_lib = []
1410 expat_sources = ['expat/xmlparse.c',
1411 'expat/xmlrole.c',
1412 'expat/xmltok.c']
Christian Heimesd489c7a2013-02-09 17:02:06 +01001413 expat_depends = ['expat/ascii.h',
1414 'expat/asciitab.h',
1415 'expat/expat.h',
1416 'expat/expat_config.h',
1417 'expat/expat_external.h',
1418 'expat/internal.h',
1419 'expat/latin1tab.h',
1420 'expat/utf8tab.h',
1421 'expat/xmlrole.h',
1422 'expat/xmltok.h',
1423 'expat/xmltok_impl.h'
1424 ]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001425
Fred Drake2d59a492003-10-21 15:41:15 +00001426 exts.append(Extension('pyexpat',
1427 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001428 include_dirs = expat_inc,
1429 libraries = expat_lib,
Christian Heimesd489c7a2013-02-09 17:02:06 +01001430 sources = ['pyexpat.c'] + expat_sources,
1431 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001432 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001433
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001434 # Fredrik Lundh's cElementTree module. Note that this also
1435 # uses expat (via the CAPI hook in pyexpat).
1436
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001437 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001438 define_macros.append(('USE_PYEXPAT_CAPI', None))
1439 exts.append(Extension('_elementtree',
1440 define_macros = define_macros,
Benjamin Petersonb2d90462009-12-31 03:23:10 +00001441 include_dirs = expat_inc,
1442 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001443 sources = ['_elementtree.c'],
Christian Heimesd489c7a2013-02-09 17:02:06 +01001444 depends = ['pyexpat.c'] + expat_sources +
1445 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001446 ))
Guido van Rossumd8faa362007-04-27 19:54:29 +00001447 else:
1448 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001449
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001450 # Hye-Shik Chang's CJKCodecs modules.
Walter Dörwalde9eaab42007-05-22 16:02:13 +00001451 exts.append(Extension('_multibytecodec',
1452 ['cjkcodecs/multibytecodec.c']))
1453 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1454 exts.append(Extension('_codecs_%s' % loc,
1455 ['cjkcodecs/_codecs_%s.c' % loc]))
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001456
Stefan Krah1919b7e2012-03-21 18:25:23 +01001457 # Stefan Krah's _decimal module
1458 exts.append(self._decimal_ext())
1459
Thomas Hellercf567c12006-03-08 19:51:58 +00001460 # Thomas Heller's _ctypes module
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001461 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001462
Benjamin Petersone711caf2008-06-11 16:44:04 +00001463 # Richard Oudkerk's multiprocessing module
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001464 if host_platform == 'win32': # Windows
Benjamin Petersone711caf2008-06-11 16:44:04 +00001465 macros = dict()
1466 libraries = ['ws2_32']
1467
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001468 elif host_platform == 'darwin': # Mac OSX
Benjamin Peterson965ce872009-04-05 21:24:58 +00001469 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001470 libraries = []
1471
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001472 elif host_platform == 'cygwin': # Cygwin
Benjamin Peterson965ce872009-04-05 21:24:58 +00001473 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001474 libraries = []
Benjamin Peterson41181742008-07-02 20:22:54 +00001475
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001476 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Benjamin Peterson41181742008-07-02 20:22:54 +00001477 # FreeBSD's P1003.1b semaphore support is very experimental
1478 # and has many known problems. (as of June 2008)
Benjamin Peterson965ce872009-04-05 21:24:58 +00001479 macros = dict()
Benjamin Peterson41181742008-07-02 20:22:54 +00001480 libraries = []
1481
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001482 elif host_platform.startswith('openbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001483 macros = dict()
Benjamin Petersone5384b02008-10-04 22:00:42 +00001484 libraries = []
1485
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001486 elif host_platform.startswith('netbsd'):
Benjamin Peterson965ce872009-04-05 21:24:58 +00001487 macros = dict()
Jesse Noller32d68c22009-03-31 18:48:42 +00001488 libraries = []
1489
Benjamin Petersone711caf2008-06-11 16:44:04 +00001490 else: # Linux and other unices
Benjamin Peterson965ce872009-04-05 21:24:58 +00001491 macros = dict()
Benjamin Petersone711caf2008-06-11 16:44:04 +00001492 libraries = ['rt']
1493
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001494 if host_platform == 'win32':
Benjamin Petersone711caf2008-06-11 16:44:04 +00001495 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1496 '_multiprocessing/semaphore.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001497 ]
1498
1499 else:
1500 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
Benjamin Petersone711caf2008-06-11 16:44:04 +00001501 ]
Mark Dickinsona614f042009-11-28 12:48:43 +00001502 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
1503 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Petersone711caf2008-06-11 16:44:04 +00001504 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1505
Jesse Noller6fd47e22009-01-23 14:09:08 +00001506 if sysconfig.get_config_var('WITH_THREAD'):
1507 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1508 define_macros=list(macros.items()),
1509 include_dirs=["Modules/_multiprocessing"]))
1510 else:
1511 missing.append('_multiprocessing')
Benjamin Petersone711caf2008-06-11 16:44:04 +00001512 # End multiprocessing
Guido van Rossuma9e20242007-03-08 00:43:48 +00001513
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001514 # Platform-specific libraries
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001515 if host_platform.startswith(('linux', 'freebsd', 'gnukfreebsd')):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001516 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Guido van Rossumd8faa362007-04-27 19:54:29 +00001517 else:
1518 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001519
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001520 if host_platform == 'darwin':
Benjamin Petersonebacd262008-05-29 21:09:51 +00001521 exts.append(
1522 Extension('_gestalt', ['_gestalt.c'],
1523 extra_link_args=['-framework', 'Carbon'])
1524 )
Ronald Oussoren84151202010-04-18 20:46:11 +00001525 exts.append(
1526 Extension('_scproxy', ['_scproxy.c'],
1527 extra_link_args=[
1528 '-framework', 'SystemConfiguration',
1529 '-framework', 'CoreFoundation',
1530 ]))
Benjamin Petersonebacd262008-05-29 21:09:51 +00001531
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001532 self.extensions.extend(exts)
1533
1534 # Call the method for detecting whether _tkinter can be compiled
1535 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001536
Guido van Rossumd8faa362007-04-27 19:54:29 +00001537 if '_tkinter' not in [e.name for e in self.extensions]:
1538 missing.append('_tkinter')
1539
1540 return missing
1541
Jack Jansen0b06be72002-06-21 14:48:38 +00001542 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1543 # The _tkinter module, using frameworks. Since frameworks are quite
1544 # different the UNIX search logic is not sharable.
1545 from os.path import join, exists
1546 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001547 '/Library/Frameworks',
Ronald Oussoren5f734f12009-03-04 21:32:48 +00001548 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001549 join(os.getenv('HOME'), '/Library/Frameworks')
1550 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001551
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001552 sysroot = macosx_sdk_root()
1553
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001554 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001555 # bundles.
1556 # XXX distutils should support -F!
1557 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001558 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001559
1560
Jack Jansen0b06be72002-06-21 14:48:38 +00001561 for fw in 'Tcl', 'Tk':
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001562 if is_macosx_sdk_path(F):
1563 if not exists(join(sysroot, F[1:], fw + '.framework')):
1564 break
1565 else:
1566 if not exists(join(F, fw + '.framework')):
1567 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001568 else:
1569 # ok, F is now directory with both frameworks. Continure
1570 # building
1571 break
1572 else:
1573 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1574 # will now resume.
1575 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001576
Jack Jansen0b06be72002-06-21 14:48:38 +00001577 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1578 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001579 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001580 #
1581 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001582 join(F, fw + '.framework', H)
Nick Coghlan650f0d02007-04-15 12:05:43 +00001583 for fw in ('Tcl', 'Tk')
1584 for H in ('Headers', 'Versions/Current/PrivateHeaders')
Jack Jansen0b06be72002-06-21 14:48:38 +00001585 ]
1586
Tim Peters2c60f7a2003-01-29 03:49:43 +00001587 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001588 # complicated search, this is a hard-coded path. It could bail out
1589 # if X11 libs are not found...
1590 include_dirs.append('/usr/X11R6/include')
1591 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1592
Georg Brandlfcaf9102008-07-16 02:17:56 +00001593 # All existing framework builds of Tcl/Tk don't support 64-bit
1594 # architectures.
1595 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1596 archs = re.findall('-arch\s+(\w+)', cflags)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001597
Ronald Oussorend097efe2009-09-15 19:07:58 +00001598 tmpfile = os.path.join(self.build_temp, 'tk.arch')
1599 if not os.path.exists(self.build_temp):
1600 os.makedirs(self.build_temp)
1601
1602 # Note: cannot use os.popen or subprocess here, that
1603 # requires extensions that are not available here.
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001604 if is_macosx_sdk_path(F):
1605 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(os.path.join(sysroot, F[1:]), tmpfile))
1606 else:
1607 os.system("file %s/Tk.framework/Tk | grep 'for architecture' > %s"%(F, tmpfile))
Ronald Oussoren2c12ab12010-06-03 14:42:25 +00001608
Brett Cannon9f5db072010-10-29 20:19:27 +00001609 with open(tmpfile) as fp:
1610 detected_archs = []
1611 for ln in fp:
1612 a = ln.split()[-1]
1613 if a in archs:
1614 detected_archs.append(ln.split()[-1])
Ronald Oussorend097efe2009-09-15 19:07:58 +00001615 os.unlink(tmpfile)
1616
1617 for a in detected_archs:
1618 frameworks.append('-arch')
1619 frameworks.append(a)
Georg Brandlfcaf9102008-07-16 02:17:56 +00001620
Jack Jansen0b06be72002-06-21 14:48:38 +00001621 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1622 define_macros=[('WITH_APPINIT', 1)],
1623 include_dirs = include_dirs,
1624 libraries = [],
Georg Brandlfcaf9102008-07-16 02:17:56 +00001625 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001626 extra_link_args = frameworks,
1627 )
1628 self.extensions.append(ext)
1629 return 1
1630
Tim Peters2c60f7a2003-01-29 03:49:43 +00001631
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001632 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001633 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001634
Jack Jansen0b06be72002-06-21 14:48:38 +00001635 # Rather than complicate the code below, detecting and building
1636 # AquaTk is a separate method. Only one Tkinter will be built on
1637 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001638 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001639 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001640 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001641
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001642 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001643 # The versions with dots are used on Unix, and the versions without
1644 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001645 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polo5d377bd2009-08-16 14:44:14 +00001646 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1647 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé36797272010-07-22 12:50:05 +00001648 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001649 'tk' + version)
Tarek Ziadé36797272010-07-22 12:50:05 +00001650 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001651 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001652 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001653 # Exit the loop when we've found the Tcl/Tk libraries
1654 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001655
Fredrik Lundhade711a2001-01-24 08:00:28 +00001656 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001657 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001658 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001659 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001660 dotversion = version
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001661 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001662 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1663 # but the include subdirs are named like .../include/tcl8.3.
1664 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1665 tcl_include_sub = []
1666 tk_include_sub = []
1667 for dir in inc_dirs:
1668 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1669 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1670 tk_include_sub += tcl_include_sub
1671 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1672 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001673
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001674 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001675 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001676 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001677 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001678
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001679 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001680
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001681 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1682 for dir in tcl_includes + tk_includes:
1683 if dir not in include_dirs:
1684 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001685
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001686 # Check for various platform-specific directories
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001687 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001688 include_dirs.append('/usr/openwin/include')
1689 added_lib_dirs.append('/usr/openwin/lib')
1690 elif os.path.exists('/usr/X11R6/include'):
1691 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001692 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001693 added_lib_dirs.append('/usr/X11R6/lib')
1694 elif os.path.exists('/usr/X11R5/include'):
1695 include_dirs.append('/usr/X11R5/include')
1696 added_lib_dirs.append('/usr/X11R5/lib')
1697 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001698 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001699 include_dirs.append('/usr/X11/include')
1700 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001701
Jason Tishler9181c942003-02-05 15:16:17 +00001702 # If Cygwin, then verify that X is installed before proceeding
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001703 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001704 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1705 if x11_inc is None:
1706 return
1707
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001708 # Check for BLT extension
Tarek Ziadé36797272010-07-22 12:50:05 +00001709 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001710 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001711 defs.append( ('WITH_BLT', 1) )
1712 libs.append('BLT8.0')
Tarek Ziadé36797272010-07-22 12:50:05 +00001713 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadédd07ebb2009-07-06 13:52:17 +00001714 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001715 defs.append( ('WITH_BLT', 1) )
1716 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001717
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001718 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001719 libs.append('tk'+ version)
1720 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001721
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001722 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001723 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001724
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001725 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001726 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001727 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001728
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001729 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1730 define_macros=[('WITH_APPINIT', 1)] + defs,
1731 include_dirs = include_dirs,
1732 libraries = libs,
1733 library_dirs = added_lib_dirs,
1734 )
1735 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001736
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001737## # Uncomment these lines if you want to play with xxmodule.c
1738## ext = Extension('xx', ['xxmodule.c'])
1739## self.extensions.append(ext)
Antoine Pitrou8c30a712010-12-04 18:36:03 +00001740 if 'd' not in sys.abiflags:
1741 ext = Extension('xxlimited', ['xxlimited.c'],
1742 define_macros=[('Py_LIMITED_API', 1)])
1743 self.extensions.append(ext)
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001744
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001745 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001746 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001747 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001748 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001749 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001750 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001751 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001752
Christian Heimes78644762008-03-04 23:39:23 +00001753 def configure_ctypes_darwin(self, ext):
1754 # Darwin (OS X) uses preconfigured files, in
1755 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauer014bf282009-02-05 16:35:45 +00001756 srcdir = sysconfig.get_config_var('srcdir')
Christian Heimes78644762008-03-04 23:39:23 +00001757 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1758 '_ctypes', 'libffi_osx'))
1759 sources = [os.path.join(ffi_srcdir, p)
1760 for p in ['ffi.c',
Georg Brandlfcaf9102008-07-16 02:17:56 +00001761 'x86/darwin64.S',
Christian Heimes78644762008-03-04 23:39:23 +00001762 'x86/x86-darwin.S',
1763 'x86/x86-ffi_darwin.c',
1764 'x86/x86-ffi64.c',
1765 'powerpc/ppc-darwin.S',
1766 'powerpc/ppc-darwin_closure.S',
1767 'powerpc/ppc-ffi_darwin.c',
1768 'powerpc/ppc64-darwin_closure.S',
1769 ]]
1770
1771 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001772 self.compiler.src_extensions.append('.S')
Christian Heimes78644762008-03-04 23:39:23 +00001773
1774 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1775 os.path.join(ffi_srcdir, 'powerpc')]
1776 ext.include_dirs.extend(include_dirs)
1777 ext.sources.extend(sources)
1778 return True
1779
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001780 def configure_ctypes(self, ext):
1781 if not self.use_system_libffi:
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001782 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001783 return self.configure_ctypes_darwin(ext)
1784
Neil Schemenauer014bf282009-02-05 16:35:45 +00001785 srcdir = sysconfig.get_config_var('srcdir')
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001786 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1787 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1788 '_ctypes', 'libffi'))
1789 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001790
Thomas Wouters477c8d52006-05-27 19:21:47 +00001791 from distutils.dep_util import newer_group
1792
1793 config_sources = [os.path.join(ffi_srcdir, fname)
Thomas Wouterscf297e42007-02-23 15:07:44 +00001794 for fname in os.listdir(ffi_srcdir)
1795 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Wouters477c8d52006-05-27 19:21:47 +00001796 if self.force or newer_group(config_sources,
1797 ffi_configfile):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001798 from distutils.dir_util import mkpath
1799 mkpath(ffi_builddir)
doko@ubuntu.com1abe1c52012-06-30 20:42:45 +02001800 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
1801 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes7dd06e12012-09-06 18:02:49 +02001802 if not self.verbose:
1803 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00001804
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001805 # Pass empty CFLAGS because we'll just append the resulting
1806 # CFLAGS to Python's; -g or -O2 is to be avoided.
1807 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1808 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001809
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001810 res = os.system(cmd)
1811 if res or not os.path.exists(ffi_configfile):
Guido van Rossum452bf512007-02-09 05:32:43 +00001812 print("Failed to configure _ctypes module")
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001813 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001814
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001815 fficonfig = {}
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001816 with open(ffi_configfile) as f:
1817 exec(f.read(), globals(), fficonfig)
Thomas Hellercf567c12006-03-08 19:51:58 +00001818
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001819 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé36797272010-07-22 12:50:05 +00001820 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001821
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001822 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001823 ffi_builddir,
1824 os.path.join(ffi_srcdir, 'src')]
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001825 extra_compile_args = fficonfig['ffi_cflags'].split()
1826
Antoine Pitrou72f4d642010-01-13 12:04:20 +00001827 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1828 fficonfig['ffi_sources'])
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001829 ext.include_dirs.extend(include_dirs)
1830 ext.extra_compile_args.extend(extra_compile_args)
1831 return True
1832
1833 def detect_ctypes(self, inc_dirs, lib_dirs):
1834 self.use_system_libffi = False
1835 include_dirs = []
1836 extra_compile_args = []
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001837 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001838 sources = ['_ctypes/_ctypes.c',
1839 '_ctypes/callbacks.c',
1840 '_ctypes/callproc.c',
1841 '_ctypes/stgdict.c',
Thomas Heller864cc672010-08-08 17:58:53 +00001842 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001843 depends = ['_ctypes/ctypes.h']
1844
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001845 if host_platform == 'darwin':
Ronald Oussoren2decf222010-09-05 18:25:59 +00001846 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001847 sources.append('_ctypes/darwin/dlfcn_simple.c')
Christian Heimes78644762008-03-04 23:39:23 +00001848 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001849 include_dirs.append('_ctypes/darwin')
1850# XXX Is this still needed?
1851## extra_link_args.extend(['-read_only_relocs', 'warning'])
1852
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001853 elif host_platform == 'sunos5':
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001854 # XXX This shouldn't be necessary; it appears that some
1855 # of the assembler code is non-PIC (i.e. it has relocations
1856 # when it shouldn't. The proper fix would be to rewrite
1857 # the assembler code to be PIC.
1858 # This only works with GCC; the Sun compiler likely refuses
1859 # this option. If you want to compile ctypes with the Sun
1860 # compiler, please research a proper solution, instead of
1861 # finding some -z option for the Sun compiler.
1862 extra_link_args.append('-mimpure-text')
1863
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001864 elif host_platform.startswith('hp-ux'):
Thomas Heller3eaaeb42008-05-23 17:26:46 +00001865 extra_link_args.append('-fPIC')
1866
Thomas Hellercf567c12006-03-08 19:51:58 +00001867 ext = Extension('_ctypes',
1868 include_dirs=include_dirs,
1869 extra_compile_args=extra_compile_args,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001870 extra_link_args=extra_link_args,
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001871 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001872 sources=sources,
1873 depends=depends)
1874 ext_test = Extension('_ctypes_test',
1875 sources=['_ctypes/_ctypes_test.c'])
1876 self.extensions.extend([ext, ext_test])
1877
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001878 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1879 return
1880
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001881 if host_platform == 'darwin':
Christian Heimes78644762008-03-04 23:39:23 +00001882 # OS X 10.5 comes with libffi.dylib; the include files are
1883 # in /usr/include/ffi
1884 inc_dirs.append('/usr/include/ffi')
1885
Benjamin Petersond78735d2010-01-01 16:04:23 +00001886 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Klose5a204fe2010-04-21 21:47:45 +00001887 if not ffi_inc or ffi_inc[0] == '':
Benjamin Petersond78735d2010-01-01 16:04:23 +00001888 ffi_inc = find_file('ffi.h', [], inc_dirs)
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001889 if ffi_inc is not None:
1890 ffi_h = ffi_inc[0] + '/ffi.h'
Brett Cannon9f5db072010-10-29 20:19:27 +00001891 with open(ffi_h) as fp:
1892 while 1:
1893 line = fp.readline()
1894 if not line:
1895 ffi_inc = None
1896 break
1897 if line.startswith('#define LIBFFI_H'):
1898 break
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001899 ffi_lib = None
1900 if ffi_inc is not None:
1901 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé36797272010-07-22 12:50:05 +00001902 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001903 ffi_lib = lib_name
1904 break
1905
1906 if ffi_inc and ffi_lib:
1907 ext.include_dirs.extend(ffi_inc)
1908 ext.libraries.append(ffi_lib)
1909 self.use_system_libffi = True
1910
Stefan Krah1919b7e2012-03-21 18:25:23 +01001911 def _decimal_ext(self):
Stefan Krah60187b52012-03-23 19:06:27 +01001912 extra_compile_args = []
Stefan Kraha10e2fb2012-09-01 14:21:22 +02001913 undef_macros = []
Stefan Krah60187b52012-03-23 19:06:27 +01001914 if '--with-system-libmpdec' in sysconfig.get_config_var("CONFIG_ARGS"):
1915 include_dirs = []
1916 libraries = ['mpdec']
1917 sources = ['_decimal/_decimal.c']
1918 depends = ['_decimal/docstrings.h']
1919 else:
Ned Deily458a6fb2012-04-01 02:30:46 -07001920 srcdir = sysconfig.get_config_var('srcdir')
1921 include_dirs = [os.path.abspath(os.path.join(srcdir,
1922 'Modules',
1923 '_decimal',
1924 'libmpdec'))]
Stefan Krah60187b52012-03-23 19:06:27 +01001925 libraries = []
1926 sources = [
1927 '_decimal/_decimal.c',
1928 '_decimal/libmpdec/basearith.c',
1929 '_decimal/libmpdec/constants.c',
1930 '_decimal/libmpdec/context.c',
1931 '_decimal/libmpdec/convolute.c',
1932 '_decimal/libmpdec/crt.c',
1933 '_decimal/libmpdec/difradix2.c',
1934 '_decimal/libmpdec/fnt.c',
1935 '_decimal/libmpdec/fourstep.c',
1936 '_decimal/libmpdec/io.c',
1937 '_decimal/libmpdec/memory.c',
1938 '_decimal/libmpdec/mpdecimal.c',
1939 '_decimal/libmpdec/numbertheory.c',
1940 '_decimal/libmpdec/sixstep.c',
1941 '_decimal/libmpdec/transpose.c',
1942 ]
1943 depends = [
1944 '_decimal/docstrings.h',
1945 '_decimal/libmpdec/basearith.h',
1946 '_decimal/libmpdec/bits.h',
1947 '_decimal/libmpdec/constants.h',
1948 '_decimal/libmpdec/convolute.h',
1949 '_decimal/libmpdec/crt.h',
1950 '_decimal/libmpdec/difradix2.h',
1951 '_decimal/libmpdec/fnt.h',
1952 '_decimal/libmpdec/fourstep.h',
1953 '_decimal/libmpdec/io.h',
1954 '_decimal/libmpdec/memory.h',
1955 '_decimal/libmpdec/mpdecimal.h',
1956 '_decimal/libmpdec/numbertheory.h',
1957 '_decimal/libmpdec/sixstep.h',
1958 '_decimal/libmpdec/transpose.h',
1959 '_decimal/libmpdec/typearith.h',
1960 '_decimal/libmpdec/umodarith.h',
1961 ]
1962
Stefan Krah1919b7e2012-03-21 18:25:23 +01001963 config = {
1964 'x64': [('CONFIG_64','1'), ('ASM','1')],
1965 'uint128': [('CONFIG_64','1'), ('ANSI','1'), ('HAVE_UINT128_T','1')],
1966 'ansi64': [('CONFIG_64','1'), ('ANSI','1')],
1967 'ppro': [('CONFIG_32','1'), ('PPRO','1'), ('ASM','1')],
1968 'ansi32': [('CONFIG_32','1'), ('ANSI','1')],
1969 'ansi-legacy': [('CONFIG_32','1'), ('ANSI','1'),
1970 ('LEGACY_COMPILER','1')],
1971 'universal': [('UNIVERSAL','1')]
1972 }
1973
Stefan Krah1919b7e2012-03-21 18:25:23 +01001974 cc = sysconfig.get_config_var('CC')
1975 sizeof_size_t = sysconfig.get_config_var('SIZEOF_SIZE_T')
1976 machine = os.environ.get('PYTHON_DECIMAL_WITH_MACHINE')
1977
1978 if machine:
1979 # Override automatic configuration to facilitate testing.
1980 define_macros = config[machine]
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001981 elif host_platform == 'darwin':
Stefan Krah1919b7e2012-03-21 18:25:23 +01001982 # Universal here means: build with the same options Python
1983 # was built with.
1984 define_macros = config['universal']
1985 elif sizeof_size_t == 8:
1986 if sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X64'):
1987 define_macros = config['x64']
1988 elif sysconfig.get_config_var('HAVE_GCC_UINT128_T'):
1989 define_macros = config['uint128']
1990 else:
1991 define_macros = config['ansi64']
1992 elif sizeof_size_t == 4:
1993 ppro = sysconfig.get_config_var('HAVE_GCC_ASM_FOR_X87')
1994 if ppro and ('gcc' in cc or 'clang' in cc) and \
doko@ubuntu.com93df16b2012-06-30 14:32:08 +02001995 not 'sunos' in host_platform:
Stefan Krah1919b7e2012-03-21 18:25:23 +01001996 # solaris: problems with register allocation.
1997 # icc >= 11.0 works as well.
1998 define_macros = config['ppro']
Stefan Krahce23dbc2012-09-30 21:12:53 +02001999 extra_compile_args.append('-Wno-unknown-pragmas')
Stefan Krah1919b7e2012-03-21 18:25:23 +01002000 else:
2001 define_macros = config['ansi32']
2002 else:
2003 raise DistutilsError("_decimal: unsupported architecture")
2004
2005 # Workarounds for toolchain bugs:
2006 if sysconfig.get_config_var('HAVE_IPA_PURE_CONST_BUG'):
2007 # Some versions of gcc miscompile inline asm:
2008 # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46491
2009 # http://gcc.gnu.org/ml/gcc/2010-11/msg00366.html
2010 extra_compile_args.append('-fno-ipa-pure-const')
2011 if sysconfig.get_config_var('HAVE_GLIBC_MEMMOVE_BUG'):
2012 # _FORTIFY_SOURCE wrappers for memmove and bcopy are incorrect:
2013 # http://sourceware.org/ml/libc-alpha/2010-12/msg00009.html
2014 undef_macros.append('_FORTIFY_SOURCE')
2015
2016 # Faster version without thread local contexts:
2017 if not sysconfig.get_config_var('WITH_THREAD'):
2018 define_macros.append(('WITHOUT_THREADS', 1))
2019
Stefan Krahce55f082013-01-16 14:45:16 +01002020 # Increase warning level for gcc:
2021 if 'gcc' in cc:
Stefan Krah4f197442013-03-07 01:12:03 +01002022 cmd = ("echo '' | %s -Wextra -Wno-missing-field-initializers -E - "
2023 "> /dev/null 2>&1" % cc)
Stefan Krah13fe6d12013-01-17 12:49:34 +01002024 ret = os.system(cmd)
2025 if ret >> 8 == 0:
2026 extra_compile_args.extend(['-Wextra',
2027 '-Wno-missing-field-initializers'])
Stefan Krahce55f082013-01-16 14:45:16 +01002028
Stefan Krah1919b7e2012-03-21 18:25:23 +01002029 # Uncomment for extra functionality:
2030 #define_macros.append(('EXTRA_FUNCTIONALITY', 1))
2031 ext = Extension (
2032 '_decimal',
2033 include_dirs=include_dirs,
Stefan Krah60187b52012-03-23 19:06:27 +01002034 libraries=libraries,
Stefan Krah1919b7e2012-03-21 18:25:23 +01002035 define_macros=define_macros,
2036 undef_macros=undef_macros,
2037 extra_compile_args=extra_compile_args,
2038 sources=sources,
2039 depends=depends
2040 )
2041 return ext
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002042
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002043class PyBuildInstall(install):
2044 # Suppress the warning about installation into the lib_dynload
2045 # directory, which is not in sys.path when running Python during
2046 # installation:
2047 def initialize_options (self):
2048 install.initialize_options(self)
2049 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002050
Éric Araujoe6792c12011-06-09 14:07:02 +02002051 # Customize subcommands to not install an egg-info file for Python
2052 sub_commands = [('install_lib', install.has_lib),
2053 ('install_headers', install.has_headers),
2054 ('install_scripts', install.has_scripts),
2055 ('install_data', install.has_data)]
2056
2057
Michael W. Hudson529a5052002-12-17 16:47:17 +00002058class PyBuildInstallLib(install_lib):
2059 # Do exactly what install_lib does but make sure correct access modes get
2060 # set on installed directories and files. All installed files with get
2061 # mode 644 unless they are a shared library in which case they will get
2062 # mode 755. All installed directories will get mode 755.
2063
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002064 # this is works for EXT_SUFFIX too, which ends with SHLIB_SUFFIX
2065 shlib_suffix = sysconfig.get_config_var("SHLIB_SUFFIX")
Michael W. Hudson529a5052002-12-17 16:47:17 +00002066
2067 def install(self):
2068 outfiles = install_lib.install(self)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00002069 self.set_file_modes(outfiles, 0o644, 0o755)
2070 self.set_dir_modes(self.install_dir, 0o755)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002071 return outfiles
2072
2073 def set_file_modes(self, files, defaultMode, sharedLibMode):
2074 if not self.is_chmod_supported(): return
2075 if not files: return
2076
2077 for filename in files:
2078 if os.path.islink(filename): continue
2079 mode = defaultMode
doko@ubuntu.comd5537d02013-03-21 13:21:49 -07002080 if filename.endswith(self.shlib_suffix): mode = sharedLibMode
Michael W. Hudson529a5052002-12-17 16:47:17 +00002081 log.info("changing mode of %s to %o", filename, mode)
2082 if not self.dry_run: os.chmod(filename, mode)
2083
2084 def set_dir_modes(self, dirname, mode):
2085 if not self.is_chmod_supported(): return
Amaury Forgeot d'Arc321e5332009-07-02 23:08:45 +00002086 for dirpath, dirnames, fnames in os.walk(dirname):
2087 if os.path.islink(dirpath):
2088 continue
2089 log.info("changing mode of %s to %o", dirpath, mode)
2090 if not self.dry_run: os.chmod(dirpath, mode)
Michael W. Hudson529a5052002-12-17 16:47:17 +00002091
2092 def is_chmod_supported(self):
2093 return hasattr(os, 'chmod')
2094
Georg Brandlff52f762010-12-28 09:51:43 +00002095class PyBuildScripts(build_scripts):
2096 def copy_scripts(self):
2097 outfiles, updated_files = build_scripts.copy_scripts(self)
2098 fullversion = '-{0[0]}.{0[1]}'.format(sys.version_info)
2099 minoronly = '.{0[1]}'.format(sys.version_info)
2100 newoutfiles = []
2101 newupdated_files = []
2102 for filename in outfiles:
Vinay Sajip7ded1f02012-05-26 03:45:29 +01002103 if filename.endswith(('2to3', 'pyvenv')):
Georg Brandlff52f762010-12-28 09:51:43 +00002104 newfilename = filename + fullversion
2105 else:
2106 newfilename = filename + minoronly
2107 log.info('renaming {} to {}'.format(filename, newfilename))
2108 os.rename(filename, newfilename)
2109 newoutfiles.append(newfilename)
2110 if filename in updated_files:
2111 newupdated_files.append(newfilename)
2112 return newoutfiles, newupdated_files
2113
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002114SUMMARY = """
2115Python is an interpreted, interactive, object-oriented programming
2116language. It is often compared to Tcl, Perl, Scheme or Java.
2117
2118Python combines remarkable power with very clear syntax. It has
2119modules, classes, exceptions, very high level dynamic data types, and
2120dynamic typing. There are interfaces to many system calls and
2121libraries, as well as to various windowing systems (X11, Motif, Tk,
2122Mac, MFC). New built-in modules are easily written in C or C++. Python
2123is also usable as an extension language for applications that need a
2124programmable interface.
2125
2126The Python implementation is portable: it runs on many brands of UNIX,
Jesus Ceaf1af7052012-10-05 02:48:46 +02002127on Windows, DOS, Mac, Amiga... If your favorite system isn't
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002128listed here, it may still be supported, if there's a C compiler for
2129it. Ask around on comp.lang.python -- or just try compiling Python
2130yourself.
2131"""
2132
2133CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002134Development Status :: 6 - Mature
2135License :: OSI Approved :: Python Software Foundation License
2136Natural Language :: English
2137Programming Language :: C
2138Programming Language :: Python
2139Topic :: Software Development
2140"""
2141
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002142def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002143 # turn off warnings when deprecated modules are imported
2144 import warnings
2145 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002146 setup(# PyPI Metadata (PEP 301)
2147 name = "Python",
2148 version = sys.version.split()[0],
2149 url = "http://www.python.org/%s" % sys.version[:3],
2150 maintainer = "Guido van Rossum and the Python community",
2151 maintainer_email = "python-dev@python.org",
2152 description = "A high-level object-oriented programming language",
2153 long_description = SUMMARY.strip(),
2154 license = "PSF license",
Guido van Rossumc1f779c2007-07-03 08:25:58 +00002155 classifiers = [x for x in CLASSIFIERS.split("\n") if x],
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002156 platforms = ["Many"],
2157
2158 # Build info
Georg Brandlff52f762010-12-28 09:51:43 +00002159 cmdclass = {'build_ext': PyBuildExt,
2160 'build_scripts': PyBuildScripts,
2161 'install': PyBuildInstall,
2162 'install_lib': PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002163 # The struct module is defined here, because build_ext won't be
2164 # called unless there's at least one extension module defined.
Thomas Wouters477c8d52006-05-27 19:21:47 +00002165 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002166
Georg Brandlff52f762010-12-28 09:51:43 +00002167 # If you change the scripts installed here, you also need to
2168 # check the PyBuildScripts command above, and change the links
2169 # created by the bininstall target in Makefile.pre.in
Benjamin Petersondfea1922009-05-23 17:13:14 +00002170 scripts = ["Tools/scripts/pydoc3", "Tools/scripts/idle3",
Éric Araujo859aad62012-06-24 00:07:41 -04002171 "Tools/scripts/2to3", "Tools/scripts/pyvenv"]
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002172 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002173
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002174# --install-platlib
2175if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002176 main()