blob: 7b3a535778338323cae313f66d568b8dd97139b5 [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
Andrew M. Kuchling66012fe2001-01-26 21:56:58 +00004__version__ = "$Revision$"
5
Brett Cannon84667c02004-12-07 03:25:18 +00006import sys, os, imp, re, optparse
Christian Heimes8608d912008-01-25 15:52:11 +00007from glob import glob
Gregory P. Smith0902cac2008-05-27 08:40:09 +00008from platform import machine as platform_machine
Tarek Ziadé5633a802010-01-23 09:23:15 +00009import sysconfig
Michael W. Hudson529a5052002-12-17 16:47:17 +000010
11from distutils import log
Andrew M. Kuchling8d7f0862001-02-23 16:32:32 +000012from distutils import text_file
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +000013from distutils.errors import *
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000014from distutils.core import Extension, setup
15from distutils.command.build_ext import build_ext
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +000016from distutils.command.install import install
Michael W. Hudson529a5052002-12-17 16:47:17 +000017from distutils.command.install_lib import install_lib
Stefan Krah4d32c9c2010-06-04 09:49:20 +000018from distutils.spawn import find_executable
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000019
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000020# Were we compiled --with-pydebug or with #define Py_DEBUG?
21COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
22
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000023# This global variable is used to hold the list of modules to be disabled.
24disabled_module_list = []
25
Michael W. Hudson39230b32002-01-16 15:26:48 +000026def add_dir_to_list(dirlist, dir):
27 """Add the directory 'dir' to the list 'dirlist' (at the front) if
28 1) 'dir' is not already in 'dirlist'
29 2) 'dir' actually exists, and is a directory."""
Jack Jansen4439b7c2002-06-26 15:44:30 +000030 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
Michael W. Hudson39230b32002-01-16 15:26:48 +000031 dirlist.insert(0, dir)
32
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000033def macosx_sdk_root():
34 """
35 Return the directory of the current OSX SDK,
36 or '/' if no SDK was specified.
37 """
38 cflags = sysconfig.get_config_var('CFLAGS')
39 m = re.search(r'-isysroot\s+(\S+)', cflags)
40 if m is None:
41 sysroot = '/'
42 else:
43 sysroot = m.group(1)
44 return sysroot
45
46def is_macosx_sdk_path(path):
47 """
48 Returns True if 'path' can be located in an OSX SDK
49 """
Ronald Oussorencd172132010-06-27 12:36:16 +000050 return (path.startswith('/usr/') and not path.startswith('/usr/local')) or path.startswith('/System/')
Ned Deilyd8ec4642012-07-30 04:07:49 -070051 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
52 or path.startswith('/System/')
53 or path.startswith('/Library/') )
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000054
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000055def find_file(filename, std_dirs, paths):
56 """Searches for the directory where a given file is located,
57 and returns a possibly-empty list of additional directories, or None
58 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000059
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000060 'filename' is the name of a file, such as readline.h or libcrypto.a.
61 'std_dirs' is the list of standard system directories; if the
62 file is found in one of them, no additional directives are needed.
63 'paths' is a list of additional locations to check; if the file is
64 found in one of them, the resulting list will contain the directory.
65 """
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000066 if sys.platform == 'darwin':
67 # Honor the MacOSX SDK setting when one was specified.
68 # An SDK is a directory with the same structure as a real
69 # system, but with only header files and libraries.
70 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000071
72 # Check the standard locations
73 for dir in std_dirs:
74 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000075
76 if sys.platform == 'darwin' and is_macosx_sdk_path(dir):
77 f = os.path.join(sysroot, dir[1:], filename)
78
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000079 if os.path.exists(f): return []
80
81 # Check the additional directories
82 for dir in paths:
83 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000084
85 if sys.platform == 'darwin' and is_macosx_sdk_path(dir):
86 f = os.path.join(sysroot, dir[1:], filename)
87
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000088 if os.path.exists(f):
89 return [dir]
90
91 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000092 return None
93
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000094def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +000095 result = compiler.find_library_file(std_dirs + paths, libname)
96 if result is None:
97 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +000098
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000099 if sys.platform == 'darwin':
100 sysroot = macosx_sdk_root()
101
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000102 # Check whether the found file is in one of the standard directories
103 dirname = os.path.dirname(result)
104 for p in std_dirs:
105 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000106 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000107
108 if sys.platform == 'darwin' and is_macosx_sdk_path(p):
109 if os.path.join(sysroot, p[1:]) == dirname:
110 return [ ]
111
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000112 if p == dirname:
113 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000114
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000115 # Otherwise, it must have been in one of the additional directories,
116 # so we have to figure out which one.
117 for p in paths:
118 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000119 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000120
121 if sys.platform == 'darwin' and is_macosx_sdk_path(p):
122 if os.path.join(sysroot, p[1:]) == dirname:
123 return [ p ]
124
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000125 if p == dirname:
126 return [p]
127 else:
128 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000129
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000130def module_enabled(extlist, modname):
131 """Returns whether the module 'modname' is present in the list
132 of extensions 'extlist'."""
133 extlist = [ext for ext in extlist if ext.name == modname]
134 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000135
Jack Jansen144ebcc2001-08-05 22:31:19 +0000136def find_module_file(module, dirlist):
137 """Find a module in a set of possible folders. If it is not found
138 return the unadorned filename"""
139 list = find_file(module, [], dirlist)
140 if not list:
141 return module
142 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000143 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000144 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000145
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000146class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000147
Skip Montanarod1287322007-03-06 15:41:38 +0000148 def __init__(self, dist):
149 build_ext.__init__(self, dist)
150 self.failed = []
151
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000152 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000153
154 # Detect which modules should be compiled
Skip Montanarod1287322007-03-06 15:41:38 +0000155 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000156
157 # Remove modules that are present on the disabled list
Christian Heimesb222bbc2008-01-18 09:51:43 +0000158 extensions = [ext for ext in self.extensions
159 if ext.name not in disabled_module_list]
160 # move ctypes to the end, it depends on other modules
161 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
162 if "_ctypes" in ext_map:
163 ctypes = extensions.pop(ext_map["_ctypes"])
164 extensions.append(ctypes)
165 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000166
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000167 # Fix up the autodetected modules, prefixing all the source files
168 # with Modules/ and adding Python's include directory to the path.
169 (srcdir,) = sysconfig.get_config_vars('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000170 if not srcdir:
171 # Maybe running on Windows but not using CYGWIN?
172 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer0189ddc2009-02-06 00:21:55 +0000173 srcdir = os.path.abspath(srcdir)
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000174 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000175
Jack Jansen144ebcc2001-08-05 22:31:19 +0000176 # Platform-dependent module source and include directories
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000177 incdirlist = []
Jack Jansen144ebcc2001-08-05 22:31:19 +0000178 platform = self.get_platform()
Ronald Oussoren9545a232010-05-05 19:09:31 +0000179 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07 +0000180 sysconfig.get_config_var("CONFIG_ARGS")):
Jack Jansen144ebcc2001-08-05 22:31:19 +0000181 # Mac OS X also includes some mac-specific modules
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000182 macmoddir = os.path.join(srcdir, 'Mac/Modules')
Jack Jansen144ebcc2001-08-05 22:31:19 +0000183 moddirlist.append(macmoddir)
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000184 incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000185
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000186 # Fix up the paths for scripts, too
187 self.distribution.scripts = [os.path.join(srcdir, filename)
188 for filename in self.distribution.scripts]
189
Christian Heimes8608d912008-01-25 15:52:11 +0000190 # Python header files
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000191 headers = [sysconfig.get_config_h_filename()]
Stefan Krah4666ebd2012-02-29 14:17:18 +0100192 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000193 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000194 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000195 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000196 if ext.depends is not None:
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000197 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000198 for filename in ext.depends]
Christian Heimes8608d912008-01-25 15:52:11 +0000199 else:
200 ext.depends = []
201 # re-compile extensions if a header file has been changed
202 ext.depends.extend(headers)
203
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000204 # platform specific include directories
205 ext.include_dirs.extend(incdirlist)
206
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000207 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000208 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000209 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000210 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000211
Ronald Oussoren9545a232010-05-05 19:09:31 +0000212 # Parse Modules/Setup and Modules/Setup.local to figure out which
213 # modules are turned on in the file.
214 remove_modules = []
215 for filename in ('Modules/Setup', 'Modules/Setup.local'):
216 input = text_file.TextFile(filename, join_lines=1)
217 while 1:
218 line = input.readline()
219 if not line: break
220 line = line.split()
221 remove_modules.append(line[0])
222 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000223
Ronald Oussoren9545a232010-05-05 19:09:31 +0000224 for ext in self.extensions[:]:
225 if ext.name in remove_modules:
226 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000227
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000228 # When you run "make CC=altcc" or something similar, you really want
229 # those environment variables passed into the setup.py phase. Here's
230 # a small set of useful ones.
231 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000232 args = {}
233 # unfortunately, distutils doesn't let us provide separate C and C++
234 # compilers
235 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000236 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
237 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000238 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000239
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000240 build_ext.build_extensions(self)
241
Skip Montanarod1287322007-03-06 15:41:38 +0000242 longest = max([len(e.name) for e in self.extensions])
243 if self.failed:
244 longest = max(longest, max([len(name) for name in self.failed]))
245
246 def print_three_column(lst):
Georg Brandle95cf1c2007-03-06 17:49:14 +0000247 lst.sort(key=str.lower)
Skip Montanarod1287322007-03-06 15:41:38 +0000248 # guarantee zip() doesn't drop anything
249 while len(lst) % 3:
250 lst.append("")
251 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
252 print "%-*s %-*s %-*s" % (longest, e, longest, f,
253 longest, g)
Skip Montanarod1287322007-03-06 15:41:38 +0000254
255 if missing:
256 print
Georg Brandl40f982f2008-12-28 11:58:49 +0000257 print ("Python build finished, but the necessary bits to build "
258 "these modules were not found:")
Skip Montanarod1287322007-03-06 15:41:38 +0000259 print_three_column(missing)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000260 print ("To find the necessary bits, look in setup.py in"
261 " detect_modules() for the module's name.")
262 print
Skip Montanarod1287322007-03-06 15:41:38 +0000263
264 if self.failed:
265 failed = self.failed[:]
266 print
267 print "Failed to build these modules:"
268 print_three_column(failed)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000269 print
Skip Montanarod1287322007-03-06 15:41:38 +0000270
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000271 def build_extension(self, ext):
272
Thomas Hellereba43c12006-04-07 19:04:09 +0000273 if ext.name == '_ctypes':
Thomas Heller795246c2006-04-07 19:27:56 +0000274 if not self.configure_ctypes(ext):
275 return
Thomas Hellereba43c12006-04-07 19:04:09 +0000276
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000277 try:
278 build_ext.build_extension(self, ext)
279 except (CCompilerError, DistutilsError), why:
280 self.announce('WARNING: building of extension "%s" failed: %s' %
281 (ext.name, sys.exc_info()[1]))
Skip Montanarod1287322007-03-06 15:41:38 +0000282 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000283 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000284 # Workaround for Mac OS X: The Carbon-based modules cannot be
285 # reliably imported into a command-line Python
286 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000287 self.announce(
288 'WARNING: skipping import check for Carbon-based "%s"' %
289 ext.name)
290 return
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000291
292 if self.get_platform() == 'darwin' and (
293 sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
294 # Don't bother doing an import check when an extension was
295 # build with an explicit '-arch' flag on OSX. That's currently
296 # only used to build 32-bit only extensions in a 4-way
297 # universal build and loading 32-bit code into a 64-bit
298 # process will fail.
299 self.announce(
300 'WARNING: skipping import check for "%s"' %
301 ext.name)
302 return
303
Jason Tishler24cf7762002-05-22 16:46:15 +0000304 # Workaround for Cygwin: Cygwin currently has fork issues when many
305 # modules have been imported
306 if self.get_platform() == 'cygwin':
307 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
308 % ext.name)
309 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000310 ext_filename = os.path.join(
311 self.build_lib,
312 self.get_ext_filename(self.get_ext_fullname(ext.name)))
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000313 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000314 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000315 except ImportError, why:
Skip Montanarod1287322007-03-06 15:41:38 +0000316 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000317 self.announce('*** WARNING: renaming "%s" since importing it'
318 ' failed: %s' % (ext.name, why), level=3)
319 assert not self.inplace
320 basename, tail = os.path.splitext(ext_filename)
321 newname = basename + "_failed" + tail
322 if os.path.exists(newname):
323 os.remove(newname)
324 os.rename(ext_filename, newname)
325
326 # XXX -- This relies on a Vile HACK in
327 # distutils.command.build_ext.build_extension(). The
328 # _built_objects attribute is stored there strictly for
329 # use here.
330 # If there is a failure, _built_objects may not be there,
331 # so catch the AttributeError and move on.
332 try:
333 for filename in self._built_objects:
334 os.remove(filename)
335 except AttributeError:
336 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000337 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000338 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000339 self.announce('*** WARNING: importing extension "%s" '
340 'failed with %s: %s' % (ext.name, exc_type, why),
341 level=3)
Skip Montanarod1287322007-03-06 15:41:38 +0000342 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000343
Neal Norwitz51dead72003-06-17 02:51:28 +0000344 def get_platform(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000345 # Get value of sys.platform
Neal Norwitz51dead72003-06-17 02:51:28 +0000346 for platform in ['cygwin', 'beos', 'darwin', 'atheos', 'osf1']:
347 if sys.platform.startswith(platform):
348 return platform
349 return sys.platform
Andrew M. Kuchling34febf52001-01-24 03:31:07 +0000350
Barry Warsawffc9caf2011-04-07 11:28:11 -0400351 def add_multiarch_paths(self):
352 # Debian/Ubuntu multiarch support.
353 # https://wiki.ubuntu.com/MultiarchSpec
354 if not find_executable('dpkg-architecture'):
355 return
356 tmpfile = os.path.join(self.build_temp, 'multiarch')
357 if not os.path.exists(self.build_temp):
358 os.makedirs(self.build_temp)
359 ret = os.system(
360 'dpkg-architecture -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
361 tmpfile)
362 try:
363 if ret >> 8 == 0:
364 with open(tmpfile) as fp:
365 multiarch_path_component = fp.readline().strip()
366 add_dir_to_list(self.compiler.library_dirs,
367 '/usr/lib/' + multiarch_path_component)
368 add_dir_to_list(self.compiler.include_dirs,
369 '/usr/include/' + multiarch_path_component)
370 finally:
371 os.unlink(tmpfile)
372
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000373 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000374 # Ensure that /usr/local is always used
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000375 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
376 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400377 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000378
Brett Cannon516592f2004-12-07 00:42:59 +0000379 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000380 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000381 # We must get the values from the Makefile and not the environment
382 # directly since an inconsistently reproducible issue comes up where
383 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000384 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000385 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000386 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
387 ('LDFLAGS', '-L', self.compiler.library_dirs),
388 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000389 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000390 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000391 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000392 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000393 # all double dashes and any dashes followed by a character
394 # that is not for the option we are dealing with.
395 #
396 # Please note that order of the regex is important! We must
397 # strip out double-dashes first so that we don't end up with
398 # substituting "--Long" to "-Long" and thus lead to "ong" being
399 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000400 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
401 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000402 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000403 # Make sure that allowing args interspersed with options is
404 # allowed
405 parser.allow_interspersed_args = True
406 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000407 parser.add_option(arg_name, dest="dirs", action="append")
408 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000409 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000410 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000411 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000412
Ronald Oussoren24215252010-10-20 13:11:46 +0000413 if os.path.normpath(sys.prefix) != '/usr' \
414 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
415 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
416 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
417 # building a framework with different architectures than
418 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000419 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000420 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000421 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000422 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000423
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000424 try:
425 have_unicode = unicode
426 except NameError:
427 have_unicode = 0
428
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000429 # lib_dirs and inc_dirs are used to search for files;
430 # if a file is found in one of those directories, it can
431 # be assumed that no additional -I,-L directives are needed.
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000432 lib_dirs = self.compiler.library_dirs + [
Martin v. Löwisfba73692004-11-13 11:13:35 +0000433 '/lib64', '/usr/lib64',
434 '/lib', '/usr/lib',
435 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000436 inc_dirs = self.compiler.include_dirs + ['/usr/include']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000437 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000438 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000439
Brett Cannon4454a1f2005-04-15 20:32:39 +0000440 config_h = sysconfig.get_config_h_filename()
441 config_h_vars = sysconfig.parse_config_h(open(config_h))
442
Fredrik Lundhade711a2001-01-24 08:00:28 +0000443 platform = self.get_platform()
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000444 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000445
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000446 # Check for AtheOS which has libraries in non-standard locations
447 if platform == 'atheos':
448 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
449 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
450 inc_dirs += ['/system/include', '/atheos/autolnk/include']
451 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
452
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000453 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
454 if platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000455 lib_dirs += ['/usr/ccs/lib']
456
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200457 # HP-UX11iv3 keeps files in lib/hpux folders.
458 if platform == 'hp-ux11':
459 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
460
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000461 if platform == 'darwin':
462 # This should work on any unixy platform ;-)
463 # If the user has bothered specifying additional -I and -L flags
464 # in OPT and LDFLAGS we might as well use them here.
465 # NOTE: using shlex.split would technically be more correct, but
466 # also gives a bootstrap problem. Let's hope nobody uses directories
467 # with whitespace in the name to store libraries.
468 cflags, ldflags = sysconfig.get_config_vars(
469 'CFLAGS', 'LDFLAGS')
470 for item in cflags.split():
471 if item.startswith('-I'):
472 inc_dirs.append(item[2:])
473
474 for item in ldflags.split():
475 if item.startswith('-L'):
476 lib_dirs.append(item[2:])
477
Fredrik Lundhade711a2001-01-24 08:00:28 +0000478 # Check for MacOS X, which doesn't need libm.a at all
479 math_libs = ['m']
Ronald Oussoren9545a232010-05-05 19:09:31 +0000480 if platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000481 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000482
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000483 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
484
485 #
486 # The following modules are all pretty straightforward, and compile
487 # on pretty much any POSIXish platform.
488 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000489
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000490 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000491 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000492
493 # array objects
494 exts.append( Extension('array', ['arraymodule.c']) )
495 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000496 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
497 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000498 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000499 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000500 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000501 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000502 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000503 # fast string operations implemented in C
504 exts.append( Extension('strop', ['stropmodule.c']) )
505 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000506 exts.append( Extension('time', ['timemodule.c'],
507 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000508 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000509 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000510 # fast iterator tools implemented in C
511 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000512 # code that will be builtins in the future, but conflict with the
513 # current builtins
514 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000515 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000516 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000517 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000518 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000519 # bisect
520 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000521 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000522 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000523 # operator.add() and similar goodies
524 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000525 # Python 3.1 _io library
526 exts.append( Extension("_io",
527 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
528 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
529 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000530 # _functools
531 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000532 # _json speedups
533 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000534 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000535 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
536 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000537 # profilers (_lsprof is for cProfile.py)
538 exts.append( Extension('_hotshot', ['_hotshot.c']) )
539 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000540 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000541 if have_unicode:
542 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000543 else:
544 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000545 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000546 data = open('pyconfig.h').read()
547 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
548 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000549 locale_libs = ['intl']
550 else:
551 locale_libs = []
Jack Jansen84b74472004-07-15 19:56:25 +0000552 if platform == 'darwin':
553 locale_extra_link_args = ['-framework', 'CoreFoundation']
554 else:
555 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000556
Jack Jansen84b74472004-07-15 19:56:25 +0000557
Jason Tishlerd28216b2002-08-14 11:13:52 +0000558 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000559 libraries=locale_libs,
560 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000561
562 # Modules with some UNIX dependencies -- on by default:
563 # (If you have a really backward UNIX, select and socket may not be
564 # supported...)
565
566 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000567 libs = []
568 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
569 # May be necessary on AIX for flock function
570 libs = ['bsd']
571 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000572 # pwd(3)
573 exts.append( Extension('pwd', ['pwdmodule.c']) )
574 # grp(3)
575 exts.append( Extension('grp', ['grpmodule.c']) )
576 # spwd, shadow passwords
577 if (config_h_vars.get('HAVE_GETSPNAM', False) or
578 config_h_vars.get('HAVE_GETSPENT', False)):
579 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000580 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000581 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000582
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000583 # select(2); not on ancient System V
584 exts.append( Extension('select', ['selectmodule.c']) )
585
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000586 # Fred Drake's interface to the Python parser
587 exts.append( Extension('parser', ['parsermodule.c']) )
588
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000589 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000590 exts.append( Extension('cStringIO', ['cStringIO.c']) )
591 exts.append( Extension('cPickle', ['cPickle.c']) )
592
593 # Memory-mapped files (also works on Win32).
Ronald Oussoren9545a232010-05-05 19:09:31 +0000594 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000595 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000596 else:
597 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000598
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000599 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000600 # syslog daemon interface
601 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000602
603 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000604 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
605 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
606 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000607
608 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000609 # Here ends the simple stuff. From here on, modules need certain
610 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000611 #
612
613 # Multimedia modules
614 # These don't work for 64-bit platforms!!!
615 # These represent audio samples or images as strings:
616
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000617 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000618 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000619 # 64-bit platforms.
620 exts.append( Extension('audioop', ['audioop.c']) )
621
Fredrik Lundhade711a2001-01-24 08:00:28 +0000622 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000623 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000624 # Operations on images
625 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000626 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000627 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000628
629 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000630 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000631 readline_termcap_library = ""
632 curses_library = ""
633 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000634 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000635 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000636 ldd_output = fp.readlines()
637 ret = fp.close()
638 if ret is None or ret >> 8 == 0:
639 for ln in ldd_output:
640 if 'curses' in ln:
641 readline_termcap_library = re.sub(
642 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
643 ).rstrip()
644 break
645 if 'tinfo' in ln: # termcap interface split out from ncurses
646 readline_termcap_library = 'tinfo'
647 break
Stefan Krah449aa862010-06-03 12:39:50 +0000648 # Issue 7384: If readline is already linked against curses,
649 # use the same library for the readline and curses modules.
650 if 'curses' in readline_termcap_library:
651 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000652 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000653 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000654 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000655 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000656 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000657 curses_library = 'curses'
658
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000659 if platform == 'darwin':
660 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000661 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
662 if dep_target and dep_target.split('.') < ['10', '5']:
663 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000664 if os_release < 9:
665 # MacOSX 10.4 has a broken readline. Don't try to build
666 # the readline module unless the user has installed a fixed
667 # readline package
668 if find_file('readline/rlconf.h', inc_dirs, []) is None:
669 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000670 if do_readline:
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000671 if platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000672 # In every directory on the search path search for a dynamic
673 # library and then a static library, instead of first looking
674 # for dynamic libraries on the entiry path.
675 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000676 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000677 readline_extra_link_args = ('-Wl,-search_paths_first',)
678 else:
679 readline_extra_link_args = ()
680
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000681 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000682 if readline_termcap_library:
683 pass # Issue 7384: Already linked against curses or tinfo.
684 elif curses_library:
685 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000686 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000687 ['/usr/lib/termcap'],
688 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000689 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000690 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000691 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000692 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000693 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000694 else:
695 missing.append('readline')
696
Ronald Oussoren9545a232010-05-05 19:09:31 +0000697 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000698
Ronald Oussoren9545a232010-05-05 19:09:31 +0000699 if self.compiler.find_library_file(lib_dirs, 'crypt'):
700 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000701 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000702 libs = []
703 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000704
Skip Montanaroba9e9782003-03-20 23:34:22 +0000705 # CSV files
706 exts.append( Extension('_csv', ['_csv.c']) )
707
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000708 # socket(2)
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000709 exts.append( Extension('_socket', ['socketmodule.c'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000710 depends = ['socketmodule.h']) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000711 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000712 search_for_ssl_incs_in = [
713 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000714 '/usr/contrib/ssl/include/'
715 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000716 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
717 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000718 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000719 if ssl_incs is not None:
720 krb5_h = find_file('krb5.h', inc_dirs,
721 ['/usr/kerberos/include'])
722 if krb5_h:
723 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000724 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000725 ['/usr/local/ssl/lib',
726 '/usr/contrib/ssl/lib/'
727 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000728
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000729 if (ssl_incs is not None and
730 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000731 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000732 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000733 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000734 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000735 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000736 else:
737 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000738
Gregory P. Smithade97332005-08-23 21:19:40 +0000739 # find out which version of OpenSSL we have
740 openssl_ver = 0
741 openssl_ver_re = re.compile(
742 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000743
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000744 # look for the openssl version header on the compiler search path.
745 opensslv_h = find_file('openssl/opensslv.h', [],
746 inc_dirs + search_for_ssl_incs_in)
747 if opensslv_h:
748 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
749 if sys.platform == 'darwin' and is_macosx_sdk_path(name):
750 name = os.path.join(macosx_sdk_root(), name[1:])
751 try:
752 incfile = open(name, 'r')
753 for line in incfile:
754 m = openssl_ver_re.match(line)
755 if m:
756 openssl_ver = eval(m.group(1))
757 except IOError, msg:
758 print "IOError while reading opensshv.h:", msg
759 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000760
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000761 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000762 have_any_openssl = ssl_incs is not None and ssl_libs is not None
763 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000764 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000765
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000766 if have_any_openssl:
767 if have_usable_openssl:
768 # The _hashlib module wraps optimized implementations
769 # of hash functions from the OpenSSL library.
770 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
771 include_dirs = ssl_incs,
772 library_dirs = ssl_libs,
773 libraries = ['ssl', 'crypto']) )
774 else:
775 print ("warning: openssl 0x%08x is too old for _hashlib" %
776 openssl_ver)
777 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000778 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000779 # The _sha module implements the SHA1 hash algorithm.
780 exts.append( Extension('_sha', ['shamodule.c']) )
781 # The _md5 module implements the RSA Data Security, Inc. MD5
782 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000783 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000784 exts.append( Extension('_md5',
785 sources = ['md5module.c', 'md5.c'],
786 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000787
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000788 min_sha2_openssl_ver = 0x00908000
789 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000790 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
791 exts.append( Extension('_sha256', ['sha256module.c']) )
792 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000793
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000794 # Modules that provide persistent dictionary-like semantics. You will
795 # probably want to arrange for at least one of them to be available on
796 # your machine, though none are defined by default because of library
797 # dependencies. The Python module anydbm.py provides an
798 # implementation independent wrapper for these; dumbdbm.py provides
799 # similar functionality (but slower of course) implemented in Python.
800
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000801 # Sleepycat^WOracle Berkeley DB interface.
802 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000803 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000804 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000805 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000806 # a release. Most open source OSes come with one or more
807 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000808
Matthias Klose54cc5392010-03-15 12:46:18 +0000809 max_db_ver = (4, 8)
Jesus Cea6557aac2010-03-22 14:22:26 +0000810 min_db_ver = (4, 1)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000811 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000812
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000813 def allow_db_ver(db_ver):
814 """Returns a boolean if the given BerkeleyDB version is acceptable.
815
816 Args:
817 db_ver: A tuple of the version to verify.
818 """
819 if not (min_db_ver <= db_ver <= max_db_ver):
820 return False
821 # Use this function to filter out known bad configurations.
822 if (4, 6) == db_ver[:2]:
823 # BerkeleyDB 4.6.x is not stable on many architectures.
824 arch = platform_machine()
825 if arch not in ('i386', 'i486', 'i586', 'i686',
826 'x86_64', 'ia64'):
827 return False
828 return True
829
830 def gen_db_minor_ver_nums(major):
831 if major == 4:
832 for x in range(max_db_ver[1]+1):
833 if allow_db_ver((4, x)):
834 yield x
835 elif major == 3:
836 for x in (3,):
837 if allow_db_ver((3, x)):
838 yield x
839 else:
840 raise ValueError("unknown major BerkeleyDB version", major)
841
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000842 # construct a list of paths to look for the header file in on
843 # top of the normal inc_dirs.
844 db_inc_paths = [
845 '/usr/include/db4',
846 '/usr/local/include/db4',
847 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000848 '/usr/include/db3',
849 '/usr/local/include/db3',
850 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000851 # Fink defaults (http://fink.sourceforge.net/)
852 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000853 '/sw/include/db3',
854 ]
855 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000856 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000857 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000858 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000859 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
860 db_inc_paths.append('/usr/local/include/db4%d' % x)
861 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000862 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000863 # MacPorts default (http://www.macports.org/)
864 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000865 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000866 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000867 db_inc_paths.append('/usr/include/db3%d' % x)
868 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
869 db_inc_paths.append('/usr/local/include/db3%d' % x)
870 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000871 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000872
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000873 # Add some common subdirectories for Sleepycat DB to the list,
874 # based on the standard include directories. This way DB3/4 gets
875 # picked up when it is installed in a non-standard prefix and
876 # the user has added that prefix into inc_dirs.
877 std_variants = []
878 for dn in inc_dirs:
879 std_variants.append(os.path.join(dn, 'db3'))
880 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000881 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000882 std_variants.append(os.path.join(dn, "db4%d"%x))
883 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000884 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000885 std_variants.append(os.path.join(dn, "db3%d"%x))
886 std_variants.append(os.path.join(dn, "db3.%d"%x))
887
Tim Peters38ff36c2006-06-30 06:18:39 +0000888 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000889 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000890
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000891 db_ver_inc_map = {}
892
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000893 if sys.platform == 'darwin':
894 sysroot = macosx_sdk_root()
895
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000896 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000897 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000898 # See whether there is a Sleepycat header in the standard
899 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000900 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000901 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000902
903 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
904 f = os.path.join(sysroot, d[1:], "db.h")
905
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000906 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000907 if os.path.exists(f):
908 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000909 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000910 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000911 db_major = int(m.group(1))
912 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
913 db_minor = int(m.group(1))
914 db_ver = (db_major, db_minor)
915
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000916 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
917 if db_ver == (4, 6):
918 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
919 db_patch = int(m.group(1))
920 if db_patch < 21:
921 print "db.h:", db_ver, "patch", db_patch,
922 print "being ignored (4.6.x must be >= 4.6.21)"
923 continue
924
Antoine Pitrou8c510e72010-01-13 11:47:49 +0000925 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000926 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000927 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +0000928 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000929 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +0000930 if db_setup_debug:
931 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000932 else:
933 # we already found a header for this library version
934 if db_setup_debug: print "db.h: ignoring", d
935 else:
936 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +0000937 if db_setup_debug:
938 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000939
940 db_found_vers = db_ver_inc_map.keys()
941 db_found_vers.sort()
942
943 while db_found_vers:
944 db_ver = db_found_vers.pop()
945 db_incdir = db_ver_inc_map[db_ver]
946
947 # check lib directories parallel to the location of the header
948 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +0000949 db_incdir.replace("include", 'lib64'),
950 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000951 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000952
953 if sys.platform != 'darwin':
954 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
955
956 else:
957 # Same as other branch, but takes OSX SDK into account
958 tmp = []
959 for dn in db_dirs_to_check:
960 if is_macosx_sdk_path(dn):
961 if os.path.isdir(os.path.join(sysroot, dn[1:])):
962 tmp.append(dn)
963 else:
964 if os.path.isdir(dn):
965 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +0000966 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000967
Ezio Melotti24b07bc2011-03-15 18:55:01 +0200968 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000969 # XXX should we -ever- look for a dbX name? Do any
970 # systems really not name their library by version and
971 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +0000972 for dblib in (('db-%d.%d' % db_ver),
973 ('db%d%d' % db_ver),
974 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000975 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000976 db_dirs_to_check + lib_dirs, dblib )
977 if dblib_file:
978 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
979 raise db_found
980 else:
981 if db_setup_debug: print "db lib: ", dblib, "not found"
982
983 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +0000984 if db_setup_debug:
985 print "bsddb using BerkeleyDB lib:", db_ver, dblib
986 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000987 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +0000988 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000989 # We add the runtime_library_dirs argument because the
990 # BerkeleyDB lib we're linking against often isn't in the
991 # system dynamic library search path. This is usually
992 # correct and most trouble free, but may cause problems in
993 # some unusual system configurations (e.g. the directory
994 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000995 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +0000996 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000997 library_dirs=dblib_dir,
998 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +0000999 include_dirs=db_incs,
1000 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +00001001 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001002 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001003 db_incs = None
1004 dblibs = []
1005 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001006 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001007
Anthony Baxterc51ee692006-04-01 00:57:31 +00001008 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001009 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001010
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001011 # We hunt for #define SQLITE_VERSION "n.n.n"
1012 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001013 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001014 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001015 '/usr/include/sqlite',
1016 '/usr/include/sqlite3',
1017 '/usr/local/include',
1018 '/usr/local/include/sqlite',
1019 '/usr/local/include/sqlite3',
1020 ]
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001021 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1022 MIN_SQLITE_VERSION = ".".join([str(x)
1023 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001024
1025 # Scan the default include directories before the SQLite specific
1026 # ones. This allows one to override the copy of sqlite on OSX,
1027 # where /usr/include contains an old version of sqlite.
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001028 if sys.platform == 'darwin':
1029 sysroot = macosx_sdk_root()
1030
Ned Deily67028042012-08-05 14:42:45 -07001031 for d_ in inc_dirs + sqlite_inc_paths:
1032 d = d_
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001033 if sys.platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily67028042012-08-05 14:42:45 -07001034 d = os.path.join(sysroot, d[1:])
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001035
Ned Deily67028042012-08-05 14:42:45 -07001036 f = os.path.join(d, "sqlite3.h")
Anthony Baxterc51ee692006-04-01 00:57:31 +00001037 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001038 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001039 incf = open(f).read()
1040 m = re.search(
1041 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"(.*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001042 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001043 sqlite_version = m.group(1)
1044 sqlite_version_tuple = tuple([int(x)
1045 for x in sqlite_version.split(".")])
1046 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001047 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001048 if sqlite_setup_debug:
1049 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001050 sqlite_incdir = d
1051 break
1052 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001053 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001054 print "%s: version %d is too old, need >= %s"%(d,
1055 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001056 elif sqlite_setup_debug:
1057 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1058
Anthony Baxterc51ee692006-04-01 00:57:31 +00001059 if sqlite_incdir:
1060 sqlite_dirs_to_check = [
1061 os.path.join(sqlite_incdir, '..', 'lib64'),
1062 os.path.join(sqlite_incdir, '..', 'lib'),
1063 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1064 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1065 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001066 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001067 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001068 if sqlite_libfile:
1069 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001070
1071 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001072 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001073 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001074 '_sqlite/cursor.c',
1075 '_sqlite/microprotocols.c',
1076 '_sqlite/module.c',
1077 '_sqlite/prepare_protocol.c',
1078 '_sqlite/row.c',
1079 '_sqlite/statement.c',
1080 '_sqlite/util.c', ]
1081
Anthony Baxterc51ee692006-04-01 00:57:31 +00001082 sqlite_defines = []
1083 if sys.platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001084 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001085 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001086 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1087
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001088 # Comment this out if you want the sqlite3 module to be able to load extensions.
1089 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001090
1091 if sys.platform == 'darwin':
1092 # In every directory on the search path search for a dynamic
1093 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001094 # for dynamic libraries on the entire path.
1095 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001096 # before the dynamic library in /usr/lib.
1097 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1098 else:
1099 sqlite_extra_link_args = ()
1100
Anthony Baxterc51ee692006-04-01 00:57:31 +00001101 exts.append(Extension('_sqlite3', sqlite_srcs,
1102 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001103 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001104 sqlite_incdir],
1105 library_dirs=sqlite_libdir,
1106 runtime_library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001107 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001108 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001109 else:
1110 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001111
1112 # Look for Berkeley db 1.85. Note that it is built as a different
1113 # module name so it can be included even when later versions are
1114 # available. A very restrictive search is performed to avoid
1115 # accidentally building this module with a later version of the
1116 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1117 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001118 #
1119 # If the better bsddb library can be built (db_incs is defined)
1120 # we do not build this one. Otherwise this build will pick up
1121 # the more recent berkeleydb's db.h file first in the include path
1122 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001123 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001124
1125 if sys.platform == 'darwin':
1126 if is_macosx_sdk_path(f):
1127 sysroot = macosx_sdk_root()
1128 f = os.path.join(sysroot, f[1:])
1129
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001130 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001131 data = open(f).read()
1132 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1133 if m is not None:
1134 # bingo - old version used hash file format version 2
1135 ### XXX this should be fixed to not be platform-dependent
1136 ### but I don't have direct access to an osf1 platform and
1137 ### seemed to be muffing the search somehow
1138 libraries = platform == "osf1" and ['db'] or None
1139 if libraries is not None:
1140 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1141 libraries=libraries))
1142 else:
1143 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001144 else:
1145 missing.append('bsddb185')
1146 else:
1147 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001148
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001149 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001150 # The standard Unix dbm module:
Jack Jansend1b20452002-07-08 21:39:36 +00001151 if platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001152 config_args = [arg.strip("'")
1153 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001154 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001155 if arg.startswith('--with-dbmliborder=')]
1156 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001157 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001158 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001159 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001160 dbmext = None
1161 for cand in dbm_order:
1162 if cand == "ndbm":
1163 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001164 # Some systems have -lndbm, others have -lgdbm_compat,
1165 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001166 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001167 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001168 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001169 elif self.compiler.find_library_file(lib_dirs,
1170 'gdbm_compat'):
1171 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001172 else:
1173 ndbm_libs = []
1174 print "building dbm using ndbm"
1175 dbmext = Extension('dbm', ['dbmmodule.c'],
1176 define_macros=[
1177 ('HAVE_NDBM_H',None),
1178 ],
1179 libraries=ndbm_libs)
1180 break
1181
1182 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001183 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001184 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001185 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001186 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001187 gdbm_libs.append('gdbm_compat')
1188 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1189 print "building dbm using gdbm"
1190 dbmext = Extension(
1191 'dbm', ['dbmmodule.c'],
1192 define_macros=[
1193 ('HAVE_GDBM_NDBM_H', None),
1194 ],
1195 libraries = gdbm_libs)
1196 break
1197 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1198 print "building dbm using gdbm"
1199 dbmext = Extension(
1200 'dbm', ['dbmmodule.c'],
1201 define_macros=[
1202 ('HAVE_GDBM_DASH_NDBM_H', None),
1203 ],
1204 libraries = gdbm_libs)
1205 break
1206 elif cand == "bdb":
1207 if db_incs is not None:
1208 print "building dbm using bdb"
1209 dbmext = Extension('dbm', ['dbmmodule.c'],
1210 library_dirs=dblib_dir,
1211 runtime_library_dirs=dblib_dir,
1212 include_dirs=db_incs,
1213 define_macros=[
1214 ('HAVE_BERKDB_H', None),
1215 ('DB_DBM_HSEARCH', None),
1216 ],
1217 libraries=dblibs)
1218 break
1219 if dbmext is not None:
1220 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001221 else:
1222 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001223
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001224 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001225 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001226 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001227 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1228 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001229 else:
1230 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001231
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001232 # Unix-only modules
Ronald Oussoren9545a232010-05-05 19:09:31 +00001233 if platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001234 # Steen Lumholt's termios module
1235 exts.append( Extension('termios', ['termios.c']) )
1236 # Jeremy Hylton's rlimit interface
Tim Peters2c60f7a2003-01-29 03:49:43 +00001237 if platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001238 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001239 else:
1240 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001241
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001242 # Sun yellow pages. Some systems have the functions in libc.
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001243 if (platform not in ['cygwin', 'atheos', 'qnx6'] and
1244 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001245 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001246 libs = ['nsl']
1247 else:
1248 libs = []
1249 exts.append( Extension('nis', ['nismodule.c'],
1250 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001251 else:
1252 missing.append('nis')
1253 else:
1254 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001255
Skip Montanaro72092942004-02-07 12:50:19 +00001256 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001257 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001258 panel_library = 'panel'
Stefan Krah449aa862010-06-03 12:39:50 +00001259 if curses_library.startswith('ncurses'):
1260 if curses_library == 'ncursesw':
1261 # Bug 1464056: If _curses.so links with ncursesw,
1262 # _curses_panel.so must link with panelw.
1263 panel_library = 'panelw'
1264 curses_libs = [curses_library]
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001265 exts.append( Extension('_curses', ['_cursesmodule.c'],
1266 libraries = curses_libs) )
Stefan Krah449aa862010-06-03 12:39:50 +00001267 elif curses_library == 'curses' and platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001268 # OSX has an old Berkeley curses, not good enough for
1269 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001270 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001271 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001272 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001273 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001274 else:
1275 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001276
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001277 exts.append( Extension('_curses', ['_cursesmodule.c'],
1278 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001279 else:
1280 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001281
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001282 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001283 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001284 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001285 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001286 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001287 else:
1288 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001289
Barry Warsaw259b1e12002-08-13 20:09:26 +00001290 # Andrew Kuchling's zlib module. Note that some versions of zlib
1291 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1292 # http://www.cert.org/advisories/CA-2002-07.html
1293 #
1294 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1295 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1296 # now, we still accept 1.1.3, because we think it's difficult to
1297 # exploit this in Python, and we'd rather make it RedHat's problem
1298 # than our problem <wink>.
1299 #
1300 # You can upgrade zlib to version 1.1.4 yourself by going to
1301 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001302 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001303 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001304 if zlib_inc is not None:
1305 zlib_h = zlib_inc[0] + '/zlib.h'
1306 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001307 version_req = '"1.1.3"'
Guido van Rossume6970912001-04-15 15:16:12 +00001308 fp = open(zlib_h)
1309 while 1:
1310 line = fp.readline()
1311 if not line:
1312 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001313 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001314 version = line.split()[2]
1315 break
1316 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001317 if (self.compiler.find_library_file(lib_dirs, 'z')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001318 if sys.platform == "darwin":
1319 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1320 else:
1321 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001322 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001323 libraries = ['z'],
1324 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001325 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001326 else:
1327 missing.append('zlib')
1328 else:
1329 missing.append('zlib')
1330 else:
1331 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001332
Gregory P. Smith440ca772008-03-24 00:08:01 +00001333 # Helper module for various ascii-encoders. Uses zlib for an optimized
1334 # crc32 if we have it. Otherwise binascii uses its own.
1335 if have_zlib:
1336 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1337 libraries = ['z']
1338 extra_link_args = zlib_extra_link_args
1339 else:
1340 extra_compile_args = []
1341 libraries = []
1342 extra_link_args = []
1343 exts.append( Extension('binascii', ['binascii.c'],
1344 extra_compile_args = extra_compile_args,
1345 libraries = libraries,
1346 extra_link_args = extra_link_args) )
1347
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001348 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001349 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001350 if sys.platform == "darwin":
1351 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1352 else:
1353 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001354 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001355 libraries = ['bz2'],
1356 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001357 else:
1358 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001359
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001360 # Interface to the Expat XML parser
1361 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001362 # Expat was written by James Clark and is now maintained by a group of
1363 # developers on SourceForge; see www.libexpat.org for more information.
1364 # The pyexpat module was written by Paul Prescod after a prototype by
1365 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1366 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001367 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001368 #
1369 # More information on Expat can be found at www.libexpat.org.
1370 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001371 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1372 expat_inc = []
1373 define_macros = []
1374 expat_lib = ['expat']
1375 expat_sources = []
1376 else:
1377 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1378 define_macros = [
1379 ('HAVE_EXPAT_CONFIG_H', '1'),
1380 ]
1381 expat_lib = []
1382 expat_sources = ['expat/xmlparse.c',
1383 'expat/xmlrole.c',
1384 'expat/xmltok.c']
Ronald Oussoren988117f2006-04-29 11:31:35 +00001385
Fred Drake2d59a492003-10-21 15:41:15 +00001386 exts.append(Extension('pyexpat',
1387 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001388 include_dirs = expat_inc,
1389 libraries = expat_lib,
1390 sources = ['pyexpat.c'] + expat_sources
Fred Drake2d59a492003-10-21 15:41:15 +00001391 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001392
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001393 # Fredrik Lundh's cElementTree module. Note that this also
1394 # uses expat (via the CAPI hook in pyexpat).
1395
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001396 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001397 define_macros.append(('USE_PYEXPAT_CAPI', None))
1398 exts.append(Extension('_elementtree',
1399 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001400 include_dirs = expat_inc,
1401 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001402 sources = ['_elementtree.c'],
1403 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001404 else:
1405 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001406
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001407 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001408 if have_unicode:
1409 exts.append(Extension('_multibytecodec',
1410 ['cjkcodecs/multibytecodec.c']))
1411 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001412 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001413 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001414 else:
1415 missing.append('_multibytecodec')
1416 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1417 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001418
Michael W. Hudson5b109102002-01-23 15:04:41 +00001419 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001420 if sys.maxint == 0x7fffffff:
1421 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1422 dl_inc = find_file('dlfcn.h', [], inc_dirs)
Anthony Baxter82201742006-04-09 15:07:40 +00001423 if (dl_inc is not None) and (platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001424 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001425 else:
1426 missing.append('dl')
1427 else:
1428 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001429
Thomas Hellercf567c12006-03-08 19:51:58 +00001430 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001431 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001432
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001433 # Richard Oudkerk's multiprocessing module
1434 if platform == 'win32': # Windows
1435 macros = dict()
1436 libraries = ['ws2_32']
1437
1438 elif platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001439 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001440 libraries = []
1441
1442 elif platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001443 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001444 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001445
Martin v. Löwisbb86d832008-11-04 20:40:09 +00001446 elif platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001447 # FreeBSD's P1003.1b semaphore support is very experimental
1448 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001449 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001450 libraries = []
1451
Jesse Noller37040cd2008-09-30 00:15:45 +00001452 elif platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001453 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001454 libraries = []
1455
Jesse Noller40a61642009-03-31 18:12:35 +00001456 elif platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001457 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001458 libraries = []
1459
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001460 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001461 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001462 libraries = ['rt']
1463
1464 if platform == 'win32':
1465 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1466 '_multiprocessing/semaphore.c',
1467 '_multiprocessing/pipe_connection.c',
1468 '_multiprocessing/socket_connection.c',
1469 '_multiprocessing/win32_functions.c'
1470 ]
1471
1472 else:
1473 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1474 '_multiprocessing/socket_connection.c'
1475 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001476 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001477 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001478 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1479
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001480 if sysconfig.get_config_var('WITH_THREAD'):
1481 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1482 define_macros=macros.items(),
1483 include_dirs=["Modules/_multiprocessing"]))
1484 else:
1485 missing.append('_multiprocessing')
1486
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001487 # End multiprocessing
1488
1489
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001490 # Platform-specific libraries
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001491 if platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001492 # Linux-specific modules
1493 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001494 else:
1495 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001496
Matthias Klose8a96d202010-04-21 22:18:52 +00001497 if (platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
1498 'freebsd7', 'freebsd8')
1499 or platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001500 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001501 else:
1502 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001503
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001504 if platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001505 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001506 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001507 else:
1508 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001509
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001510 if platform == 'darwin':
1511 # _scproxy
1512 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1513 extra_link_args= [
1514 '-framework', 'SystemConfiguration',
1515 '-framework', 'CoreFoundation'
1516 ]))
1517
1518
Tim Peters66cb0182004-08-26 05:23:19 +00001519 if platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001520 sysconfig.get_config_var("CONFIG_ARGS")):
1521
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001522 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001523 # We're on Mac OS X 10.4 or later, the compiler should
1524 # support '-Wno-deprecated-declarations'. This will
1525 # surpress deprecation warnings for the Carbon extensions,
1526 # these extensions wrap the Carbon APIs and even those
1527 # parts that are deprecated.
1528 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1529 else:
1530 carbon_extra_compile_args = []
1531
Just van Rossum05ced6a2002-11-24 23:15:57 +00001532 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001533 def macSrcExists(name1, name2=''):
1534 if not name1:
1535 return None
1536 names = (name1,)
1537 if name2:
1538 names = (name1, name2)
1539 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1540 return os.path.exists(path)
1541
1542 def addMacExtension(name, kwds, extra_srcs=[]):
1543 dirname = ''
1544 if name[0] == '_':
1545 dirname = name[1:].lower()
1546 cname = name + '.c'
1547 cmodulename = name + 'module.c'
1548 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1549 if macSrcExists(cname):
1550 srcs = [cname]
1551 elif macSrcExists(cmodulename):
1552 srcs = [cmodulename]
1553 elif macSrcExists(dirname, cname):
1554 # XXX(nnorwitz): If all the names ended with module, we
1555 # wouldn't need this condition. ibcarbon is the only one.
1556 srcs = [os.path.join(dirname, cname)]
1557 elif macSrcExists(dirname, cmodulename):
1558 srcs = [os.path.join(dirname, cmodulename)]
1559 else:
1560 raise RuntimeError("%s not found" % name)
1561
1562 # Here's the whole point: add the extension with sources
1563 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1564
1565 # Core Foundation
1566 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1567 'extra_link_args': ['-framework', 'CoreFoundation'],
1568 }
1569 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1570 addMacExtension('autoGIL', core_kwds)
1571
Ronald Oussoren51f06332009-09-20 10:31:22 +00001572
1573
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001574 # Carbon
1575 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1576 'extra_link_args': ['-framework', 'Carbon'],
1577 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001578 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1579 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001580 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001581 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001582 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001583 '_Help', '_Icn', '_IBCarbon', '_List',
1584 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001585 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001586 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001587 for name in CARBON_EXTS:
1588 addMacExtension(name, carbon_kwds)
1589
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001590 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1591 # The _Win extension should build just like the other Carbon extensions, but
1592 # this actually results in a hard crash of the linker.
1593 #
1594 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1595 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1596 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1597 }
1598 addMacExtension('_Win', win_kwds)
1599 else:
1600 addMacExtension('_Win', carbon_kwds)
1601
1602
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001603 # Application Services & QuickTime
1604 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1605 'extra_link_args': ['-framework','ApplicationServices'],
1606 }
1607 addMacExtension('_Launch', app_kwds)
1608 addMacExtension('_CG', app_kwds)
1609
Just van Rossum05ced6a2002-11-24 23:15:57 +00001610 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001611 extra_compile_args=carbon_extra_compile_args,
1612 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001613 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001614
Michael W. Hudson5b109102002-01-23 15:04:41 +00001615
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001616 self.extensions.extend(exts)
1617
1618 # Call the method for detecting whether _tkinter can be compiled
1619 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001620
Skip Montanarod1287322007-03-06 15:41:38 +00001621 if '_tkinter' not in [e.name for e in self.extensions]:
1622 missing.append('_tkinter')
1623
1624 return missing
1625
Jack Jansen0b06be72002-06-21 14:48:38 +00001626 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1627 # The _tkinter module, using frameworks. Since frameworks are quite
1628 # different the UNIX search logic is not sharable.
1629 from os.path import join, exists
1630 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001631 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001632 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001633 join(os.getenv('HOME'), '/Library/Frameworks')
1634 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001635
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001636 sysroot = macosx_sdk_root()
1637
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001638 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001639 # bundles.
1640 # XXX distutils should support -F!
1641 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001642 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001643
1644
Jack Jansen0b06be72002-06-21 14:48:38 +00001645 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001646 if is_macosx_sdk_path(F):
1647 if not exists(join(sysroot, F[1:], fw + '.framework')):
1648 break
1649 else:
1650 if not exists(join(F, fw + '.framework')):
1651 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001652 else:
1653 # ok, F is now directory with both frameworks. Continure
1654 # building
1655 break
1656 else:
1657 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1658 # will now resume.
1659 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001660
Jack Jansen0b06be72002-06-21 14:48:38 +00001661 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1662 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001663 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001664 #
1665 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001666 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001667 for fw in 'Tcl', 'Tk'
1668 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1669 ]
1670
Tim Peters2c60f7a2003-01-29 03:49:43 +00001671 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001672 # complicated search, this is a hard-coded path. It could bail out
1673 # if X11 libs are not found...
1674 include_dirs.append('/usr/X11R6/include')
1675 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1676
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001677 # All existing framework builds of Tcl/Tk don't support 64-bit
1678 # architectures.
1679 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1680 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001681
1682 if is_macosx_sdk_path(F):
1683 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1684 else:
1685 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1686
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001687 detected_archs = []
1688 for ln in fp:
1689 a = ln.split()[-1]
1690 if a in archs:
1691 detected_archs.append(ln.split()[-1])
1692 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001693
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001694 for a in detected_archs:
1695 frameworks.append('-arch')
1696 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001697
Jack Jansen0b06be72002-06-21 14:48:38 +00001698 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1699 define_macros=[('WITH_APPINIT', 1)],
1700 include_dirs = include_dirs,
1701 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001702 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001703 extra_link_args = frameworks,
1704 )
1705 self.extensions.append(ext)
1706 return 1
1707
Tim Peters2c60f7a2003-01-29 03:49:43 +00001708
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001709 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001710 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001711
Jack Jansen0b06be72002-06-21 14:48:38 +00001712 # Rather than complicate the code below, detecting and building
1713 # AquaTk is a separate method. Only one Tkinter will be built on
1714 # Darwin - either AquaTk, if it is found, or X11 based Tk.
1715 platform = self.get_platform()
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001716 if (platform == 'darwin' and
1717 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001718 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001719
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001720 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001721 # The versions with dots are used on Unix, and the versions without
1722 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001723 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001724 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1725 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001726 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001727 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001728 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001729 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001730 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001731 # Exit the loop when we've found the Tcl/Tk libraries
1732 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001733
Fredrik Lundhade711a2001-01-24 08:00:28 +00001734 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001735 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001736 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001737 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001738 dotversion = version
1739 if '.' not in dotversion and "bsd" in sys.platform.lower():
1740 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1741 # but the include subdirs are named like .../include/tcl8.3.
1742 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1743 tcl_include_sub = []
1744 tk_include_sub = []
1745 for dir in inc_dirs:
1746 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1747 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1748 tk_include_sub += tcl_include_sub
1749 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1750 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001751
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001752 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001753 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001754 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001755 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001756
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001757 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001758
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001759 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1760 for dir in tcl_includes + tk_includes:
1761 if dir not in include_dirs:
1762 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001763
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001764 # Check for various platform-specific directories
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001765 if platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001766 include_dirs.append('/usr/openwin/include')
1767 added_lib_dirs.append('/usr/openwin/lib')
1768 elif os.path.exists('/usr/X11R6/include'):
1769 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001770 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001771 added_lib_dirs.append('/usr/X11R6/lib')
1772 elif os.path.exists('/usr/X11R5/include'):
1773 include_dirs.append('/usr/X11R5/include')
1774 added_lib_dirs.append('/usr/X11R5/lib')
1775 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001776 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001777 include_dirs.append('/usr/X11/include')
1778 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001779
Jason Tishler9181c942003-02-05 15:16:17 +00001780 # If Cygwin, then verify that X is installed before proceeding
1781 if platform == 'cygwin':
1782 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1783 if x11_inc is None:
1784 return
1785
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001786 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001787 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001788 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001789 defs.append( ('WITH_BLT', 1) )
1790 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001791 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001792 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001793 defs.append( ('WITH_BLT', 1) )
1794 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001795
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001796 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001797 libs.append('tk'+ version)
1798 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001799
Andrew M. Kuchling34febf52001-01-24 03:31:07 +00001800 if platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001801 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001802
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001803 # Finally, link with the X11 libraries (not appropriate on cygwin)
1804 if platform != "cygwin":
1805 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001806
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001807 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1808 define_macros=[('WITH_APPINIT', 1)] + defs,
1809 include_dirs = include_dirs,
1810 libraries = libs,
1811 library_dirs = added_lib_dirs,
1812 )
1813 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001814
Guido van Rossum6c7438e2003-02-11 20:05:50 +00001815## # Uncomment these lines if you want to play with xxmodule.c
1816## ext = Extension('xx', ['xxmodule.c'])
1817## self.extensions.append(ext)
1818
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001819 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001820 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001821 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001822 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001823 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001824 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001825 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001826
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001827 def configure_ctypes_darwin(self, ext):
1828 # Darwin (OS X) uses preconfigured files, in
1829 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001830 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001831 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1832 '_ctypes', 'libffi_osx'))
1833 sources = [os.path.join(ffi_srcdir, p)
1834 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001835 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001836 'x86/x86-darwin.S',
1837 'x86/x86-ffi_darwin.c',
1838 'x86/x86-ffi64.c',
1839 'powerpc/ppc-darwin.S',
1840 'powerpc/ppc-darwin_closure.S',
1841 'powerpc/ppc-ffi_darwin.c',
1842 'powerpc/ppc64-darwin_closure.S',
1843 ]]
1844
1845 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001846 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001847
1848 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1849 os.path.join(ffi_srcdir, 'powerpc')]
1850 ext.include_dirs.extend(include_dirs)
1851 ext.sources.extend(sources)
1852 return True
1853
Thomas Hellereba43c12006-04-07 19:04:09 +00001854 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001855 if not self.use_system_libffi:
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001856 if sys.platform == 'darwin':
1857 return self.configure_ctypes_darwin(ext)
1858
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001859 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001860 ffi_builddir = os.path.join(self.build_temp, 'libffi')
1861 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1862 '_ctypes', 'libffi'))
1863 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00001864
Thomas Heller5e218b42006-04-27 15:50:42 +00001865 from distutils.dep_util import newer_group
1866
1867 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00001868 for fname in os.listdir(ffi_srcdir)
1869 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00001870 if self.force or newer_group(config_sources,
1871 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001872 from distutils.dir_util import mkpath
1873 mkpath(ffi_builddir)
1874 config_args = []
Christian Heimes6fd32482012-09-06 18:02:49 +02001875 if not self.verbose:
1876 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00001877
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001878 # Pass empty CFLAGS because we'll just append the resulting
1879 # CFLAGS to Python's; -g or -O2 is to be avoided.
1880 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
1881 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00001882
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001883 res = os.system(cmd)
1884 if res or not os.path.exists(ffi_configfile):
1885 print "Failed to configure _ctypes module"
1886 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00001887
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001888 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00001889 with open(ffi_configfile) as f:
1890 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00001891
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001892 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001893 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00001894
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001895 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001896 ffi_builddir,
1897 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001898 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00001899
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001900 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
1901 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001902 ext.include_dirs.extend(include_dirs)
1903 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00001904 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00001905
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001906 def detect_ctypes(self, inc_dirs, lib_dirs):
1907 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00001908 include_dirs = []
1909 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00001910 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00001911 sources = ['_ctypes/_ctypes.c',
1912 '_ctypes/callbacks.c',
1913 '_ctypes/callproc.c',
1914 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00001915 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00001916 depends = ['_ctypes/ctypes.h']
1917
1918 if sys.platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00001919 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00001920 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001921 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00001922 include_dirs.append('_ctypes/darwin')
1923# XXX Is this still needed?
1924## extra_link_args.extend(['-read_only_relocs', 'warning'])
1925
Thomas Heller17984892006-08-04 18:57:34 +00001926 elif sys.platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00001927 # XXX This shouldn't be necessary; it appears that some
1928 # of the assembler code is non-PIC (i.e. it has relocations
1929 # when it shouldn't. The proper fix would be to rewrite
1930 # the assembler code to be PIC.
1931 # This only works with GCC; the Sun compiler likely refuses
1932 # this option. If you want to compile ctypes with the Sun
1933 # compiler, please research a proper solution, instead of
1934 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00001935 extra_link_args.append('-mimpure-text')
1936
Thomas Hellerde2d78a2008-06-02 18:41:30 +00001937 elif sys.platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00001938 extra_link_args.append('-fPIC')
1939
Thomas Hellercf567c12006-03-08 19:51:58 +00001940 ext = Extension('_ctypes',
1941 include_dirs=include_dirs,
1942 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00001943 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001944 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00001945 sources=sources,
1946 depends=depends)
1947 ext_test = Extension('_ctypes_test',
1948 sources=['_ctypes/_ctypes_test.c'])
1949 self.extensions.extend([ext, ext_test])
1950
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001951 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
1952 return
1953
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001954 if sys.platform == 'darwin':
1955 # OS X 10.5 comes with libffi.dylib; the include files are
1956 # in /usr/include/ffi
1957 inc_dirs.append('/usr/include/ffi')
1958
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001959 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00001960 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00001961 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001962 if ffi_inc is not None:
1963 ffi_h = ffi_inc[0] + '/ffi.h'
1964 fp = open(ffi_h)
1965 while 1:
1966 line = fp.readline()
1967 if not line:
1968 ffi_inc = None
1969 break
1970 if line.startswith('#define LIBFFI_H'):
1971 break
1972 ffi_lib = None
1973 if ffi_inc is not None:
1974 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001975 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001976 ffi_lib = lib_name
1977 break
1978
1979 if ffi_inc and ffi_lib:
1980 ext.include_dirs.extend(ffi_inc)
1981 ext.libraries.append(ffi_lib)
1982 self.use_system_libffi = True
1983
1984
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00001985class PyBuildInstall(install):
1986 # Suppress the warning about installation into the lib_dynload
1987 # directory, which is not in sys.path when running Python during
1988 # installation:
1989 def initialize_options (self):
1990 install.initialize_options(self)
1991 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00001992
Michael W. Hudson529a5052002-12-17 16:47:17 +00001993class PyBuildInstallLib(install_lib):
1994 # Do exactly what install_lib does but make sure correct access modes get
1995 # set on installed directories and files. All installed files with get
1996 # mode 644 unless they are a shared library in which case they will get
1997 # mode 755. All installed directories will get mode 755.
1998
1999 so_ext = sysconfig.get_config_var("SO")
2000
2001 def install(self):
2002 outfiles = install_lib.install(self)
2003 self.set_file_modes(outfiles, 0644, 0755)
2004 self.set_dir_modes(self.install_dir, 0755)
2005 return outfiles
2006
2007 def set_file_modes(self, files, defaultMode, sharedLibMode):
2008 if not self.is_chmod_supported(): return
2009 if not files: return
2010
2011 for filename in files:
2012 if os.path.islink(filename): continue
2013 mode = defaultMode
2014 if filename.endswith(self.so_ext): mode = sharedLibMode
2015 log.info("changing mode of %s to %o", filename, mode)
2016 if not self.dry_run: os.chmod(filename, mode)
2017
2018 def set_dir_modes(self, dirname, mode):
2019 if not self.is_chmod_supported(): return
2020 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2021
2022 def set_dir_modes_visitor(self, mode, dirname, names):
2023 if os.path.islink(dirname): return
2024 log.info("changing mode of %s to %o", dirname, mode)
2025 if not self.dry_run: os.chmod(dirname, mode)
2026
2027 def is_chmod_supported(self):
2028 return hasattr(os, 'chmod')
2029
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002030SUMMARY = """
2031Python is an interpreted, interactive, object-oriented programming
2032language. It is often compared to Tcl, Perl, Scheme or Java.
2033
2034Python combines remarkable power with very clear syntax. It has
2035modules, classes, exceptions, very high level dynamic data types, and
2036dynamic typing. There are interfaces to many system calls and
2037libraries, as well as to various windowing systems (X11, Motif, Tk,
2038Mac, MFC). New built-in modules are easily written in C or C++. Python
2039is also usable as an extension language for applications that need a
2040programmable interface.
2041
2042The Python implementation is portable: it runs on many brands of UNIX,
2043on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2044listed here, it may still be supported, if there's a C compiler for
2045it. Ask around on comp.lang.python -- or just try compiling Python
2046yourself.
2047"""
2048
2049CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002050Development Status :: 6 - Mature
2051License :: OSI Approved :: Python Software Foundation License
2052Natural Language :: English
2053Programming Language :: C
2054Programming Language :: Python
2055Topic :: Software Development
2056"""
2057
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002058def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002059 # turn off warnings when deprecated modules are imported
2060 import warnings
2061 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002062 setup(# PyPI Metadata (PEP 301)
2063 name = "Python",
2064 version = sys.version.split()[0],
2065 url = "http://www.python.org/%s" % sys.version[:3],
2066 maintainer = "Guido van Rossum and the Python community",
2067 maintainer_email = "python-dev@python.org",
2068 description = "A high-level object-oriented programming language",
2069 long_description = SUMMARY.strip(),
2070 license = "PSF license",
2071 classifiers = filter(None, CLASSIFIERS.split("\n")),
2072 platforms = ["Many"],
2073
2074 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002075 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2076 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002077 # The struct module is defined here, because build_ext won't be
2078 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002079 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002080
2081 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002082 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002083 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002084 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002085 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002086
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002087# --install-platlib
2088if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002089 main()