blob: a46bf35eb434fb081d4dade9afa11e5100915209 [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
doko@python.orgd65e2ba2013-01-31 23:52:03 +010020cross_compiling = "_PYTHON_HOST_PLATFORM" in os.environ
21
22def get_platform():
23 # cross build
24 if "_PYTHON_HOST_PLATFORM" in os.environ:
25 return os.environ["_PYTHON_HOST_PLATFORM"]
26 # Get value of sys.platform
27 if sys.platform.startswith('osf1'):
28 return 'osf1'
29 return sys.platform
30host_platform = get_platform()
31
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000032# Were we compiled --with-pydebug or with #define Py_DEBUG?
doko@python.orgd65e2ba2013-01-31 23:52:03 +010033COMPILED_WITH_PYDEBUG = ('--with-pydebug' in sysconfig.get_config_var("CONFIG_ARGS"))
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +000034
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +000035# This global variable is used to hold the list of modules to be disabled.
36disabled_module_list = []
37
Michael W. Hudson39230b32002-01-16 15:26:48 +000038def add_dir_to_list(dirlist, dir):
39 """Add the directory 'dir' to the list 'dirlist' (at the front) if
40 1) 'dir' is not already in 'dirlist'
41 2) 'dir' actually exists, and is a directory."""
Jack Jansen4439b7c2002-06-26 15:44:30 +000042 if dir is not None and os.path.isdir(dir) and dir not in dirlist:
Michael W. Hudson39230b32002-01-16 15:26:48 +000043 dirlist.insert(0, dir)
44
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000045def macosx_sdk_root():
46 """
47 Return the directory of the current OSX SDK,
48 or '/' if no SDK was specified.
49 """
50 cflags = sysconfig.get_config_var('CFLAGS')
51 m = re.search(r'-isysroot\s+(\S+)', cflags)
52 if m is None:
53 sysroot = '/'
54 else:
55 sysroot = m.group(1)
56 return sysroot
57
58def is_macosx_sdk_path(path):
59 """
60 Returns True if 'path' can be located in an OSX SDK
61 """
Ned Deilyd8ec4642012-07-30 04:07:49 -070062 return ( (path.startswith('/usr/') and not path.startswith('/usr/local'))
63 or path.startswith('/System/')
64 or path.startswith('/Library/') )
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000065
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000066def find_file(filename, std_dirs, paths):
67 """Searches for the directory where a given file is located,
68 and returns a possibly-empty list of additional directories, or None
69 if the file couldn't be found at all.
Fredrik Lundhade711a2001-01-24 08:00:28 +000070
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000071 'filename' is the name of a file, such as readline.h or libcrypto.a.
72 'std_dirs' is the list of standard system directories; if the
73 file is found in one of them, no additional directives are needed.
74 'paths' is a list of additional locations to check; if the file is
75 found in one of them, the resulting list will contain the directory.
76 """
doko@python.orgd65e2ba2013-01-31 23:52:03 +010077 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000078 # Honor the MacOSX SDK setting when one was specified.
79 # An SDK is a directory with the same structure as a real
80 # system, but with only header files and libraries.
81 sysroot = macosx_sdk_root()
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000082
83 # Check the standard locations
84 for dir in std_dirs:
85 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000086
doko@python.orgd65e2ba2013-01-31 23:52:03 +010087 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000088 f = os.path.join(sysroot, dir[1:], filename)
89
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000090 if os.path.exists(f): return []
91
92 # Check the additional directories
93 for dir in paths:
94 f = os.path.join(dir, filename)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000095
doko@python.orgd65e2ba2013-01-31 23:52:03 +010096 if host_platform == 'darwin' and is_macosx_sdk_path(dir):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +000097 f = os.path.join(sysroot, dir[1:], filename)
98
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +000099 if os.path.exists(f):
100 return [dir]
101
102 # Not found anywhere
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000103 return None
104
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000105def find_library_file(compiler, libname, std_dirs, paths):
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000106 result = compiler.find_library_file(std_dirs + paths, libname)
107 if result is None:
108 return None
Fredrik Lundhade711a2001-01-24 08:00:28 +0000109
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100110 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000111 sysroot = macosx_sdk_root()
112
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000113 # Check whether the found file is in one of the standard directories
114 dirname = os.path.dirname(result)
115 for p in std_dirs:
116 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000117 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000118
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100119 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000120 if os.path.join(sysroot, p[1:]) == dirname:
121 return [ ]
122
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000123 if p == dirname:
124 return [ ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000125
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000126 # Otherwise, it must have been in one of the additional directories,
127 # so we have to figure out which one.
128 for p in paths:
129 # Ensure path doesn't end with path separator
Skip Montanaro9f5178a2003-05-06 20:59:57 +0000130 p = p.rstrip(os.sep)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000131
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100132 if host_platform == 'darwin' and is_macosx_sdk_path(p):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000133 if os.path.join(sysroot, p[1:]) == dirname:
134 return [ p ]
135
Andrew M. Kuchlinga246d9f2002-11-27 13:43:46 +0000136 if p == dirname:
137 return [p]
138 else:
139 assert False, "Internal error: Path not found in std_dirs or paths"
Tim Peters2c60f7a2003-01-29 03:49:43 +0000140
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000141def module_enabled(extlist, modname):
142 """Returns whether the module 'modname' is present in the list
143 of extensions 'extlist'."""
144 extlist = [ext for ext in extlist if ext.name == modname]
145 return len(extlist)
Fredrik Lundhade711a2001-01-24 08:00:28 +0000146
Jack Jansen144ebcc2001-08-05 22:31:19 +0000147def find_module_file(module, dirlist):
148 """Find a module in a set of possible folders. If it is not found
149 return the unadorned filename"""
150 list = find_file(module, [], dirlist)
151 if not list:
152 return module
153 if len(list) > 1:
Guido van Rossum12471d62003-02-20 02:11:43 +0000154 log.info("WARNING: multiple copies of %s found"%module)
Jack Jansen144ebcc2001-08-05 22:31:19 +0000155 return os.path.join(list[0], module)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000156
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000157class PyBuildExt(build_ext):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000158
Skip Montanarod1287322007-03-06 15:41:38 +0000159 def __init__(self, dist):
160 build_ext.__init__(self, dist)
161 self.failed = []
162
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000163 def build_extensions(self):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000164
165 # Detect which modules should be compiled
Skip Montanarod1287322007-03-06 15:41:38 +0000166 missing = self.detect_modules()
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000167
168 # Remove modules that are present on the disabled list
Christian Heimesb222bbc2008-01-18 09:51:43 +0000169 extensions = [ext for ext in self.extensions
170 if ext.name not in disabled_module_list]
171 # move ctypes to the end, it depends on other modules
172 ext_map = dict((ext.name, i) for i, ext in enumerate(extensions))
173 if "_ctypes" in ext_map:
174 ctypes = extensions.pop(ext_map["_ctypes"])
175 extensions.append(ctypes)
176 self.extensions = extensions
Fredrik Lundhade711a2001-01-24 08:00:28 +0000177
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000178 # Fix up the autodetected modules, prefixing all the source files
179 # with Modules/ and adding Python's include directory to the path.
180 (srcdir,) = sysconfig.get_config_vars('srcdir')
Guido van Rossume0fea6c2002-10-14 20:48:09 +0000181 if not srcdir:
182 # Maybe running on Windows but not using CYGWIN?
183 raise ValueError("No source directory; cannot proceed.")
Neil Schemenauer0189ddc2009-02-06 00:21:55 +0000184 srcdir = os.path.abspath(srcdir)
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000185 moddirlist = [os.path.join(srcdir, 'Modules')]
Michael W. Hudson5b109102002-01-23 15:04:41 +0000186
Jack Jansen144ebcc2001-08-05 22:31:19 +0000187 # Platform-dependent module source and include directories
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000188 incdirlist = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100189
190 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Brett Cannoncc8a4f62004-08-26 01:44:07 +0000191 sysconfig.get_config_var("CONFIG_ARGS")):
Jack Jansen144ebcc2001-08-05 22:31:19 +0000192 # Mac OS X also includes some mac-specific modules
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000193 macmoddir = os.path.join(srcdir, 'Mac/Modules')
Jack Jansen144ebcc2001-08-05 22:31:19 +0000194 moddirlist.append(macmoddir)
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000195 incdirlist.append(os.path.join(srcdir, 'Mac/Include'))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000196
Andrew M. Kuchling3da989c2001-02-28 22:49:26 +0000197 # Fix up the paths for scripts, too
198 self.distribution.scripts = [os.path.join(srcdir, filename)
199 for filename in self.distribution.scripts]
200
Christian Heimes8608d912008-01-25 15:52:11 +0000201 # Python header files
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000202 headers = [sysconfig.get_config_h_filename()]
Stefan Krah4666ebd2012-02-29 14:17:18 +0100203 headers += glob(os.path.join(sysconfig.get_path('include'), "*.h"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000204 for ext in self.extensions[:]:
Jack Jansen144ebcc2001-08-05 22:31:19 +0000205 ext.sources = [ find_module_file(filename, moddirlist)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000206 for filename in ext.sources ]
Jeremy Hylton340043e2002-06-13 17:38:11 +0000207 if ext.depends is not None:
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000208 ext.depends = [find_module_file(filename, moddirlist)
Jeremy Hylton340043e2002-06-13 17:38:11 +0000209 for filename in ext.depends]
Christian Heimes8608d912008-01-25 15:52:11 +0000210 else:
211 ext.depends = []
212 # re-compile extensions if a header file has been changed
213 ext.depends.extend(headers)
214
Neil Schemenauer38870cb2009-02-05 22:14:04 +0000215 # platform specific include directories
216 ext.include_dirs.extend(incdirlist)
217
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000218 # If a module has already been built statically,
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000219 # don't build it here
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000220 if ext.name in sys.builtin_module_names:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000221 self.extensions.remove(ext)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000222
Ronald Oussoren9545a232010-05-05 19:09:31 +0000223 # Parse Modules/Setup and Modules/Setup.local to figure out which
224 # modules are turned on in the file.
225 remove_modules = []
226 for filename in ('Modules/Setup', 'Modules/Setup.local'):
227 input = text_file.TextFile(filename, join_lines=1)
228 while 1:
229 line = input.readline()
230 if not line: break
231 line = line.split()
232 remove_modules.append(line[0])
233 input.close()
Tim Peters1b27f862005-12-30 18:42:42 +0000234
Ronald Oussoren9545a232010-05-05 19:09:31 +0000235 for ext in self.extensions[:]:
236 if ext.name in remove_modules:
237 self.extensions.remove(ext)
Michael W. Hudson5b109102002-01-23 15:04:41 +0000238
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000239 # When you run "make CC=altcc" or something similar, you really want
240 # those environment variables passed into the setup.py phase. Here's
241 # a small set of useful ones.
242 compiler = os.environ.get('CC')
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000243 args = {}
244 # unfortunately, distutils doesn't let us provide separate C and C++
245 # compilers
246 if compiler is not None:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000247 (ccshared,cflags) = sysconfig.get_config_vars('CCSHARED','CFLAGS')
248 args['compiler_so'] = compiler + ' ' + ccshared + ' ' + cflags
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000249 self.compiler.set_executables(**args)
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000250
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000251 build_ext.build_extensions(self)
252
Skip Montanarod1287322007-03-06 15:41:38 +0000253 longest = max([len(e.name) for e in self.extensions])
254 if self.failed:
255 longest = max(longest, max([len(name) for name in self.failed]))
256
257 def print_three_column(lst):
Georg Brandle95cf1c2007-03-06 17:49:14 +0000258 lst.sort(key=str.lower)
Skip Montanarod1287322007-03-06 15:41:38 +0000259 # guarantee zip() doesn't drop anything
260 while len(lst) % 3:
261 lst.append("")
262 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
263 print "%-*s %-*s %-*s" % (longest, e, longest, f,
264 longest, g)
Skip Montanarod1287322007-03-06 15:41:38 +0000265
266 if missing:
267 print
Georg Brandl40f982f2008-12-28 11:58:49 +0000268 print ("Python build finished, but the necessary bits to build "
269 "these modules were not found:")
Skip Montanarod1287322007-03-06 15:41:38 +0000270 print_three_column(missing)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000271 print ("To find the necessary bits, look in setup.py in"
272 " detect_modules() for the module's name.")
273 print
Skip Montanarod1287322007-03-06 15:41:38 +0000274
275 if self.failed:
276 failed = self.failed[:]
277 print
278 print "Failed to build these modules:"
279 print_three_column(failed)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000280 print
Skip Montanarod1287322007-03-06 15:41:38 +0000281
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000282 def build_extension(self, ext):
283
Thomas Hellereba43c12006-04-07 19:04:09 +0000284 if ext.name == '_ctypes':
Thomas Heller795246c2006-04-07 19:27:56 +0000285 if not self.configure_ctypes(ext):
286 return
Thomas Hellereba43c12006-04-07 19:04:09 +0000287
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000288 try:
289 build_ext.build_extension(self, ext)
290 except (CCompilerError, DistutilsError), why:
291 self.announce('WARNING: building of extension "%s" failed: %s' %
292 (ext.name, sys.exc_info()[1]))
Skip Montanarod1287322007-03-06 15:41:38 +0000293 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000294 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000295 # Workaround for Mac OS X: The Carbon-based modules cannot be
296 # reliably imported into a command-line Python
297 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000298 self.announce(
299 'WARNING: skipping import check for Carbon-based "%s"' %
300 ext.name)
301 return
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000302
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100303 if host_platform == 'darwin' and (
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000304 sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
305 # Don't bother doing an import check when an extension was
306 # build with an explicit '-arch' flag on OSX. That's currently
307 # only used to build 32-bit only extensions in a 4-way
308 # universal build and loading 32-bit code into a 64-bit
309 # process will fail.
310 self.announce(
311 'WARNING: skipping import check for "%s"' %
312 ext.name)
313 return
314
Jason Tishler24cf7762002-05-22 16:46:15 +0000315 # Workaround for Cygwin: Cygwin currently has fork issues when many
316 # modules have been imported
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100317 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000318 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
319 % ext.name)
320 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000321 ext_filename = os.path.join(
322 self.build_lib,
323 self.get_ext_filename(self.get_ext_fullname(ext.name)))
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100324
325 # Don't try to load extensions for cross builds
326 if cross_compiling:
327 return
328
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000329 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000330 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000331 except ImportError, why:
Skip Montanarod1287322007-03-06 15:41:38 +0000332 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000333 self.announce('*** WARNING: renaming "%s" since importing it'
334 ' failed: %s' % (ext.name, why), level=3)
335 assert not self.inplace
336 basename, tail = os.path.splitext(ext_filename)
337 newname = basename + "_failed" + tail
338 if os.path.exists(newname):
339 os.remove(newname)
340 os.rename(ext_filename, newname)
341
342 # XXX -- This relies on a Vile HACK in
343 # distutils.command.build_ext.build_extension(). The
344 # _built_objects attribute is stored there strictly for
345 # use here.
346 # If there is a failure, _built_objects may not be there,
347 # so catch the AttributeError and move on.
348 try:
349 for filename in self._built_objects:
350 os.remove(filename)
351 except AttributeError:
352 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000353 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000354 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000355 self.announce('*** WARNING: importing extension "%s" '
356 'failed with %s: %s' % (ext.name, exc_type, why),
357 level=3)
Skip Montanarod1287322007-03-06 15:41:38 +0000358 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000359
Barry Warsawffc9caf2011-04-07 11:28:11 -0400360 def add_multiarch_paths(self):
361 # Debian/Ubuntu multiarch support.
362 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3d2fc152012-09-21 13:51:40 +0200363 cc = sysconfig.get_config_var('CC')
364 tmpfile = os.path.join(self.build_temp, 'multiarch')
365 if not os.path.exists(self.build_temp):
366 os.makedirs(self.build_temp)
367 ret = os.system(
368 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
369 multiarch_path_component = ''
370 try:
371 if ret >> 8 == 0:
372 with open(tmpfile) as fp:
373 multiarch_path_component = fp.readline().strip()
374 finally:
375 os.unlink(tmpfile)
376
377 if multiarch_path_component != '':
378 add_dir_to_list(self.compiler.library_dirs,
379 '/usr/lib/' + multiarch_path_component)
380 add_dir_to_list(self.compiler.include_dirs,
381 '/usr/include/' + multiarch_path_component)
382 return
383
Barry Warsawffc9caf2011-04-07 11:28:11 -0400384 if not find_executable('dpkg-architecture'):
385 return
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100386 opt = ''
387 if cross_compiling:
388 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400389 tmpfile = os.path.join(self.build_temp, 'multiarch')
390 if not os.path.exists(self.build_temp):
391 os.makedirs(self.build_temp)
392 ret = os.system(
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100393 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
394 (opt, tmpfile))
Barry Warsawffc9caf2011-04-07 11:28:11 -0400395 try:
396 if ret >> 8 == 0:
397 with open(tmpfile) as fp:
398 multiarch_path_component = fp.readline().strip()
399 add_dir_to_list(self.compiler.library_dirs,
400 '/usr/lib/' + multiarch_path_component)
401 add_dir_to_list(self.compiler.include_dirs,
402 '/usr/include/' + multiarch_path_component)
403 finally:
404 os.unlink(tmpfile)
405
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100406 def add_gcc_paths(self):
407 gcc = sysconfig.get_config_var('CC')
408 tmpfile = os.path.join(self.build_temp, 'gccpaths')
409 if not os.path.exists(self.build_temp):
410 os.makedirs(self.build_temp)
411 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
412 is_gcc = False
413 in_incdirs = False
414 inc_dirs = []
415 lib_dirs = []
416 try:
417 if ret >> 8 == 0:
418 with open(tmpfile) as fp:
419 for line in fp.readlines():
420 if line.startswith("gcc version"):
421 is_gcc = True
422 elif line.startswith("#include <...>"):
423 in_incdirs = True
424 elif line.startswith("End of search list"):
425 in_incdirs = False
426 elif is_gcc and line.startswith("LIBRARY_PATH"):
427 for d in line.strip().split("=")[1].split(":"):
428 d = os.path.normpath(d)
429 if '/gcc/' not in d:
430 add_dir_to_list(self.compiler.library_dirs,
431 d)
432 elif is_gcc and in_incdirs and '/gcc/' not in line:
433 add_dir_to_list(self.compiler.include_dirs,
434 line.strip())
435 finally:
436 os.unlink(tmpfile)
437
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000438 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000439 # Ensure that /usr/local is always used
Ned Deily61667092013-05-15 18:00:45 -0700440 if not cross_compiling:
441 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
442 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
443 if cross_compiling:
444 self.add_gcc_paths()
Barry Warsawffc9caf2011-04-07 11:28:11 -0400445 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000446
Brett Cannon516592f2004-12-07 00:42:59 +0000447 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000448 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000449 # We must get the values from the Makefile and not the environment
450 # directly since an inconsistently reproducible issue comes up where
451 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000452 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000453 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000454 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
455 ('LDFLAGS', '-L', self.compiler.library_dirs),
456 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000457 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000458 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000459 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000460 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000461 # all double dashes and any dashes followed by a character
462 # that is not for the option we are dealing with.
463 #
464 # Please note that order of the regex is important! We must
465 # strip out double-dashes first so that we don't end up with
466 # substituting "--Long" to "-Long" and thus lead to "ong" being
467 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000468 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
469 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000470 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000471 # Make sure that allowing args interspersed with options is
472 # allowed
473 parser.allow_interspersed_args = True
474 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000475 parser.add_option(arg_name, dest="dirs", action="append")
476 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000477 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000478 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000479 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000480
Ronald Oussoren24215252010-10-20 13:11:46 +0000481 if os.path.normpath(sys.prefix) != '/usr' \
482 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
483 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
484 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
485 # building a framework with different architectures than
486 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000487 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000488 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000489 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000490 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000491
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000492 try:
493 have_unicode = unicode
494 except NameError:
495 have_unicode = 0
496
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000497 # lib_dirs and inc_dirs are used to search for files;
498 # if a file is found in one of those directories, it can
499 # be assumed that no additional -I,-L directives are needed.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100500 inc_dirs = self.compiler.include_dirs[:]
501 lib_dirs = self.compiler.library_dirs[:]
502 if not cross_compiling:
503 for d in (
504 '/usr/include',
505 ):
506 add_dir_to_list(inc_dirs, d)
507 for d in (
508 '/lib64', '/usr/lib64',
509 '/lib', '/usr/lib',
510 ):
511 add_dir_to_list(lib_dirs, d)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000512 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000513 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000514
Brett Cannon4454a1f2005-04-15 20:32:39 +0000515 config_h = sysconfig.get_config_h_filename()
516 config_h_vars = sysconfig.parse_config_h(open(config_h))
517
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000518 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000519
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000520 # Check for AtheOS which has libraries in non-standard locations
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100521 if host_platform == 'atheos':
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000522 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
523 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
524 inc_dirs += ['/system/include', '/atheos/autolnk/include']
525 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
526
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000527 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100528 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000529 lib_dirs += ['/usr/ccs/lib']
530
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200531 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100532 if host_platform == 'hp-ux11':
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200533 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
534
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100535 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000536 # This should work on any unixy platform ;-)
537 # If the user has bothered specifying additional -I and -L flags
538 # in OPT and LDFLAGS we might as well use them here.
539 # NOTE: using shlex.split would technically be more correct, but
540 # also gives a bootstrap problem. Let's hope nobody uses directories
541 # with whitespace in the name to store libraries.
542 cflags, ldflags = sysconfig.get_config_vars(
543 'CFLAGS', 'LDFLAGS')
544 for item in cflags.split():
545 if item.startswith('-I'):
546 inc_dirs.append(item[2:])
547
548 for item in ldflags.split():
549 if item.startswith('-L'):
550 lib_dirs.append(item[2:])
551
Fredrik Lundhade711a2001-01-24 08:00:28 +0000552 # Check for MacOS X, which doesn't need libm.a at all
553 math_libs = ['m']
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100554 if host_platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000555 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000556
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000557 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
558
559 #
560 # The following modules are all pretty straightforward, and compile
561 # on pretty much any POSIXish platform.
562 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000563
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000564 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000565 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000566
567 # array objects
568 exts.append( Extension('array', ['arraymodule.c']) )
569 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000570 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
571 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000572 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000573 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000574 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000575 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000576 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000577 # fast string operations implemented in C
578 exts.append( Extension('strop', ['stropmodule.c']) )
579 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000580 exts.append( Extension('time', ['timemodule.c'],
581 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000582 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000583 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000584 # fast iterator tools implemented in C
585 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000586 # code that will be builtins in the future, but conflict with the
587 # current builtins
588 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000589 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000590 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000591 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000592 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000593 # bisect
594 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000595 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000596 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000597 # operator.add() and similar goodies
598 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000599 # Python 3.1 _io library
600 exts.append( Extension("_io",
601 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
602 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
603 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000604 # _functools
605 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000606 # _json speedups
607 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000608 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000609 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
610 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000611 # profilers (_lsprof is for cProfile.py)
612 exts.append( Extension('_hotshot', ['_hotshot.c']) )
613 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000614 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000615 if have_unicode:
616 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000617 else:
618 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000619 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000620 data = open('pyconfig.h').read()
621 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
622 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000623 locale_libs = ['intl']
624 else:
625 locale_libs = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100626 if host_platform == 'darwin':
Jack Jansen84b74472004-07-15 19:56:25 +0000627 locale_extra_link_args = ['-framework', 'CoreFoundation']
628 else:
629 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000630
Jack Jansen84b74472004-07-15 19:56:25 +0000631
Jason Tishlerd28216b2002-08-14 11:13:52 +0000632 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000633 libraries=locale_libs,
634 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000635
636 # Modules with some UNIX dependencies -- on by default:
637 # (If you have a really backward UNIX, select and socket may not be
638 # supported...)
639
640 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000641 libs = []
642 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
643 # May be necessary on AIX for flock function
644 libs = ['bsd']
645 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000646 # pwd(3)
647 exts.append( Extension('pwd', ['pwdmodule.c']) )
648 # grp(3)
649 exts.append( Extension('grp', ['grpmodule.c']) )
650 # spwd, shadow passwords
651 if (config_h_vars.get('HAVE_GETSPNAM', False) or
652 config_h_vars.get('HAVE_GETSPENT', False)):
653 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000654 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000655 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000656
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000657 # select(2); not on ancient System V
658 exts.append( Extension('select', ['selectmodule.c']) )
659
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000660 # Fred Drake's interface to the Python parser
661 exts.append( Extension('parser', ['parsermodule.c']) )
662
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000663 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000664 exts.append( Extension('cStringIO', ['cStringIO.c']) )
665 exts.append( Extension('cPickle', ['cPickle.c']) )
666
667 # Memory-mapped files (also works on Win32).
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100668 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000669 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000670 else:
671 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000672
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000673 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000674 # syslog daemon interface
675 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000676
677 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000678 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
679 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
680 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000681
682 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000683 # Here ends the simple stuff. From here on, modules need certain
684 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000685 #
686
687 # Multimedia modules
688 # These don't work for 64-bit platforms!!!
689 # These represent audio samples or images as strings:
690
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000691 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000692 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000693 # 64-bit platforms.
694 exts.append( Extension('audioop', ['audioop.c']) )
695
Fredrik Lundhade711a2001-01-24 08:00:28 +0000696 # Disabled on 64-bit platforms
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000697 if sys.maxint != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000698 # Operations on images
699 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000700 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000701 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000702
703 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000704 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000705 readline_termcap_library = ""
706 curses_library = ""
707 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000708 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000709 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000710 ldd_output = fp.readlines()
711 ret = fp.close()
712 if ret is None or ret >> 8 == 0:
713 for ln in ldd_output:
714 if 'curses' in ln:
715 readline_termcap_library = re.sub(
716 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
717 ).rstrip()
718 break
719 if 'tinfo' in ln: # termcap interface split out from ncurses
720 readline_termcap_library = 'tinfo'
721 break
Stefan Krah449aa862010-06-03 12:39:50 +0000722 # Issue 7384: If readline is already linked against curses,
723 # use the same library for the readline and curses modules.
724 if 'curses' in readline_termcap_library:
725 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000726 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000727 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000728 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000729 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000730 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000731 curses_library = 'curses'
732
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100733 if host_platform == 'darwin':
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000734 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000735 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily1f70b872014-06-25 13:33:57 -0700736 if (dep_target and
737 (tuple(int(n) for n in dep_target.split('.')[0:2])
738 < (10, 5) ) ):
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000739 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000740 if os_release < 9:
741 # MacOSX 10.4 has a broken readline. Don't try to build
742 # the readline module unless the user has installed a fixed
743 # readline package
744 if find_file('readline/rlconf.h', inc_dirs, []) is None:
745 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000746 if do_readline:
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100747 if host_platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000748 # In every directory on the search path search for a dynamic
749 # library and then a static library, instead of first looking
750 # for dynamic libraries on the entiry path.
751 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000752 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000753 readline_extra_link_args = ('-Wl,-search_paths_first',)
754 else:
755 readline_extra_link_args = ()
756
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000757 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000758 if readline_termcap_library:
759 pass # Issue 7384: Already linked against curses or tinfo.
760 elif curses_library:
761 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000762 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000763 ['/usr/lib/termcap'],
764 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000765 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000766 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000767 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000768 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000769 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000770 else:
771 missing.append('readline')
772
Ronald Oussoren9545a232010-05-05 19:09:31 +0000773 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000774
Ronald Oussoren9545a232010-05-05 19:09:31 +0000775 if self.compiler.find_library_file(lib_dirs, 'crypt'):
776 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000777 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000778 libs = []
779 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000780
Skip Montanaroba9e9782003-03-20 23:34:22 +0000781 # CSV files
782 exts.append( Extension('_csv', ['_csv.c']) )
783
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000784 # socket(2)
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700785 exts.append( Extension('_socket', ['socketmodule.c', 'timemodule.c'],
786 depends=['socketmodule.h'],
787 libraries=math_libs) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000788 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000789 search_for_ssl_incs_in = [
790 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000791 '/usr/contrib/ssl/include/'
792 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000793 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
794 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000795 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000796 if ssl_incs is not None:
797 krb5_h = find_file('krb5.h', inc_dirs,
798 ['/usr/kerberos/include'])
799 if krb5_h:
800 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000801 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000802 ['/usr/local/ssl/lib',
803 '/usr/contrib/ssl/lib/'
804 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000805
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000806 if (ssl_incs is not None and
807 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000808 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000809 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000810 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000811 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000812 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000813 else:
814 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000815
Gregory P. Smithade97332005-08-23 21:19:40 +0000816 # find out which version of OpenSSL we have
817 openssl_ver = 0
818 openssl_ver_re = re.compile(
819 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000820
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000821 # look for the openssl version header on the compiler search path.
822 opensslv_h = find_file('openssl/opensslv.h', [],
823 inc_dirs + search_for_ssl_incs_in)
824 if opensslv_h:
825 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100826 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000827 name = os.path.join(macosx_sdk_root(), name[1:])
828 try:
829 incfile = open(name, 'r')
830 for line in incfile:
831 m = openssl_ver_re.match(line)
832 if m:
833 openssl_ver = eval(m.group(1))
834 except IOError, msg:
835 print "IOError while reading opensshv.h:", msg
836 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000837
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000838 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000839 have_any_openssl = ssl_incs is not None and ssl_libs is not None
840 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000841 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000842
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000843 if have_any_openssl:
844 if have_usable_openssl:
845 # The _hashlib module wraps optimized implementations
846 # of hash functions from the OpenSSL library.
847 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
848 include_dirs = ssl_incs,
849 library_dirs = ssl_libs,
850 libraries = ['ssl', 'crypto']) )
851 else:
852 print ("warning: openssl 0x%08x is too old for _hashlib" %
853 openssl_ver)
854 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000855 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000856 # The _sha module implements the SHA1 hash algorithm.
857 exts.append( Extension('_sha', ['shamodule.c']) )
858 # The _md5 module implements the RSA Data Security, Inc. MD5
859 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000860 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000861 exts.append( Extension('_md5',
862 sources = ['md5module.c', 'md5.c'],
863 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000864
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000865 min_sha2_openssl_ver = 0x00908000
866 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000867 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
868 exts.append( Extension('_sha256', ['sha256module.c']) )
869 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000870
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000871 # Modules that provide persistent dictionary-like semantics. You will
872 # probably want to arrange for at least one of them to be available on
873 # your machine, though none are defined by default because of library
874 # dependencies. The Python module anydbm.py provides an
875 # implementation independent wrapper for these; dumbdbm.py provides
876 # similar functionality (but slower of course) implemented in Python.
877
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000878 # Sleepycat^WOracle Berkeley DB interface.
879 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000880 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000881 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000882 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000883 # a release. Most open source OSes come with one or more
884 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000885
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700886 max_db_ver = (5, 3)
887 min_db_ver = (4, 3)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000888 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000889
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000890 def allow_db_ver(db_ver):
891 """Returns a boolean if the given BerkeleyDB version is acceptable.
892
893 Args:
894 db_ver: A tuple of the version to verify.
895 """
896 if not (min_db_ver <= db_ver <= max_db_ver):
897 return False
898 # Use this function to filter out known bad configurations.
899 if (4, 6) == db_ver[:2]:
900 # BerkeleyDB 4.6.x is not stable on many architectures.
901 arch = platform_machine()
902 if arch not in ('i386', 'i486', 'i586', 'i686',
903 'x86_64', 'ia64'):
904 return False
905 return True
906
907 def gen_db_minor_ver_nums(major):
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700908 if major == 5:
909 for x in range(max_db_ver[1]+1):
910 if allow_db_ver((5, x)):
911 yield x
912 elif major == 4:
Benjamin Petersonef2436f2013-10-26 13:55:25 -0400913 for x in range(9):
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000914 if allow_db_ver((4, x)):
915 yield x
916 elif major == 3:
917 for x in (3,):
918 if allow_db_ver((3, x)):
919 yield x
920 else:
921 raise ValueError("unknown major BerkeleyDB version", major)
922
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000923 # construct a list of paths to look for the header file in on
924 # top of the normal inc_dirs.
925 db_inc_paths = [
926 '/usr/include/db4',
927 '/usr/local/include/db4',
928 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000929 '/usr/include/db3',
930 '/usr/local/include/db3',
931 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000932 # Fink defaults (http://fink.sourceforge.net/)
933 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000934 '/sw/include/db3',
935 ]
936 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000937 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000938 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000939 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000940 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
941 db_inc_paths.append('/usr/local/include/db4%d' % x)
942 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000943 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000944 # MacPorts default (http://www.macports.org/)
945 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000946 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000947 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000948 db_inc_paths.append('/usr/include/db3%d' % x)
949 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
950 db_inc_paths.append('/usr/local/include/db3%d' % x)
951 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000952 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000953
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100954 if cross_compiling:
955 db_inc_paths = []
956
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000957 # Add some common subdirectories for Sleepycat DB to the list,
958 # based on the standard include directories. This way DB3/4 gets
959 # picked up when it is installed in a non-standard prefix and
960 # the user has added that prefix into inc_dirs.
961 std_variants = []
962 for dn in inc_dirs:
963 std_variants.append(os.path.join(dn, 'db3'))
964 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000965 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000966 std_variants.append(os.path.join(dn, "db4%d"%x))
967 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000968 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000969 std_variants.append(os.path.join(dn, "db3%d"%x))
970 std_variants.append(os.path.join(dn, "db3.%d"%x))
971
Tim Peters38ff36c2006-06-30 06:18:39 +0000972 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000973 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000974
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000975 db_ver_inc_map = {}
976
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100977 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000978 sysroot = macosx_sdk_root()
979
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000980 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000981 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000982 # See whether there is a Sleepycat header in the standard
983 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000984 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000985 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000986
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100987 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000988 f = os.path.join(sysroot, d[1:], "db.h")
989
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000990 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000991 if os.path.exists(f):
992 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000993 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000994 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000995 db_major = int(m.group(1))
996 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
997 db_minor = int(m.group(1))
998 db_ver = (db_major, db_minor)
999
Gregory P. Smith1475cd82007-10-06 07:51:59 +00001000 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1001 if db_ver == (4, 6):
1002 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
1003 db_patch = int(m.group(1))
1004 if db_patch < 21:
1005 print "db.h:", db_ver, "patch", db_patch,
1006 print "being ignored (4.6.x must be >= 4.6.21)"
1007 continue
1008
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001009 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +00001010 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001011 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +00001012 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001013 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001014 if db_setup_debug:
1015 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001016 else:
1017 # we already found a header for this library version
1018 if db_setup_debug: print "db.h: ignoring", d
1019 else:
1020 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +00001021 if db_setup_debug:
1022 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001023
1024 db_found_vers = db_ver_inc_map.keys()
1025 db_found_vers.sort()
1026
1027 while db_found_vers:
1028 db_ver = db_found_vers.pop()
1029 db_incdir = db_ver_inc_map[db_ver]
1030
1031 # check lib directories parallel to the location of the header
1032 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +00001033 db_incdir.replace("include", 'lib64'),
1034 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001035 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001036
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001037 if host_platform != 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001038 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
1039
1040 else:
1041 # Same as other branch, but takes OSX SDK into account
1042 tmp = []
1043 for dn in db_dirs_to_check:
1044 if is_macosx_sdk_path(dn):
1045 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1046 tmp.append(dn)
1047 else:
1048 if os.path.isdir(dn):
1049 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +00001050 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001051
Ezio Melotti24b07bc2011-03-15 18:55:01 +02001052 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001053 # XXX should we -ever- look for a dbX name? Do any
1054 # systems really not name their library by version and
1055 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +00001056 for dblib in (('db-%d.%d' % db_ver),
1057 ('db%d%d' % db_ver),
1058 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001059 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001060 db_dirs_to_check + lib_dirs, dblib )
1061 if dblib_file:
1062 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1063 raise db_found
1064 else:
1065 if db_setup_debug: print "db lib: ", dblib, "not found"
1066
1067 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +00001068 if db_setup_debug:
1069 print "bsddb using BerkeleyDB lib:", db_ver, dblib
1070 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001071 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +00001072 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001073 # We add the runtime_library_dirs argument because the
1074 # BerkeleyDB lib we're linking against often isn't in the
1075 # system dynamic library search path. This is usually
1076 # correct and most trouble free, but may cause problems in
1077 # some unusual system configurations (e.g. the directory
1078 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001079 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +00001080 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001081 library_dirs=dblib_dir,
1082 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001083 include_dirs=db_incs,
1084 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +00001085 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001086 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001087 db_incs = None
1088 dblibs = []
1089 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001090 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001091
Anthony Baxterc51ee692006-04-01 00:57:31 +00001092 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001093 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001094
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001095 # We hunt for #define SQLITE_VERSION "n.n.n"
1096 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001097 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001098 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001099 '/usr/include/sqlite',
1100 '/usr/include/sqlite3',
1101 '/usr/local/include',
1102 '/usr/local/include/sqlite',
1103 '/usr/local/include/sqlite3',
1104 ]
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001105 if cross_compiling:
1106 sqlite_inc_paths = []
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001107 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1108 MIN_SQLITE_VERSION = ".".join([str(x)
1109 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001110
1111 # Scan the default include directories before the SQLite specific
1112 # ones. This allows one to override the copy of sqlite on OSX,
1113 # where /usr/include contains an old version of sqlite.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001114 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001115 sysroot = macosx_sdk_root()
1116
Ned Deily67028042012-08-05 14:42:45 -07001117 for d_ in inc_dirs + sqlite_inc_paths:
1118 d = d_
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001119 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily67028042012-08-05 14:42:45 -07001120 d = os.path.join(sysroot, d[1:])
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001121
Ned Deily67028042012-08-05 14:42:45 -07001122 f = os.path.join(d, "sqlite3.h")
Anthony Baxterc51ee692006-04-01 00:57:31 +00001123 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001124 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001125 incf = open(f).read()
1126 m = re.search(
Petri Lehtinenc23178b2013-02-23 17:05:28 +01001127 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001128 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001129 sqlite_version = m.group(1)
1130 sqlite_version_tuple = tuple([int(x)
1131 for x in sqlite_version.split(".")])
1132 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001133 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001134 if sqlite_setup_debug:
1135 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001136 sqlite_incdir = d
1137 break
1138 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001139 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001140 print "%s: version %d is too old, need >= %s"%(d,
1141 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001142 elif sqlite_setup_debug:
1143 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1144
Anthony Baxterc51ee692006-04-01 00:57:31 +00001145 if sqlite_incdir:
1146 sqlite_dirs_to_check = [
1147 os.path.join(sqlite_incdir, '..', 'lib64'),
1148 os.path.join(sqlite_incdir, '..', 'lib'),
1149 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1150 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1151 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001152 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001153 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001154 if sqlite_libfile:
1155 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001156
1157 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001158 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001159 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001160 '_sqlite/cursor.c',
1161 '_sqlite/microprotocols.c',
1162 '_sqlite/module.c',
1163 '_sqlite/prepare_protocol.c',
1164 '_sqlite/row.c',
1165 '_sqlite/statement.c',
1166 '_sqlite/util.c', ]
1167
Anthony Baxterc51ee692006-04-01 00:57:31 +00001168 sqlite_defines = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001169 if host_platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001170 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001171 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001172 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1173
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001174 # Comment this out if you want the sqlite3 module to be able to load extensions.
1175 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001176
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001177 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001178 # In every directory on the search path search for a dynamic
1179 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001180 # for dynamic libraries on the entire path.
1181 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001182 # before the dynamic library in /usr/lib.
1183 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1184 else:
1185 sqlite_extra_link_args = ()
1186
Anthony Baxterc51ee692006-04-01 00:57:31 +00001187 exts.append(Extension('_sqlite3', sqlite_srcs,
1188 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001189 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001190 sqlite_incdir],
1191 library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001192 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001193 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001194 else:
1195 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001196
1197 # Look for Berkeley db 1.85. Note that it is built as a different
1198 # module name so it can be included even when later versions are
1199 # available. A very restrictive search is performed to avoid
1200 # accidentally building this module with a later version of the
1201 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1202 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001203 #
1204 # If the better bsddb library can be built (db_incs is defined)
1205 # we do not build this one. Otherwise this build will pick up
1206 # the more recent berkeleydb's db.h file first in the include path
1207 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001208 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001209
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001210 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001211 if is_macosx_sdk_path(f):
1212 sysroot = macosx_sdk_root()
1213 f = os.path.join(sysroot, f[1:])
1214
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001215 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001216 data = open(f).read()
1217 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1218 if m is not None:
1219 # bingo - old version used hash file format version 2
1220 ### XXX this should be fixed to not be platform-dependent
1221 ### but I don't have direct access to an osf1 platform and
1222 ### seemed to be muffing the search somehow
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001223 libraries = host_platform == "osf1" and ['db'] or None
Skip Montanaro22e00c42003-05-06 20:43:34 +00001224 if libraries is not None:
1225 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1226 libraries=libraries))
1227 else:
1228 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001229 else:
1230 missing.append('bsddb185')
1231 else:
1232 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001233
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001234 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001235 # The standard Unix dbm module:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001236 if host_platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001237 config_args = [arg.strip("'")
1238 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001239 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001240 if arg.startswith('--with-dbmliborder=')]
1241 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001242 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001243 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001244 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001245 dbmext = None
1246 for cand in dbm_order:
1247 if cand == "ndbm":
1248 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001249 # Some systems have -lndbm, others have -lgdbm_compat,
1250 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001251 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001252 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001253 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001254 elif self.compiler.find_library_file(lib_dirs,
1255 'gdbm_compat'):
1256 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001257 else:
1258 ndbm_libs = []
1259 print "building dbm using ndbm"
1260 dbmext = Extension('dbm', ['dbmmodule.c'],
1261 define_macros=[
1262 ('HAVE_NDBM_H',None),
1263 ],
1264 libraries=ndbm_libs)
1265 break
1266
1267 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001268 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001269 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001270 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001271 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001272 gdbm_libs.append('gdbm_compat')
1273 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1274 print "building dbm using gdbm"
1275 dbmext = Extension(
1276 'dbm', ['dbmmodule.c'],
1277 define_macros=[
1278 ('HAVE_GDBM_NDBM_H', None),
1279 ],
1280 libraries = gdbm_libs)
1281 break
1282 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1283 print "building dbm using gdbm"
1284 dbmext = Extension(
1285 'dbm', ['dbmmodule.c'],
1286 define_macros=[
1287 ('HAVE_GDBM_DASH_NDBM_H', None),
1288 ],
1289 libraries = gdbm_libs)
1290 break
1291 elif cand == "bdb":
1292 if db_incs is not None:
1293 print "building dbm using bdb"
1294 dbmext = Extension('dbm', ['dbmmodule.c'],
1295 library_dirs=dblib_dir,
1296 runtime_library_dirs=dblib_dir,
1297 include_dirs=db_incs,
1298 define_macros=[
1299 ('HAVE_BERKDB_H', None),
1300 ('DB_DBM_HSEARCH', None),
1301 ],
1302 libraries=dblibs)
1303 break
1304 if dbmext is not None:
1305 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001306 else:
1307 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001308
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001309 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001310 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001311 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001312 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1313 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001314 else:
1315 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001316
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001317 # Unix-only modules
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001318 if host_platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001319 # Steen Lumholt's termios module
1320 exts.append( Extension('termios', ['termios.c']) )
1321 # Jeremy Hylton's rlimit interface
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001322 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001323 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001324 else:
1325 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001326
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001327 # Sun yellow pages. Some systems have the functions in libc.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001328 if (host_platform not in ['cygwin', 'atheos', 'qnx6'] and
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001329 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001330 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001331 libs = ['nsl']
1332 else:
1333 libs = []
1334 exts.append( Extension('nis', ['nismodule.c'],
1335 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001336 else:
1337 missing.append('nis')
1338 else:
1339 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001340
Skip Montanaro72092942004-02-07 12:50:19 +00001341 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001342 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001343 panel_library = 'panel'
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001344 curses_incs = None
Stefan Krah449aa862010-06-03 12:39:50 +00001345 if curses_library.startswith('ncurses'):
1346 if curses_library == 'ncursesw':
1347 # Bug 1464056: If _curses.so links with ncursesw,
1348 # _curses_panel.so must link with panelw.
1349 panel_library = 'panelw'
1350 curses_libs = [curses_library]
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001351 curses_incs = find_file('curses.h', inc_dirs,
1352 [os.path.join(d, 'ncursesw') for d in inc_dirs])
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001353 exts.append( Extension('_curses', ['_cursesmodule.c'],
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001354 include_dirs = curses_incs,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001355 libraries = curses_libs) )
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001356 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001357 # OSX has an old Berkeley curses, not good enough for
1358 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001359 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001360 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001361 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001362 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001363 else:
1364 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001365
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001366 exts.append( Extension('_curses', ['_cursesmodule.c'],
1367 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001368 else:
1369 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001370
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001371 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001372 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001373 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001374 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001375 include_dirs = curses_incs,
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001376 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001377 else:
1378 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001379
Barry Warsaw259b1e12002-08-13 20:09:26 +00001380 # Andrew Kuchling's zlib module. Note that some versions of zlib
1381 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1382 # http://www.cert.org/advisories/CA-2002-07.html
1383 #
1384 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1385 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1386 # now, we still accept 1.1.3, because we think it's difficult to
1387 # exploit this in Python, and we'd rather make it RedHat's problem
1388 # than our problem <wink>.
1389 #
1390 # You can upgrade zlib to version 1.1.4 yourself by going to
1391 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001392 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001393 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001394 if zlib_inc is not None:
1395 zlib_h = zlib_inc[0] + '/zlib.h'
1396 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001397 version_req = '"1.1.3"'
Ned Deily6ea3c9b2013-10-18 21:33:57 -07001398 if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
1399 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Guido van Rossume6970912001-04-15 15:16:12 +00001400 fp = open(zlib_h)
1401 while 1:
1402 line = fp.readline()
1403 if not line:
1404 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001405 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001406 version = line.split()[2]
1407 break
1408 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001409 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001410 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001411 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1412 else:
1413 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001414 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001415 libraries = ['z'],
1416 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001417 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001418 else:
1419 missing.append('zlib')
1420 else:
1421 missing.append('zlib')
1422 else:
1423 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001424
Gregory P. Smith440ca772008-03-24 00:08:01 +00001425 # Helper module for various ascii-encoders. Uses zlib for an optimized
1426 # crc32 if we have it. Otherwise binascii uses its own.
1427 if have_zlib:
1428 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1429 libraries = ['z']
1430 extra_link_args = zlib_extra_link_args
1431 else:
1432 extra_compile_args = []
1433 libraries = []
1434 extra_link_args = []
1435 exts.append( Extension('binascii', ['binascii.c'],
1436 extra_compile_args = extra_compile_args,
1437 libraries = libraries,
1438 extra_link_args = extra_link_args) )
1439
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001440 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001441 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001442 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001443 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1444 else:
1445 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001446 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001447 libraries = ['bz2'],
1448 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001449 else:
1450 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001451
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001452 # Interface to the Expat XML parser
1453 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001454 # Expat was written by James Clark and is now maintained by a group of
1455 # developers on SourceForge; see www.libexpat.org for more information.
1456 # The pyexpat module was written by Paul Prescod after a prototype by
1457 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1458 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001459 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001460 #
1461 # More information on Expat can be found at www.libexpat.org.
1462 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001463 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1464 expat_inc = []
1465 define_macros = []
1466 expat_lib = ['expat']
1467 expat_sources = []
Christian Heimes56656b02013-02-09 17:02:06 +01001468 expat_depends = []
Benjamin Peterson2c196742009-12-31 03:17:18 +00001469 else:
1470 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1471 define_macros = [
1472 ('HAVE_EXPAT_CONFIG_H', '1'),
1473 ]
1474 expat_lib = []
1475 expat_sources = ['expat/xmlparse.c',
1476 'expat/xmlrole.c',
1477 'expat/xmltok.c']
Christian Heimes56656b02013-02-09 17:02:06 +01001478 expat_depends = ['expat/ascii.h',
1479 'expat/asciitab.h',
1480 'expat/expat.h',
1481 'expat/expat_config.h',
1482 'expat/expat_external.h',
1483 'expat/internal.h',
1484 'expat/latin1tab.h',
1485 'expat/utf8tab.h',
1486 'expat/xmlrole.h',
1487 'expat/xmltok.h',
1488 'expat/xmltok_impl.h'
1489 ]
Ronald Oussoren988117f2006-04-29 11:31:35 +00001490
Fred Drake2d59a492003-10-21 15:41:15 +00001491 exts.append(Extension('pyexpat',
1492 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001493 include_dirs = expat_inc,
1494 libraries = expat_lib,
Christian Heimes56656b02013-02-09 17:02:06 +01001495 sources = ['pyexpat.c'] + expat_sources,
1496 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001497 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001498
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001499 # Fredrik Lundh's cElementTree module. Note that this also
1500 # uses expat (via the CAPI hook in pyexpat).
1501
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001502 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001503 define_macros.append(('USE_PYEXPAT_CAPI', None))
1504 exts.append(Extension('_elementtree',
1505 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001506 include_dirs = expat_inc,
1507 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001508 sources = ['_elementtree.c'],
Christian Heimes56656b02013-02-09 17:02:06 +01001509 depends = ['pyexpat.c'] + expat_sources +
1510 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001511 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001512 else:
1513 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001514
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001515 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001516 if have_unicode:
1517 exts.append(Extension('_multibytecodec',
1518 ['cjkcodecs/multibytecodec.c']))
1519 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001520 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001521 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001522 else:
1523 missing.append('_multibytecodec')
1524 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1525 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001526
Michael W. Hudson5b109102002-01-23 15:04:41 +00001527 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001528 if sys.maxint == 0x7fffffff:
1529 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1530 dl_inc = find_file('dlfcn.h', [], inc_dirs)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001531 if (dl_inc is not None) and (host_platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001532 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001533 else:
1534 missing.append('dl')
1535 else:
1536 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001537
Thomas Hellercf567c12006-03-08 19:51:58 +00001538 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001539 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001540
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001541 # Richard Oudkerk's multiprocessing module
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001542 if host_platform == 'win32': # Windows
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001543 macros = dict()
1544 libraries = ['ws2_32']
1545
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001546 elif host_platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001547 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001548 libraries = []
1549
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001550 elif host_platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001551 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001552 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001553
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001554 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001555 # FreeBSD's P1003.1b semaphore support is very experimental
1556 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001557 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001558 libraries = []
1559
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001560 elif host_platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001561 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001562 libraries = []
1563
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001564 elif host_platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001565 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001566 libraries = []
1567
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001568 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001569 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001570 libraries = ['rt']
1571
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001572 if host_platform == 'win32':
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001573 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1574 '_multiprocessing/semaphore.c',
1575 '_multiprocessing/pipe_connection.c',
1576 '_multiprocessing/socket_connection.c',
1577 '_multiprocessing/win32_functions.c'
1578 ]
1579
1580 else:
1581 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1582 '_multiprocessing/socket_connection.c'
1583 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001584 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001585 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001586 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1587
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001588 if sysconfig.get_config_var('WITH_THREAD'):
1589 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1590 define_macros=macros.items(),
1591 include_dirs=["Modules/_multiprocessing"]))
1592 else:
1593 missing.append('_multiprocessing')
1594
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001595 # End multiprocessing
1596
1597
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001598 # Platform-specific libraries
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001599 if host_platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001600 # Linux-specific modules
1601 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001602 else:
1603 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001604
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001605 if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Matthias Klose8a96d202010-04-21 22:18:52 +00001606 'freebsd7', 'freebsd8')
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001607 or host_platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001608 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001609 else:
1610 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001611
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001612 if host_platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001613 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001614 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001615 else:
1616 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001617
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001618 if host_platform == 'darwin':
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001619 # _scproxy
1620 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1621 extra_link_args= [
1622 '-framework', 'SystemConfiguration',
1623 '-framework', 'CoreFoundation'
1624 ]))
1625
1626
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001627 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001628 sysconfig.get_config_var("CONFIG_ARGS")):
1629
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001630 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001631 # We're on Mac OS X 10.4 or later, the compiler should
1632 # support '-Wno-deprecated-declarations'. This will
1633 # surpress deprecation warnings for the Carbon extensions,
1634 # these extensions wrap the Carbon APIs and even those
1635 # parts that are deprecated.
1636 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1637 else:
1638 carbon_extra_compile_args = []
1639
Just van Rossum05ced6a2002-11-24 23:15:57 +00001640 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001641 def macSrcExists(name1, name2=''):
1642 if not name1:
1643 return None
1644 names = (name1,)
1645 if name2:
1646 names = (name1, name2)
1647 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1648 return os.path.exists(path)
1649
1650 def addMacExtension(name, kwds, extra_srcs=[]):
1651 dirname = ''
1652 if name[0] == '_':
1653 dirname = name[1:].lower()
1654 cname = name + '.c'
1655 cmodulename = name + 'module.c'
1656 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1657 if macSrcExists(cname):
1658 srcs = [cname]
1659 elif macSrcExists(cmodulename):
1660 srcs = [cmodulename]
1661 elif macSrcExists(dirname, cname):
1662 # XXX(nnorwitz): If all the names ended with module, we
1663 # wouldn't need this condition. ibcarbon is the only one.
1664 srcs = [os.path.join(dirname, cname)]
1665 elif macSrcExists(dirname, cmodulename):
1666 srcs = [os.path.join(dirname, cmodulename)]
1667 else:
1668 raise RuntimeError("%s not found" % name)
1669
1670 # Here's the whole point: add the extension with sources
1671 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1672
1673 # Core Foundation
1674 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1675 'extra_link_args': ['-framework', 'CoreFoundation'],
1676 }
1677 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1678 addMacExtension('autoGIL', core_kwds)
1679
Ronald Oussoren51f06332009-09-20 10:31:22 +00001680
1681
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001682 # Carbon
1683 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1684 'extra_link_args': ['-framework', 'Carbon'],
1685 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001686 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1687 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001688 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001689 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001690 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001691 '_Help', '_Icn', '_IBCarbon', '_List',
1692 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001693 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001694 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001695 for name in CARBON_EXTS:
1696 addMacExtension(name, carbon_kwds)
1697
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001698 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1699 # The _Win extension should build just like the other Carbon extensions, but
1700 # this actually results in a hard crash of the linker.
1701 #
1702 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1703 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1704 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1705 }
1706 addMacExtension('_Win', win_kwds)
1707 else:
1708 addMacExtension('_Win', carbon_kwds)
1709
1710
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001711 # Application Services & QuickTime
1712 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1713 'extra_link_args': ['-framework','ApplicationServices'],
1714 }
1715 addMacExtension('_Launch', app_kwds)
1716 addMacExtension('_CG', app_kwds)
1717
Just van Rossum05ced6a2002-11-24 23:15:57 +00001718 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001719 extra_compile_args=carbon_extra_compile_args,
1720 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001721 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001722
Michael W. Hudson5b109102002-01-23 15:04:41 +00001723
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001724 self.extensions.extend(exts)
1725
1726 # Call the method for detecting whether _tkinter can be compiled
1727 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001728
Skip Montanarod1287322007-03-06 15:41:38 +00001729 if '_tkinter' not in [e.name for e in self.extensions]:
1730 missing.append('_tkinter')
1731
Georg Brandl28523642013-10-13 23:38:44 +02001732## # Uncomment these lines if you want to play with xxmodule.c
1733## ext = Extension('xx', ['xxmodule.c'])
1734## self.extensions.append(ext)
1735
Skip Montanarod1287322007-03-06 15:41:38 +00001736 return missing
1737
Ned Deilya2a9f572013-10-25 00:30:10 -07001738 def detect_tkinter_explicitly(self):
1739 # Build _tkinter using explicit locations for Tcl/Tk.
1740 #
1741 # This is enabled when both arguments are given to ./configure:
1742 #
1743 # --with-tcltk-includes="-I/path/to/tclincludes \
1744 # -I/path/to/tkincludes"
1745 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1746 # -L/path/to/tklibs -ltkm.n"
1747 #
1748 # These values can also be specified or overriden via make:
1749 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1750 #
1751 # This can be useful for building and testing tkinter with multiple
1752 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1753 # build of Tcl so you need to specify both arguments and use care when
1754 # overriding.
1755
1756 # The _TCLTK variables are created in the Makefile sharedmods target.
1757 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1758 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1759 if not (tcltk_includes and tcltk_libs):
1760 # Resume default configuration search.
1761 return 0
1762
1763 extra_compile_args = tcltk_includes.split()
1764 extra_link_args = tcltk_libs.split()
1765 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1766 define_macros=[('WITH_APPINIT', 1)],
1767 extra_compile_args = extra_compile_args,
1768 extra_link_args = extra_link_args,
1769 )
1770 self.extensions.append(ext)
1771 return 1
1772
Jack Jansen0b06be72002-06-21 14:48:38 +00001773 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1774 # The _tkinter module, using frameworks. Since frameworks are quite
1775 # different the UNIX search logic is not sharable.
1776 from os.path import join, exists
1777 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001778 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001779 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001780 join(os.getenv('HOME'), '/Library/Frameworks')
1781 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001782
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001783 sysroot = macosx_sdk_root()
1784
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001785 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001786 # bundles.
1787 # XXX distutils should support -F!
1788 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001789 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001790
1791
Jack Jansen0b06be72002-06-21 14:48:38 +00001792 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001793 if is_macosx_sdk_path(F):
1794 if not exists(join(sysroot, F[1:], fw + '.framework')):
1795 break
1796 else:
1797 if not exists(join(F, fw + '.framework')):
1798 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001799 else:
1800 # ok, F is now directory with both frameworks. Continure
1801 # building
1802 break
1803 else:
1804 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1805 # will now resume.
1806 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001807
Jack Jansen0b06be72002-06-21 14:48:38 +00001808 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1809 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001810 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001811 #
1812 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001813 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001814 for fw in 'Tcl', 'Tk'
1815 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1816 ]
1817
Tim Peters2c60f7a2003-01-29 03:49:43 +00001818 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001819 # complicated search, this is a hard-coded path. It could bail out
1820 # if X11 libs are not found...
1821 include_dirs.append('/usr/X11R6/include')
1822 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1823
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001824 # All existing framework builds of Tcl/Tk don't support 64-bit
1825 # architectures.
1826 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1827 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001828
1829 if is_macosx_sdk_path(F):
1830 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1831 else:
1832 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1833
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001834 detected_archs = []
1835 for ln in fp:
1836 a = ln.split()[-1]
1837 if a in archs:
1838 detected_archs.append(ln.split()[-1])
1839 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001840
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001841 for a in detected_archs:
1842 frameworks.append('-arch')
1843 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001844
Jack Jansen0b06be72002-06-21 14:48:38 +00001845 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1846 define_macros=[('WITH_APPINIT', 1)],
1847 include_dirs = include_dirs,
1848 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001849 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001850 extra_link_args = frameworks,
1851 )
1852 self.extensions.append(ext)
1853 return 1
1854
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001855 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001856 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001857
Ned Deilya2a9f572013-10-25 00:30:10 -07001858 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1859 # configured or passed into the make target. If so, use these values
1860 # to build tkinter and bypass the searches for Tcl and TK in standard
1861 # locations.
1862 if self.detect_tkinter_explicitly():
1863 return
1864
Jack Jansen0b06be72002-06-21 14:48:38 +00001865 # Rather than complicate the code below, detecting and building
1866 # AquaTk is a separate method. Only one Tkinter will be built on
1867 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001868 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001869 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001870 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001871
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001872 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001873 # The versions with dots are used on Unix, and the versions without
1874 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001875 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001876 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1877 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001878 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001879 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001880 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001881 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001882 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001883 # Exit the loop when we've found the Tcl/Tk libraries
1884 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001885
Fredrik Lundhade711a2001-01-24 08:00:28 +00001886 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001887 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001888 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001889 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001890 dotversion = version
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001891 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001892 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1893 # but the include subdirs are named like .../include/tcl8.3.
1894 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1895 tcl_include_sub = []
1896 tk_include_sub = []
1897 for dir in inc_dirs:
1898 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1899 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1900 tk_include_sub += tcl_include_sub
1901 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1902 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001903
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001904 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001905 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001906 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001907 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001908
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001909 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001910
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001911 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1912 for dir in tcl_includes + tk_includes:
1913 if dir not in include_dirs:
1914 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001915
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001916 # Check for various platform-specific directories
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001917 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001918 include_dirs.append('/usr/openwin/include')
1919 added_lib_dirs.append('/usr/openwin/lib')
1920 elif os.path.exists('/usr/X11R6/include'):
1921 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001922 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001923 added_lib_dirs.append('/usr/X11R6/lib')
1924 elif os.path.exists('/usr/X11R5/include'):
1925 include_dirs.append('/usr/X11R5/include')
1926 added_lib_dirs.append('/usr/X11R5/lib')
1927 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001928 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001929 include_dirs.append('/usr/X11/include')
1930 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001931
Jason Tishler9181c942003-02-05 15:16:17 +00001932 # If Cygwin, then verify that X is installed before proceeding
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001933 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001934 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1935 if x11_inc is None:
1936 return
1937
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001938 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001939 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001940 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001941 defs.append( ('WITH_BLT', 1) )
1942 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001943 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001944 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001945 defs.append( ('WITH_BLT', 1) )
1946 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001947
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001948 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001949 libs.append('tk'+ version)
1950 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001951
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001952 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001953 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001954
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001955 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001956 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001957 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001958
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001959 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1960 define_macros=[('WITH_APPINIT', 1)] + defs,
1961 include_dirs = include_dirs,
1962 libraries = libs,
1963 library_dirs = added_lib_dirs,
1964 )
1965 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001966
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001967 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001968 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001969 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001970 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001971 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001972 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001973 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001974
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001975 def configure_ctypes_darwin(self, ext):
1976 # Darwin (OS X) uses preconfigured files, in
1977 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001978 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001979 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1980 '_ctypes', 'libffi_osx'))
1981 sources = [os.path.join(ffi_srcdir, p)
1982 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001983 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001984 'x86/x86-darwin.S',
1985 'x86/x86-ffi_darwin.c',
1986 'x86/x86-ffi64.c',
1987 'powerpc/ppc-darwin.S',
1988 'powerpc/ppc-darwin_closure.S',
1989 'powerpc/ppc-ffi_darwin.c',
1990 'powerpc/ppc64-darwin_closure.S',
1991 ]]
1992
1993 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001994 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001995
1996 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1997 os.path.join(ffi_srcdir, 'powerpc')]
1998 ext.include_dirs.extend(include_dirs)
1999 ext.sources.extend(sources)
2000 return True
2001
Thomas Hellereba43c12006-04-07 19:04:09 +00002002 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002003 if not self.use_system_libffi:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002004 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002005 return self.configure_ctypes_darwin(ext)
2006
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00002007 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002008 ffi_builddir = os.path.join(self.build_temp, 'libffi')
2009 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
2010 '_ctypes', 'libffi'))
2011 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00002012
Thomas Heller5e218b42006-04-27 15:50:42 +00002013 from distutils.dep_util import newer_group
2014
2015 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00002016 for fname in os.listdir(ffi_srcdir)
2017 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00002018 if self.force or newer_group(config_sources,
2019 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002020 from distutils.dir_util import mkpath
2021 mkpath(ffi_builddir)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002022 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
2023 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes6fd32482012-09-06 18:02:49 +02002024 if not self.verbose:
2025 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00002026
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002027 # Pass empty CFLAGS because we'll just append the resulting
2028 # CFLAGS to Python's; -g or -O2 is to be avoided.
2029 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
2030 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00002031
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002032 res = os.system(cmd)
2033 if res or not os.path.exists(ffi_configfile):
2034 print "Failed to configure _ctypes module"
2035 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00002036
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002037 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00002038 with open(ffi_configfile) as f:
2039 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00002040
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002041 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002042 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00002043
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002044 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00002045 ffi_builddir,
2046 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002047 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00002048
Antoine Pitrou8c510e72010-01-13 11:47:49 +00002049 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
2050 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002051 ext.include_dirs.extend(include_dirs)
2052 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00002053 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00002054
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002055 def detect_ctypes(self, inc_dirs, lib_dirs):
2056 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00002057 include_dirs = []
2058 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00002059 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002060 sources = ['_ctypes/_ctypes.c',
2061 '_ctypes/callbacks.c',
2062 '_ctypes/callproc.c',
2063 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00002064 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002065 depends = ['_ctypes/ctypes.h']
2066
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002067 if host_platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00002068 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00002069 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002070 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002071 include_dirs.append('_ctypes/darwin')
2072# XXX Is this still needed?
2073## extra_link_args.extend(['-read_only_relocs', 'warning'])
2074
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002075 elif host_platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00002076 # XXX This shouldn't be necessary; it appears that some
2077 # of the assembler code is non-PIC (i.e. it has relocations
2078 # when it shouldn't. The proper fix would be to rewrite
2079 # the assembler code to be PIC.
2080 # This only works with GCC; the Sun compiler likely refuses
2081 # this option. If you want to compile ctypes with the Sun
2082 # compiler, please research a proper solution, instead of
2083 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00002084 extra_link_args.append('-mimpure-text')
2085
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002086 elif host_platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00002087 extra_link_args.append('-fPIC')
2088
Thomas Hellercf567c12006-03-08 19:51:58 +00002089 ext = Extension('_ctypes',
2090 include_dirs=include_dirs,
2091 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00002092 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002093 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002094 sources=sources,
2095 depends=depends)
2096 ext_test = Extension('_ctypes_test',
2097 sources=['_ctypes/_ctypes_test.c'])
2098 self.extensions.extend([ext, ext_test])
2099
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002100 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
2101 return
2102
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002103 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002104 # OS X 10.5 comes with libffi.dylib; the include files are
2105 # in /usr/include/ffi
2106 inc_dirs.append('/usr/include/ffi')
2107
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002108 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00002109 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002110 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002111 if ffi_inc is not None:
2112 ffi_h = ffi_inc[0] + '/ffi.h'
2113 fp = open(ffi_h)
2114 while 1:
2115 line = fp.readline()
2116 if not line:
2117 ffi_inc = None
2118 break
2119 if line.startswith('#define LIBFFI_H'):
2120 break
2121 ffi_lib = None
2122 if ffi_inc is not None:
2123 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002124 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002125 ffi_lib = lib_name
2126 break
2127
2128 if ffi_inc and ffi_lib:
2129 ext.include_dirs.extend(ffi_inc)
2130 ext.libraries.append(ffi_lib)
2131 self.use_system_libffi = True
2132
2133
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002134class PyBuildInstall(install):
2135 # Suppress the warning about installation into the lib_dynload
2136 # directory, which is not in sys.path when running Python during
2137 # installation:
2138 def initialize_options (self):
2139 install.initialize_options(self)
2140 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002141
Michael W. Hudson529a5052002-12-17 16:47:17 +00002142class PyBuildInstallLib(install_lib):
2143 # Do exactly what install_lib does but make sure correct access modes get
2144 # set on installed directories and files. All installed files with get
2145 # mode 644 unless they are a shared library in which case they will get
2146 # mode 755. All installed directories will get mode 755.
2147
2148 so_ext = sysconfig.get_config_var("SO")
2149
2150 def install(self):
2151 outfiles = install_lib.install(self)
2152 self.set_file_modes(outfiles, 0644, 0755)
2153 self.set_dir_modes(self.install_dir, 0755)
2154 return outfiles
2155
2156 def set_file_modes(self, files, defaultMode, sharedLibMode):
2157 if not self.is_chmod_supported(): return
2158 if not files: return
2159
2160 for filename in files:
2161 if os.path.islink(filename): continue
2162 mode = defaultMode
2163 if filename.endswith(self.so_ext): mode = sharedLibMode
2164 log.info("changing mode of %s to %o", filename, mode)
2165 if not self.dry_run: os.chmod(filename, mode)
2166
2167 def set_dir_modes(self, dirname, mode):
2168 if not self.is_chmod_supported(): return
2169 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2170
2171 def set_dir_modes_visitor(self, mode, dirname, names):
2172 if os.path.islink(dirname): return
2173 log.info("changing mode of %s to %o", dirname, mode)
2174 if not self.dry_run: os.chmod(dirname, mode)
2175
2176 def is_chmod_supported(self):
2177 return hasattr(os, 'chmod')
2178
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002179SUMMARY = """
2180Python is an interpreted, interactive, object-oriented programming
2181language. It is often compared to Tcl, Perl, Scheme or Java.
2182
2183Python combines remarkable power with very clear syntax. It has
2184modules, classes, exceptions, very high level dynamic data types, and
2185dynamic typing. There are interfaces to many system calls and
2186libraries, as well as to various windowing systems (X11, Motif, Tk,
2187Mac, MFC). New built-in modules are easily written in C or C++. Python
2188is also usable as an extension language for applications that need a
2189programmable interface.
2190
2191The Python implementation is portable: it runs on many brands of UNIX,
2192on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2193listed here, it may still be supported, if there's a C compiler for
2194it. Ask around on comp.lang.python -- or just try compiling Python
2195yourself.
2196"""
2197
2198CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002199Development Status :: 6 - Mature
2200License :: OSI Approved :: Python Software Foundation License
2201Natural Language :: English
2202Programming Language :: C
2203Programming Language :: Python
2204Topic :: Software Development
2205"""
2206
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002207def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002208 # turn off warnings when deprecated modules are imported
2209 import warnings
2210 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002211 setup(# PyPI Metadata (PEP 301)
2212 name = "Python",
2213 version = sys.version.split()[0],
2214 url = "http://www.python.org/%s" % sys.version[:3],
2215 maintainer = "Guido van Rossum and the Python community",
2216 maintainer_email = "python-dev@python.org",
2217 description = "A high-level object-oriented programming language",
2218 long_description = SUMMARY.strip(),
2219 license = "PSF license",
2220 classifiers = filter(None, CLASSIFIERS.split("\n")),
2221 platforms = ["Many"],
2222
2223 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002224 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2225 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002226 # The struct module is defined here, because build_ext won't be
2227 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002228 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002229
2230 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002231 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002232 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002233 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002234 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002235
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002236# --install-platlib
2237if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002238 main()