blob: 6a6ad239f12780125c1f76795ebb3c5cc462aaca [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
Berker Peksag1b4b7af2014-09-27 22:55:10 +0300253 longest = 0
254 if self.extensions:
255 longest = max([len(e.name) for e in self.extensions])
Skip Montanarod1287322007-03-06 15:41:38 +0000256 if self.failed:
257 longest = max(longest, max([len(name) for name in self.failed]))
258
259 def print_three_column(lst):
Georg Brandle95cf1c2007-03-06 17:49:14 +0000260 lst.sort(key=str.lower)
Skip Montanarod1287322007-03-06 15:41:38 +0000261 # guarantee zip() doesn't drop anything
262 while len(lst) % 3:
263 lst.append("")
264 for e, f, g in zip(lst[::3], lst[1::3], lst[2::3]):
265 print "%-*s %-*s %-*s" % (longest, e, longest, f,
266 longest, g)
Skip Montanarod1287322007-03-06 15:41:38 +0000267
268 if missing:
269 print
Georg Brandl40f982f2008-12-28 11:58:49 +0000270 print ("Python build finished, but the necessary bits to build "
271 "these modules were not found:")
Skip Montanarod1287322007-03-06 15:41:38 +0000272 print_three_column(missing)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000273 print ("To find the necessary bits, look in setup.py in"
274 " detect_modules() for the module's name.")
275 print
Skip Montanarod1287322007-03-06 15:41:38 +0000276
277 if self.failed:
278 failed = self.failed[:]
279 print
280 print "Failed to build these modules:"
281 print_three_column(failed)
Jeffrey Yasskin87997562007-08-22 23:14:27 +0000282 print
Skip Montanarod1287322007-03-06 15:41:38 +0000283
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000284 def build_extension(self, ext):
285
Thomas Hellereba43c12006-04-07 19:04:09 +0000286 if ext.name == '_ctypes':
Thomas Heller795246c2006-04-07 19:27:56 +0000287 if not self.configure_ctypes(ext):
288 return
Thomas Hellereba43c12006-04-07 19:04:09 +0000289
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000290 try:
291 build_ext.build_extension(self, ext)
292 except (CCompilerError, DistutilsError), why:
293 self.announce('WARNING: building of extension "%s" failed: %s' %
294 (ext.name, sys.exc_info()[1]))
Skip Montanarod1287322007-03-06 15:41:38 +0000295 self.failed.append(ext.name)
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000296 return
Jack Jansenf49c6f92001-11-01 14:44:15 +0000297 # Workaround for Mac OS X: The Carbon-based modules cannot be
298 # reliably imported into a command-line Python
299 if 'Carbon' in ext.extra_link_args:
Michael W. Hudson5b109102002-01-23 15:04:41 +0000300 self.announce(
301 'WARNING: skipping import check for Carbon-based "%s"' %
302 ext.name)
303 return
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000304
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100305 if host_platform == 'darwin' and (
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000306 sys.maxint > 2**32 and '-arch' in ext.extra_link_args):
307 # Don't bother doing an import check when an extension was
308 # build with an explicit '-arch' flag on OSX. That's currently
309 # only used to build 32-bit only extensions in a 4-way
310 # universal build and loading 32-bit code into a 64-bit
311 # process will fail.
312 self.announce(
313 'WARNING: skipping import check for "%s"' %
314 ext.name)
315 return
316
Jason Tishler24cf7762002-05-22 16:46:15 +0000317 # Workaround for Cygwin: Cygwin currently has fork issues when many
318 # modules have been imported
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100319 if host_platform == 'cygwin':
Jason Tishler24cf7762002-05-22 16:46:15 +0000320 self.announce('WARNING: skipping import check for Cygwin-based "%s"'
321 % ext.name)
322 return
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000323 ext_filename = os.path.join(
324 self.build_lib,
325 self.get_ext_filename(self.get_ext_fullname(ext.name)))
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100326
327 # Don't try to load extensions for cross builds
328 if cross_compiling:
329 return
330
Andrew M. Kuchling62686692001-05-21 20:48:09 +0000331 try:
Michael W. Hudsonaf142892002-01-23 15:07:46 +0000332 imp.load_dynamic(ext.name, ext_filename)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000333 except ImportError, why:
Skip Montanarod1287322007-03-06 15:41:38 +0000334 self.failed.append(ext.name)
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000335 self.announce('*** WARNING: renaming "%s" since importing it'
336 ' failed: %s' % (ext.name, why), level=3)
337 assert not self.inplace
338 basename, tail = os.path.splitext(ext_filename)
339 newname = basename + "_failed" + tail
340 if os.path.exists(newname):
341 os.remove(newname)
342 os.rename(ext_filename, newname)
343
344 # XXX -- This relies on a Vile HACK in
345 # distutils.command.build_ext.build_extension(). The
346 # _built_objects attribute is stored there strictly for
347 # use here.
348 # If there is a failure, _built_objects may not be there,
349 # so catch the AttributeError and move on.
350 try:
351 for filename in self._built_objects:
352 os.remove(filename)
353 except AttributeError:
354 self.announce('unable to remove files (ignored)')
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000355 except:
Neal Norwitz3f5fcc82003-02-28 17:21:39 +0000356 exc_type, why, tb = sys.exc_info()
Neal Norwitz6e2d1c72003-02-28 17:39:42 +0000357 self.announce('*** WARNING: importing extension "%s" '
358 'failed with %s: %s' % (ext.name, exc_type, why),
359 level=3)
Skip Montanarod1287322007-03-06 15:41:38 +0000360 self.failed.append(ext.name)
Fred Drake9028d0a2001-12-06 22:59:54 +0000361
Barry Warsawffc9caf2011-04-07 11:28:11 -0400362 def add_multiarch_paths(self):
363 # Debian/Ubuntu multiarch support.
364 # https://wiki.ubuntu.com/MultiarchSpec
doko@ubuntu.com3d2fc152012-09-21 13:51:40 +0200365 cc = sysconfig.get_config_var('CC')
366 tmpfile = os.path.join(self.build_temp, 'multiarch')
367 if not os.path.exists(self.build_temp):
368 os.makedirs(self.build_temp)
369 ret = os.system(
370 '%s -print-multiarch > %s 2> /dev/null' % (cc, tmpfile))
371 multiarch_path_component = ''
372 try:
373 if ret >> 8 == 0:
374 with open(tmpfile) as fp:
375 multiarch_path_component = fp.readline().strip()
376 finally:
377 os.unlink(tmpfile)
378
379 if multiarch_path_component != '':
380 add_dir_to_list(self.compiler.library_dirs,
381 '/usr/lib/' + multiarch_path_component)
382 add_dir_to_list(self.compiler.include_dirs,
383 '/usr/include/' + multiarch_path_component)
384 return
385
Barry Warsawffc9caf2011-04-07 11:28:11 -0400386 if not find_executable('dpkg-architecture'):
387 return
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100388 opt = ''
389 if cross_compiling:
390 opt = '-t' + sysconfig.get_config_var('HOST_GNU_TYPE')
Barry Warsawffc9caf2011-04-07 11:28:11 -0400391 tmpfile = os.path.join(self.build_temp, 'multiarch')
392 if not os.path.exists(self.build_temp):
393 os.makedirs(self.build_temp)
394 ret = os.system(
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100395 'dpkg-architecture %s -qDEB_HOST_MULTIARCH > %s 2> /dev/null' %
396 (opt, tmpfile))
Barry Warsawffc9caf2011-04-07 11:28:11 -0400397 try:
398 if ret >> 8 == 0:
399 with open(tmpfile) as fp:
400 multiarch_path_component = fp.readline().strip()
401 add_dir_to_list(self.compiler.library_dirs,
402 '/usr/lib/' + multiarch_path_component)
403 add_dir_to_list(self.compiler.include_dirs,
404 '/usr/include/' + multiarch_path_component)
405 finally:
406 os.unlink(tmpfile)
407
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100408 def add_gcc_paths(self):
409 gcc = sysconfig.get_config_var('CC')
410 tmpfile = os.path.join(self.build_temp, 'gccpaths')
411 if not os.path.exists(self.build_temp):
412 os.makedirs(self.build_temp)
413 ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (gcc, tmpfile))
414 is_gcc = False
415 in_incdirs = False
416 inc_dirs = []
417 lib_dirs = []
418 try:
419 if ret >> 8 == 0:
420 with open(tmpfile) as fp:
421 for line in fp.readlines():
422 if line.startswith("gcc version"):
423 is_gcc = True
424 elif line.startswith("#include <...>"):
425 in_incdirs = True
426 elif line.startswith("End of search list"):
427 in_incdirs = False
428 elif is_gcc and line.startswith("LIBRARY_PATH"):
429 for d in line.strip().split("=")[1].split(":"):
430 d = os.path.normpath(d)
431 if '/gcc/' not in d:
432 add_dir_to_list(self.compiler.library_dirs,
433 d)
434 elif is_gcc and in_incdirs and '/gcc/' not in line:
435 add_dir_to_list(self.compiler.include_dirs,
436 line.strip())
437 finally:
438 os.unlink(tmpfile)
439
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000440 def detect_modules(self):
Fredrik Lundhade711a2001-01-24 08:00:28 +0000441 # Ensure that /usr/local is always used
Ned Deily61667092013-05-15 18:00:45 -0700442 if not cross_compiling:
443 add_dir_to_list(self.compiler.library_dirs, '/usr/local/lib')
444 add_dir_to_list(self.compiler.include_dirs, '/usr/local/include')
445 if cross_compiling:
446 self.add_gcc_paths()
Barry Warsawffc9caf2011-04-07 11:28:11 -0400447 self.add_multiarch_paths()
Michael W. Hudson39230b32002-01-16 15:26:48 +0000448
Brett Cannon516592f2004-12-07 00:42:59 +0000449 # Add paths specified in the environment variables LDFLAGS and
Brett Cannon4810eb92004-12-31 08:11:21 +0000450 # CPPFLAGS for header and library files.
Brett Cannon5399c6d2004-12-18 20:48:09 +0000451 # We must get the values from the Makefile and not the environment
452 # directly since an inconsistently reproducible issue comes up where
453 # the environment variable is not set even though the value were passed
Brett Cannon4810eb92004-12-31 08:11:21 +0000454 # into configure and stored in the Makefile (issue found on OS X 10.3).
Brett Cannon516592f2004-12-07 00:42:59 +0000455 for env_var, arg_name, dir_list in (
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000456 ('LDFLAGS', '-R', self.compiler.runtime_library_dirs),
457 ('LDFLAGS', '-L', self.compiler.library_dirs),
458 ('CPPFLAGS', '-I', self.compiler.include_dirs)):
Brett Cannon5399c6d2004-12-18 20:48:09 +0000459 env_val = sysconfig.get_config_var(env_var)
Brett Cannon516592f2004-12-07 00:42:59 +0000460 if env_val:
Brett Cannon4810eb92004-12-31 08:11:21 +0000461 # To prevent optparse from raising an exception about any
Skip Montanaroa46ed912008-10-07 02:02:00 +0000462 # options in env_val that it doesn't know about we strip out
Brett Cannon4810eb92004-12-31 08:11:21 +0000463 # all double dashes and any dashes followed by a character
464 # that is not for the option we are dealing with.
465 #
466 # Please note that order of the regex is important! We must
467 # strip out double-dashes first so that we don't end up with
468 # substituting "--Long" to "-Long" and thus lead to "ong" being
469 # used for a library directory.
Georg Brandl915c87d2007-08-24 11:47:37 +0000470 env_val = re.sub(r'(^|\s+)-(-|(?!%s))' % arg_name[1],
471 ' ', env_val)
Brett Cannon84667c02004-12-07 03:25:18 +0000472 parser = optparse.OptionParser()
Brett Cannon4810eb92004-12-31 08:11:21 +0000473 # Make sure that allowing args interspersed with options is
474 # allowed
475 parser.allow_interspersed_args = True
476 parser.error = lambda msg: None
Brett Cannon84667c02004-12-07 03:25:18 +0000477 parser.add_option(arg_name, dest="dirs", action="append")
478 options = parser.parse_args(env_val.split())[0]
Brett Cannon44837712005-01-02 21:54:07 +0000479 if options.dirs:
Brett Cannon861e3962008-02-03 02:08:45 +0000480 for directory in reversed(options.dirs):
Brett Cannon44837712005-01-02 21:54:07 +0000481 add_dir_to_list(dir_list, directory)
Skip Montanarodecc6a42003-01-01 20:07:49 +0000482
Ronald Oussoren24215252010-10-20 13:11:46 +0000483 if os.path.normpath(sys.prefix) != '/usr' \
484 and not sysconfig.get_config_var('PYTHONFRAMEWORK'):
485 # OSX note: Don't add LIBDIR and INCLUDEDIR to building a framework
486 # (PYTHONFRAMEWORK is set) to avoid # linking problems when
487 # building a framework with different architectures than
488 # the one that is currently installed (issue #7473)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000489 add_dir_to_list(self.compiler.library_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000490 sysconfig.get_config_var("LIBDIR"))
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000491 add_dir_to_list(self.compiler.include_dirs,
Michael W. Hudson90b8e4d2002-08-02 13:55:50 +0000492 sysconfig.get_config_var("INCLUDEDIR"))
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000493
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000494 try:
495 have_unicode = unicode
496 except NameError:
497 have_unicode = 0
498
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000499 # lib_dirs and inc_dirs are used to search for files;
500 # if a file is found in one of those directories, it can
501 # be assumed that no additional -I,-L directives are needed.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100502 inc_dirs = self.compiler.include_dirs[:]
503 lib_dirs = self.compiler.library_dirs[:]
504 if not cross_compiling:
505 for d in (
506 '/usr/include',
507 ):
508 add_dir_to_list(inc_dirs, d)
509 for d in (
510 '/lib64', '/usr/lib64',
511 '/lib', '/usr/lib',
512 ):
513 add_dir_to_list(lib_dirs, d)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000514 exts = []
Skip Montanarod1287322007-03-06 15:41:38 +0000515 missing = []
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000516
Brett Cannon4454a1f2005-04-15 20:32:39 +0000517 config_h = sysconfig.get_config_h_filename()
518 config_h_vars = sysconfig.parse_config_h(open(config_h))
519
Neil Schemenauerc59c5f32009-02-05 16:32:29 +0000520 srcdir = sysconfig.get_config_var('srcdir')
Michael W. Hudson5b109102002-01-23 15:04:41 +0000521
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000522 # Check for AtheOS which has libraries in non-standard locations
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100523 if host_platform == 'atheos':
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000524 lib_dirs += ['/system/libs', '/atheos/autolnk/lib']
525 lib_dirs += os.getenv('LIBRARY_PATH', '').split(os.pathsep)
526 inc_dirs += ['/system/include', '/atheos/autolnk/include']
527 inc_dirs += os.getenv('C_INCLUDE_PATH', '').split(os.pathsep)
528
Andrew M. Kuchling7883dc82003-10-24 18:26:26 +0000529 # OSF/1 and Unixware have some stuff in /usr/ccs/lib (like -ldb)
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100530 if host_platform in ['osf1', 'unixware7', 'openunix8']:
Skip Montanaro22e00c42003-05-06 20:43:34 +0000531 lib_dirs += ['/usr/ccs/lib']
532
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200533 # HP-UX11iv3 keeps files in lib/hpux folders.
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100534 if host_platform == 'hp-ux11':
Charles-François Natali0d3db3a2012-04-12 19:11:54 +0200535 lib_dirs += ['/usr/lib/hpux64', '/usr/lib/hpux32']
536
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100537 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000538 # This should work on any unixy platform ;-)
539 # If the user has bothered specifying additional -I and -L flags
540 # in OPT and LDFLAGS we might as well use them here.
541 # NOTE: using shlex.split would technically be more correct, but
542 # also gives a bootstrap problem. Let's hope nobody uses directories
543 # with whitespace in the name to store libraries.
544 cflags, ldflags = sysconfig.get_config_vars(
545 'CFLAGS', 'LDFLAGS')
546 for item in cflags.split():
547 if item.startswith('-I'):
548 inc_dirs.append(item[2:])
549
550 for item in ldflags.split():
551 if item.startswith('-L'):
552 lib_dirs.append(item[2:])
553
Fredrik Lundhade711a2001-01-24 08:00:28 +0000554 # Check for MacOS X, which doesn't need libm.a at all
555 math_libs = ['m']
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100556 if host_platform in ['darwin', 'beos']:
Fredrik Lundhade711a2001-01-24 08:00:28 +0000557 math_libs = []
Michael W. Hudson5b109102002-01-23 15:04:41 +0000558
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000559 # XXX Omitted modules: gl, pure, dl, SGI-specific modules
560
561 #
562 # The following modules are all pretty straightforward, and compile
563 # on pretty much any POSIXish platform.
564 #
Fredrik Lundhade711a2001-01-24 08:00:28 +0000565
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000566 # Some modules that are normally always on:
Georg Brandlfa8fa0c2010-08-21 13:05:38 +0000567 #exts.append( Extension('_weakref', ['_weakref.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000568
569 # array objects
570 exts.append( Extension('array', ['arraymodule.c']) )
571 # complex math library functions
Mark Dickinson12748b02009-12-21 15:22:00 +0000572 exts.append( Extension('cmath', ['cmathmodule.c', '_math.c'],
573 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000574 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000575 # math library functions, e.g. sin()
Mark Dickinson9cae1782009-12-16 20:13:40 +0000576 exts.append( Extension('math', ['mathmodule.c', '_math.c'],
Mark Dickinson1c498282009-12-17 08:33:56 +0000577 depends=['_math.h'],
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000578 libraries=math_libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000579 # fast string operations implemented in C
580 exts.append( Extension('strop', ['stropmodule.c']) )
581 # time operations and variables
Andrew M. Kuchling5ddb25f2001-01-23 22:21:11 +0000582 exts.append( Extension('time', ['timemodule.c'],
583 libraries=math_libs) )
Brett Cannon057e7202004-06-24 01:38:47 +0000584 exts.append( Extension('datetime', ['datetimemodule.c', 'timemodule.c'],
Guido van Rossuma29d5082002-12-16 20:31:57 +0000585 libraries=math_libs) )
Neal Norwitz0d2192b2008-03-23 06:13:25 +0000586 # fast iterator tools implemented in C
587 exts.append( Extension("itertools", ["itertoolsmodule.c"]) )
Eric Smitha73fbe72008-02-23 03:09:44 +0000588 # code that will be builtins in the future, but conflict with the
589 # current builtins
590 exts.append( Extension('future_builtins', ['future_builtins.c']) )
Raymond Hettinger40f62172002-12-29 23:03:38 +0000591 # random number generator implemented in C
Tim Peters2c60f7a2003-01-29 03:49:43 +0000592 exts.append( Extension("_random", ["_randommodule.c"]) )
Raymond Hettinger756b3f32004-01-29 06:37:52 +0000593 # high-performance collections
Raymond Hettingereb979882007-02-28 18:37:52 +0000594 exts.append( Extension("_collections", ["_collectionsmodule.c"]) )
Raymond Hettinger0c410272004-01-05 10:13:35 +0000595 # bisect
596 exts.append( Extension("_bisect", ["_bisectmodule.c"]) )
Raymond Hettingerb3af1812003-11-08 10:24:38 +0000597 # heapq
Raymond Hettingerc46cb2a2004-04-19 19:06:21 +0000598 exts.append( Extension("_heapq", ["_heapqmodule.c"]) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000599 # operator.add() and similar goodies
600 exts.append( Extension('operator', ['operator.c']) )
Antoine Pitrou19690592009-06-12 20:14:08 +0000601 # Python 3.1 _io library
602 exts.append( Extension("_io",
603 ["_io/bufferedio.c", "_io/bytesio.c", "_io/fileio.c",
604 "_io/iobase.c", "_io/_iomodule.c", "_io/stringio.c", "_io/textio.c"],
605 depends=["_io/_iomodule.h"], include_dirs=["Modules/_io"]))
Nick Coghlanc649ec52006-05-29 12:43:05 +0000606 # _functools
607 exts.append( Extension("_functools", ["_functoolsmodule.c"]) )
Brett Cannon4b964f92008-05-05 20:21:38 +0000608 # _json speedups
609 exts.append( Extension("_json", ["_json.c"]) )
Marc-André Lemburg261b8e22001-02-02 12:12:44 +0000610 # Python C API test module
Mark Dickinsond155bbf2009-02-10 16:17:16 +0000611 exts.append( Extension('_testcapi', ['_testcapimodule.c'],
612 depends=['testcapi_long.h']) )
Armin Rigoa871ef22006-02-08 12:53:56 +0000613 # profilers (_lsprof is for cProfile.py)
614 exts.append( Extension('_hotshot', ['_hotshot.c']) )
615 exts.append( Extension('_lsprof', ['_lsprof.c', 'rotatingtree.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000616 # static Unicode character database
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000617 if have_unicode:
618 exts.append( Extension('unicodedata', ['unicodedata.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000619 else:
620 missing.append('unicodedata')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000621 # access to ISO C locale support
Martin v. Löwis19d17342003-06-14 21:03:05 +0000622 data = open('pyconfig.h').read()
623 m = re.search(r"#s*define\s+WITH_LIBINTL\s+1\s*", data)
624 if m is not None:
Jason Tishlerd28216b2002-08-14 11:13:52 +0000625 locale_libs = ['intl']
626 else:
627 locale_libs = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100628 if host_platform == 'darwin':
Jack Jansen84b74472004-07-15 19:56:25 +0000629 locale_extra_link_args = ['-framework', 'CoreFoundation']
630 else:
631 locale_extra_link_args = []
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000632
Jack Jansen84b74472004-07-15 19:56:25 +0000633
Jason Tishlerd28216b2002-08-14 11:13:52 +0000634 exts.append( Extension('_locale', ['_localemodule.c'],
Jack Jansen84b74472004-07-15 19:56:25 +0000635 libraries=locale_libs,
636 extra_link_args=locale_extra_link_args) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000637
638 # Modules with some UNIX dependencies -- on by default:
639 # (If you have a really backward UNIX, select and socket may not be
640 # supported...)
641
642 # fcntl(2) and ioctl(2)
Antoine Pitrou85729812010-09-07 14:55:24 +0000643 libs = []
644 if (config_h_vars.get('FLOCK_NEEDS_LIBBSD', False)):
645 # May be necessary on AIX for flock function
646 libs = ['bsd']
647 exts.append( Extension('fcntl', ['fcntlmodule.c'], libraries=libs) )
Ronald Oussoren9545a232010-05-05 19:09:31 +0000648 # pwd(3)
649 exts.append( Extension('pwd', ['pwdmodule.c']) )
650 # grp(3)
651 exts.append( Extension('grp', ['grpmodule.c']) )
652 # spwd, shadow passwords
653 if (config_h_vars.get('HAVE_GETSPNAM', False) or
654 config_h_vars.get('HAVE_GETSPENT', False)):
655 exts.append( Extension('spwd', ['spwdmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000656 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000657 missing.append('spwd')
Skip Montanarod1287322007-03-06 15:41:38 +0000658
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000659 # select(2); not on ancient System V
660 exts.append( Extension('select', ['selectmodule.c']) )
661
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000662 # Fred Drake's interface to the Python parser
663 exts.append( Extension('parser', ['parsermodule.c']) )
664
Guido van Rossum2e1c09c2002-04-04 17:52:50 +0000665 # cStringIO and cPickle
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000666 exts.append( Extension('cStringIO', ['cStringIO.c']) )
667 exts.append( Extension('cPickle', ['cPickle.c']) )
668
669 # Memory-mapped files (also works on Win32).
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100670 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +0000671 exts.append( Extension('mmap', ['mmapmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000672 else:
673 missing.append('mmap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000674
Andrew M. Kuchling57269d02004-08-31 13:37:25 +0000675 # Lance Ellinghaus's syslog module
Ronald Oussoren9545a232010-05-05 19:09:31 +0000676 # syslog daemon interface
677 exts.append( Extension('syslog', ['syslogmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000678
679 # George Neville-Neil's timing module:
Neal Norwitz6143c542006-03-03 00:48:46 +0000680 # Deprecated in PEP 4 http://www.python.org/peps/pep-0004.html
681 # http://mail.python.org/pipermail/python-dev/2006-January/060023.html
682 #exts.append( Extension('timing', ['timingmodule.c']) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000683
684 #
Andrew M. Kuchling5bbc7b92001-01-18 20:39:34 +0000685 # Here ends the simple stuff. From here on, modules need certain
686 # libraries, are platform-specific, or present other surprises.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000687 #
688
689 # Multimedia modules
690 # These don't work for 64-bit platforms!!!
691 # These represent audio samples or images as strings:
692
Neal Norwitz5e4a3b82004-07-19 16:55:07 +0000693 # Operations on audio samples
Tim Petersf9cbf212004-07-23 02:50:10 +0000694 # According to #993173, this one should actually work fine on
Martin v. Löwis8fbefe22004-07-19 16:42:20 +0000695 # 64-bit platforms.
696 exts.append( Extension('audioop', ['audioop.c']) )
697
Fredrik Lundhade711a2001-01-24 08:00:28 +0000698 # Disabled on 64-bit platforms
Benjamin Peterson6e3c3c32015-01-21 00:47:54 -0500699 if sys.maxsize != 9223372036854775807L:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000700 # Operations on images
701 exts.append( Extension('imageop', ['imageop.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +0000702 else:
Brett Cannondc48b742007-05-20 07:09:50 +0000703 missing.extend(['imageop'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000704
705 # readline
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000706 do_readline = self.compiler.find_library_file(lib_dirs, 'readline')
Stefan Krah449aa862010-06-03 12:39:50 +0000707 readline_termcap_library = ""
708 curses_library = ""
709 # Determine if readline is already linked against curses or tinfo.
Stefan Krah4d32c9c2010-06-04 09:49:20 +0000710 if do_readline and find_executable('ldd'):
Stefan Krah449aa862010-06-03 12:39:50 +0000711 fp = os.popen("ldd %s" % do_readline)
Stefan Krah2e26e232010-07-17 12:21:08 +0000712 ldd_output = fp.readlines()
713 ret = fp.close()
714 if ret is None or ret >> 8 == 0:
715 for ln in ldd_output:
716 if 'curses' in ln:
717 readline_termcap_library = re.sub(
718 r'.*lib(n?cursesw?)\.so.*', r'\1', ln
719 ).rstrip()
720 break
721 if 'tinfo' in ln: # termcap interface split out from ncurses
722 readline_termcap_library = 'tinfo'
723 break
Stefan Krah449aa862010-06-03 12:39:50 +0000724 # Issue 7384: If readline is already linked against curses,
725 # use the same library for the readline and curses modules.
726 if 'curses' in readline_termcap_library:
727 curses_library = readline_termcap_library
Stefan Krah23152ea2010-06-03 14:25:16 +0000728 elif self.compiler.find_library_file(lib_dirs, 'ncursesw'):
Stefan Krah449aa862010-06-03 12:39:50 +0000729 curses_library = 'ncursesw'
Stefan Krah23152ea2010-06-03 14:25:16 +0000730 elif self.compiler.find_library_file(lib_dirs, 'ncurses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000731 curses_library = 'ncurses'
Stefan Krah23152ea2010-06-03 14:25:16 +0000732 elif self.compiler.find_library_file(lib_dirs, 'curses'):
Stefan Krah449aa862010-06-03 12:39:50 +0000733 curses_library = 'curses'
734
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100735 if host_platform == 'darwin':
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000736 os_release = int(os.uname()[2].split('.')[0])
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000737 dep_target = sysconfig.get_config_var('MACOSX_DEPLOYMENT_TARGET')
Ned Deily1f70b872014-06-25 13:33:57 -0700738 if (dep_target and
739 (tuple(int(n) for n in dep_target.split('.')[0:2])
740 < (10, 5) ) ):
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +0000741 os_release = 8
Ronald Oussoren9f20d9d2009-09-20 14:18:15 +0000742 if os_release < 9:
743 # MacOSX 10.4 has a broken readline. Don't try to build
744 # the readline module unless the user has installed a fixed
745 # readline package
746 if find_file('readline/rlconf.h', inc_dirs, []) is None:
747 do_readline = False
Jack Jansen81ae2352006-02-23 15:02:23 +0000748 if do_readline:
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100749 if host_platform == 'darwin' and os_release < 9:
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000750 # In every directory on the search path search for a dynamic
751 # library and then a static library, instead of first looking
752 # for dynamic libraries on the entiry path.
753 # This way a staticly linked custom readline gets picked up
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000754 # before the (possibly broken) dynamic library in /usr/lib.
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000755 readline_extra_link_args = ('-Wl,-search_paths_first',)
756 else:
757 readline_extra_link_args = ()
758
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000759 readline_libs = ['readline']
Stefan Krah449aa862010-06-03 12:39:50 +0000760 if readline_termcap_library:
761 pass # Issue 7384: Already linked against curses or tinfo.
762 elif curses_library:
763 readline_libs.append(curses_library)
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000764 elif self.compiler.find_library_file(lib_dirs +
Tarek Ziadée670e5a2009-07-06 12:50:46 +0000765 ['/usr/lib/termcap'],
766 'termcap'):
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000767 readline_libs.append('termcap')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000768 exts.append( Extension('readline', ['readline.c'],
Marc-André Lemburg7c6fcda2001-01-26 18:03:24 +0000769 library_dirs=['/usr/lib/termcap'],
Ronald Oussoren39be38c2006-05-26 11:38:39 +0000770 extra_link_args=readline_extra_link_args,
Marc-André Lemburg2efc3232001-01-26 18:23:02 +0000771 libraries=readline_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +0000772 else:
773 missing.append('readline')
774
Ronald Oussoren9545a232010-05-05 19:09:31 +0000775 # crypt module.
Tim Peters2c60f7a2003-01-29 03:49:43 +0000776
Ronald Oussoren9545a232010-05-05 19:09:31 +0000777 if self.compiler.find_library_file(lib_dirs, 'crypt'):
778 libs = ['crypt']
Skip Montanarod1287322007-03-06 15:41:38 +0000779 else:
Ronald Oussoren9545a232010-05-05 19:09:31 +0000780 libs = []
781 exts.append( Extension('crypt', ['cryptmodule.c'], libraries=libs) )
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000782
Skip Montanaroba9e9782003-03-20 23:34:22 +0000783 # CSV files
784 exts.append( Extension('_csv', ['_csv.c']) )
785
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000786 # socket(2)
Kristján Valur Jónsson868f0aa2013-03-19 13:53:56 -0700787 exts.append( Extension('_socket', ['socketmodule.c', 'timemodule.c'],
788 depends=['socketmodule.h'],
789 libraries=math_libs) )
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000790 # Detect SSL support for the socket module (via _ssl)
Gregory P. Smithade97332005-08-23 21:19:40 +0000791 search_for_ssl_incs_in = [
792 '/usr/local/ssl/include',
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000793 '/usr/contrib/ssl/include/'
794 ]
Gregory P. Smithade97332005-08-23 21:19:40 +0000795 ssl_incs = find_file('openssl/ssl.h', inc_dirs,
796 search_for_ssl_incs_in
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000797 )
Martin v. Löwisa950f7f2003-05-09 09:05:19 +0000798 if ssl_incs is not None:
799 krb5_h = find_file('krb5.h', inc_dirs,
800 ['/usr/kerberos/include'])
801 if krb5_h:
802 ssl_incs += krb5_h
Tarek Ziadé35a3f572010-03-05 00:29:38 +0000803 ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
Andrew M. Kuchlinge7c87322001-01-19 16:58:21 +0000804 ['/usr/local/ssl/lib',
805 '/usr/contrib/ssl/lib/'
806 ] )
Fredrik Lundhade711a2001-01-24 08:00:28 +0000807
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000808 if (ssl_incs is not None and
809 ssl_libs is not None):
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +0000810 exts.append( Extension('_ssl', ['_ssl.c'],
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +0000811 include_dirs = ssl_incs,
Fredrik Lundhade711a2001-01-24 08:00:28 +0000812 library_dirs = ssl_libs,
Guido van Rossum47d3a7a2002-06-13 14:41:32 +0000813 libraries = ['ssl', 'crypto'],
Jeremy Hylton340043e2002-06-13 17:38:11 +0000814 depends = ['socketmodule.h']), )
Skip Montanarod1287322007-03-06 15:41:38 +0000815 else:
816 missing.append('_ssl')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000817
Gregory P. Smithade97332005-08-23 21:19:40 +0000818 # find out which version of OpenSSL we have
819 openssl_ver = 0
820 openssl_ver_re = re.compile(
821 '^\s*#\s*define\s+OPENSSL_VERSION_NUMBER\s+(0x[0-9a-fA-F]+)' )
Gregory P. Smithade97332005-08-23 21:19:40 +0000822
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000823 # look for the openssl version header on the compiler search path.
824 opensslv_h = find_file('openssl/opensslv.h', [],
825 inc_dirs + search_for_ssl_incs_in)
826 if opensslv_h:
827 name = os.path.join(opensslv_h[0], 'openssl/opensslv.h')
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100828 if host_platform == 'darwin' and is_macosx_sdk_path(name):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000829 name = os.path.join(macosx_sdk_root(), name[1:])
830 try:
831 incfile = open(name, 'r')
832 for line in incfile:
833 m = openssl_ver_re.match(line)
834 if m:
835 openssl_ver = eval(m.group(1))
836 except IOError, msg:
837 print "IOError while reading opensshv.h:", msg
838 pass
Gregory P. Smithade97332005-08-23 21:19:40 +0000839
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000840 min_openssl_ver = 0x00907000
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000841 have_any_openssl = ssl_incs is not None and ssl_libs is not None
842 have_usable_openssl = (have_any_openssl and
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000843 openssl_ver >= min_openssl_ver)
Gregory P. Smithade97332005-08-23 21:19:40 +0000844
Gregory P. Smithffd5d882010-01-03 00:43:02 +0000845 if have_any_openssl:
846 if have_usable_openssl:
847 # The _hashlib module wraps optimized implementations
848 # of hash functions from the OpenSSL library.
849 exts.append( Extension('_hashlib', ['_hashopenssl.c'],
850 include_dirs = ssl_incs,
851 library_dirs = ssl_libs,
852 libraries = ['ssl', 'crypto']) )
853 else:
854 print ("warning: openssl 0x%08x is too old for _hashlib" %
855 openssl_ver)
856 missing.append('_hashlib')
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000857 if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000858 # The _sha module implements the SHA1 hash algorithm.
859 exts.append( Extension('_sha', ['shamodule.c']) )
860 # The _md5 module implements the RSA Data Security, Inc. MD5
861 # Message-Digest Algorithm, described in RFC 1321. The
Matthias Klose8e39ec72006-04-03 16:27:50 +0000862 # necessary files md5.c and md5.h are included here.
Gregory P. Smithd7923922006-06-05 23:38:06 +0000863 exts.append( Extension('_md5',
864 sources = ['md5module.c', 'md5.c'],
865 depends = ['md5.h']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000866
Gregory P. Smithc2fa18c2010-01-02 22:25:29 +0000867 min_sha2_openssl_ver = 0x00908000
868 if COMPILED_WITH_PYDEBUG or openssl_ver < min_sha2_openssl_ver:
Gregory P. Smithade97332005-08-23 21:19:40 +0000869 # OpenSSL doesn't do these until 0.9.8 so we'll bring our own hash
870 exts.append( Extension('_sha256', ['sha256module.c']) )
871 exts.append( Extension('_sha512', ['sha512module.c']) )
Gregory P. Smithf21a5f72005-08-21 18:45:59 +0000872
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +0000873 # Modules that provide persistent dictionary-like semantics. You will
874 # probably want to arrange for at least one of them to be available on
875 # your machine, though none are defined by default because of library
876 # dependencies. The Python module anydbm.py provides an
877 # implementation independent wrapper for these; dumbdbm.py provides
878 # similar functionality (but slower of course) implemented in Python.
879
Gregory P. Smith1475cd82007-10-06 07:51:59 +0000880 # Sleepycat^WOracle Berkeley DB interface.
881 # http://www.oracle.com/database/berkeley-db/db/index.html
Skip Montanaro57454e52002-06-14 20:30:31 +0000882 #
Gregory P. Smith4eb60e52007-08-26 00:26:00 +0000883 # This requires the Sleepycat^WOracle DB code. The supported versions
Gregory P. Smithe7f4d842007-10-09 18:26:02 +0000884 # are set below. Visit the URL above to download
Gregory P. Smith3adc4aa2006-04-13 19:19:01 +0000885 # a release. Most open source OSes come with one or more
886 # versions of BerkeleyDB already installed.
Skip Montanaro57454e52002-06-14 20:30:31 +0000887
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700888 max_db_ver = (5, 3)
889 min_db_ver = (4, 3)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000890 db_setup_debug = False # verbose debug prints from this script?
Skip Montanaro57454e52002-06-14 20:30:31 +0000891
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000892 def allow_db_ver(db_ver):
893 """Returns a boolean if the given BerkeleyDB version is acceptable.
894
895 Args:
896 db_ver: A tuple of the version to verify.
897 """
898 if not (min_db_ver <= db_ver <= max_db_ver):
899 return False
900 # Use this function to filter out known bad configurations.
901 if (4, 6) == db_ver[:2]:
902 # BerkeleyDB 4.6.x is not stable on many architectures.
903 arch = platform_machine()
904 if arch not in ('i386', 'i486', 'i586', 'i686',
905 'x86_64', 'ia64'):
906 return False
907 return True
908
909 def gen_db_minor_ver_nums(major):
doko@ubuntu.com4950a3b2013-03-19 14:46:29 -0700910 if major == 5:
911 for x in range(max_db_ver[1]+1):
912 if allow_db_ver((5, x)):
913 yield x
914 elif major == 4:
Benjamin Petersonef2436f2013-10-26 13:55:25 -0400915 for x in range(9):
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000916 if allow_db_ver((4, x)):
917 yield x
918 elif major == 3:
919 for x in (3,):
920 if allow_db_ver((3, x)):
921 yield x
922 else:
923 raise ValueError("unknown major BerkeleyDB version", major)
924
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000925 # construct a list of paths to look for the header file in on
926 # top of the normal inc_dirs.
927 db_inc_paths = [
928 '/usr/include/db4',
929 '/usr/local/include/db4',
930 '/opt/sfw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000931 '/usr/include/db3',
932 '/usr/local/include/db3',
933 '/opt/sfw/include/db3',
Skip Montanaro00c5a012007-03-04 20:52:28 +0000934 # Fink defaults (http://fink.sourceforge.net/)
935 '/sw/include/db4',
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000936 '/sw/include/db3',
937 ]
938 # 4.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000939 for x in gen_db_minor_ver_nums(4):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000940 db_inc_paths.append('/usr/include/db4%d' % x)
Neal Norwitz8f401712005-10-20 05:28:29 +0000941 db_inc_paths.append('/usr/include/db4.%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000942 db_inc_paths.append('/usr/local/BerkeleyDB.4.%d/include' % x)
943 db_inc_paths.append('/usr/local/include/db4%d' % x)
944 db_inc_paths.append('/pkg/db-4.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000945 db_inc_paths.append('/opt/db-4.%d/include' % x)
Skip Montanaro00c5a012007-03-04 20:52:28 +0000946 # MacPorts default (http://www.macports.org/)
947 db_inc_paths.append('/opt/local/include/db4%d' % x)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000948 # 3.x minor number specific paths
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000949 for x in gen_db_minor_ver_nums(3):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000950 db_inc_paths.append('/usr/include/db3%d' % x)
951 db_inc_paths.append('/usr/local/BerkeleyDB.3.%d/include' % x)
952 db_inc_paths.append('/usr/local/include/db3%d' % x)
953 db_inc_paths.append('/pkg/db-3.%d/include' % x)
Gregory P. Smith29602d22006-01-24 09:46:48 +0000954 db_inc_paths.append('/opt/db-3.%d/include' % x)
Tim Peters2c60f7a2003-01-29 03:49:43 +0000955
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100956 if cross_compiling:
957 db_inc_paths = []
958
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000959 # Add some common subdirectories for Sleepycat DB to the list,
960 # based on the standard include directories. This way DB3/4 gets
961 # picked up when it is installed in a non-standard prefix and
962 # the user has added that prefix into inc_dirs.
963 std_variants = []
964 for dn in inc_dirs:
965 std_variants.append(os.path.join(dn, 'db3'))
966 std_variants.append(os.path.join(dn, 'db4'))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000967 for x in gen_db_minor_ver_nums(4):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000968 std_variants.append(os.path.join(dn, "db4%d"%x))
969 std_variants.append(os.path.join(dn, "db4.%d"%x))
Gregory P. Smith0902cac2008-05-27 08:40:09 +0000970 for x in gen_db_minor_ver_nums(3):
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000971 std_variants.append(os.path.join(dn, "db3%d"%x))
972 std_variants.append(os.path.join(dn, "db3.%d"%x))
973
Tim Peters38ff36c2006-06-30 06:18:39 +0000974 db_inc_paths = std_variants + db_inc_paths
Skip Montanaro00c5a012007-03-04 20:52:28 +0000975 db_inc_paths = [p for p in db_inc_paths if os.path.exists(p)]
Ronald Oussoren9b8b6192006-06-27 12:53:52 +0000976
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000977 db_ver_inc_map = {}
978
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100979 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000980 sysroot = macosx_sdk_root()
981
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000982 class db_found(Exception): pass
Skip Montanaro57454e52002-06-14 20:30:31 +0000983 try:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000984 # See whether there is a Sleepycat header in the standard
985 # search path.
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000986 for d in inc_dirs + db_inc_paths:
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000987 f = os.path.join(d, "db.h")
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000988
doko@python.orgd65e2ba2013-01-31 23:52:03 +0100989 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ronald Oussoren593e4ca2010-06-03 09:47:21 +0000990 f = os.path.join(sysroot, d[1:], "db.h")
991
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000992 if db_setup_debug: print "db: looking for db.h in", f
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000993 if os.path.exists(f):
994 f = open(f).read()
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000995 m = re.search(r"#define\WDB_VERSION_MAJOR\W(\d+)", f)
Martin v. Löwis05d4d562002-12-06 10:25:02 +0000996 if m:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +0000997 db_major = int(m.group(1))
998 m = re.search(r"#define\WDB_VERSION_MINOR\W(\d+)", f)
999 db_minor = int(m.group(1))
1000 db_ver = (db_major, db_minor)
1001
Gregory P. Smith1475cd82007-10-06 07:51:59 +00001002 # Avoid 4.6 prior to 4.6.21 due to a BerkeleyDB bug
1003 if db_ver == (4, 6):
1004 m = re.search(r"#define\WDB_VERSION_PATCH\W(\d+)", f)
1005 db_patch = int(m.group(1))
1006 if db_patch < 21:
1007 print "db.h:", db_ver, "patch", db_patch,
1008 print "being ignored (4.6.x must be >= 4.6.21)"
1009 continue
1010
Antoine Pitrou8c510e72010-01-13 11:47:49 +00001011 if ( (db_ver not in db_ver_inc_map) and
Gregory P. Smith0902cac2008-05-27 08:40:09 +00001012 allow_db_ver(db_ver) ):
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001013 # save the include directory with the db.h version
Skip Montanaro00c5a012007-03-04 20:52:28 +00001014 # (first occurrence only)
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001015 db_ver_inc_map[db_ver] = d
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001016 if db_setup_debug:
1017 print "db.h: found", db_ver, "in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001018 else:
1019 # we already found a header for this library version
1020 if db_setup_debug: print "db.h: ignoring", d
1021 else:
1022 # ignore this header, it didn't contain a version number
Skip Montanaro00c5a012007-03-04 20:52:28 +00001023 if db_setup_debug:
1024 print "db.h: no version number version in", d
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001025
1026 db_found_vers = db_ver_inc_map.keys()
1027 db_found_vers.sort()
1028
1029 while db_found_vers:
1030 db_ver = db_found_vers.pop()
1031 db_incdir = db_ver_inc_map[db_ver]
1032
1033 # check lib directories parallel to the location of the header
1034 db_dirs_to_check = [
Skip Montanaro00c5a012007-03-04 20:52:28 +00001035 db_incdir.replace("include", 'lib64'),
1036 db_incdir.replace("include", 'lib'),
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001037 ]
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001038
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001039 if host_platform != 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001040 db_dirs_to_check = filter(os.path.isdir, db_dirs_to_check)
1041
1042 else:
1043 # Same as other branch, but takes OSX SDK into account
1044 tmp = []
1045 for dn in db_dirs_to_check:
1046 if is_macosx_sdk_path(dn):
1047 if os.path.isdir(os.path.join(sysroot, dn[1:])):
1048 tmp.append(dn)
1049 else:
1050 if os.path.isdir(dn):
1051 tmp.append(dn)
Ronald Oussorencd172132010-06-27 12:36:16 +00001052 db_dirs_to_check = tmp
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001053
Ezio Melotti24b07bc2011-03-15 18:55:01 +02001054 # Look for a version specific db-X.Y before an ambiguous dbX
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001055 # XXX should we -ever- look for a dbX name? Do any
1056 # systems really not name their library by version and
1057 # symlink to more general names?
Andrew MacIntyre953f98d2005-03-09 22:21:08 +00001058 for dblib in (('db-%d.%d' % db_ver),
1059 ('db%d%d' % db_ver),
1060 ('db%d' % db_ver[0])):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001061 dblib_file = self.compiler.find_library_file(
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001062 db_dirs_to_check + lib_dirs, dblib )
1063 if dblib_file:
1064 dblib_dir = [ os.path.abspath(os.path.dirname(dblib_file)) ]
1065 raise db_found
1066 else:
1067 if db_setup_debug: print "db lib: ", dblib, "not found"
1068
1069 except db_found:
Brett Cannonef3dab22008-05-29 21:23:33 +00001070 if db_setup_debug:
1071 print "bsddb using BerkeleyDB lib:", db_ver, dblib
1072 print "bsddb lib dir:", dblib_dir, " inc dir:", db_incdir
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001073 db_incs = [db_incdir]
Jack Jansend1b20452002-07-08 21:39:36 +00001074 dblibs = [dblib]
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001075 # We add the runtime_library_dirs argument because the
1076 # BerkeleyDB lib we're linking against often isn't in the
1077 # system dynamic library search path. This is usually
1078 # correct and most trouble free, but may cause problems in
1079 # some unusual system configurations (e.g. the directory
1080 # is on an NFS server that goes away).
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001081 exts.append(Extension('_bsddb', ['_bsddb.c'],
Gregory P. Smith39250532007-10-09 06:02:21 +00001082 depends = ['bsddb.h'],
Martin v. Löwis05d4d562002-12-06 10:25:02 +00001083 library_dirs=dblib_dir,
1084 runtime_library_dirs=dblib_dir,
Martin v. Löwis6aa4a1f2002-11-19 08:09:52 +00001085 include_dirs=db_incs,
1086 libraries=dblibs))
Skip Montanaro57454e52002-06-14 20:30:31 +00001087 else:
Gregory P. Smithe76c8c02004-12-13 12:01:24 +00001088 if db_setup_debug: print "db: no appropriate library found"
Skip Montanaro57454e52002-06-14 20:30:31 +00001089 db_incs = None
1090 dblibs = []
1091 dblib_dir = None
Skip Montanarod1287322007-03-06 15:41:38 +00001092 missing.append('_bsddb')
Skip Montanaro57454e52002-06-14 20:30:31 +00001093
Anthony Baxterc51ee692006-04-01 00:57:31 +00001094 # The sqlite interface
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001095 sqlite_setup_debug = False # verbose debug prints from this script?
Anthony Baxterc51ee692006-04-01 00:57:31 +00001096
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001097 # We hunt for #define SQLITE_VERSION "n.n.n"
1098 # We need to find >= sqlite version 3.0.8
Anthony Baxterc51ee692006-04-01 00:57:31 +00001099 sqlite_incdir = sqlite_libdir = None
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001100 sqlite_inc_paths = [ '/usr/include',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001101 '/usr/include/sqlite',
1102 '/usr/include/sqlite3',
1103 '/usr/local/include',
1104 '/usr/local/include/sqlite',
1105 '/usr/local/include/sqlite3',
1106 ]
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001107 if cross_compiling:
1108 sqlite_inc_paths = []
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001109 MIN_SQLITE_VERSION_NUMBER = (3, 0, 8)
1110 MIN_SQLITE_VERSION = ".".join([str(x)
1111 for x in MIN_SQLITE_VERSION_NUMBER])
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001112
1113 # Scan the default include directories before the SQLite specific
1114 # ones. This allows one to override the copy of sqlite on OSX,
1115 # where /usr/include contains an old version of sqlite.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001116 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001117 sysroot = macosx_sdk_root()
1118
Ned Deily67028042012-08-05 14:42:45 -07001119 for d_ in inc_dirs + sqlite_inc_paths:
1120 d = d_
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001121 if host_platform == 'darwin' and is_macosx_sdk_path(d):
Ned Deily67028042012-08-05 14:42:45 -07001122 d = os.path.join(sysroot, d[1:])
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001123
Ned Deily67028042012-08-05 14:42:45 -07001124 f = os.path.join(d, "sqlite3.h")
Anthony Baxterc51ee692006-04-01 00:57:31 +00001125 if os.path.exists(f):
Anthony Baxter07f5b352006-04-01 08:36:27 +00001126 if sqlite_setup_debug: print "sqlite: found %s"%f
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001127 incf = open(f).read()
1128 m = re.search(
Petri Lehtinenc23178b2013-02-23 17:05:28 +01001129 r'\s*.*#\s*.*define\s.*SQLITE_VERSION\W*"([\d\.]*)"', incf)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001130 if m:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001131 sqlite_version = m.group(1)
1132 sqlite_version_tuple = tuple([int(x)
1133 for x in sqlite_version.split(".")])
1134 if sqlite_version_tuple >= MIN_SQLITE_VERSION_NUMBER:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001135 # we win!
Andrew M. Kuchling738446f42006-10-27 18:13:46 +00001136 if sqlite_setup_debug:
1137 print "%s/sqlite3.h: version %s"%(d, sqlite_version)
Anthony Baxterc51ee692006-04-01 00:57:31 +00001138 sqlite_incdir = d
1139 break
1140 else:
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001141 if sqlite_setup_debug:
Anthony Baxterc51ee692006-04-01 00:57:31 +00001142 print "%s: version %d is too old, need >= %s"%(d,
1143 sqlite_version, MIN_SQLITE_VERSION)
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001144 elif sqlite_setup_debug:
1145 print "sqlite: %s had no SQLITE_VERSION"%(f,)
1146
Anthony Baxterc51ee692006-04-01 00:57:31 +00001147 if sqlite_incdir:
1148 sqlite_dirs_to_check = [
1149 os.path.join(sqlite_incdir, '..', 'lib64'),
1150 os.path.join(sqlite_incdir, '..', 'lib'),
1151 os.path.join(sqlite_incdir, '..', '..', 'lib64'),
1152 os.path.join(sqlite_incdir, '..', '..', 'lib'),
1153 ]
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001154 sqlite_libfile = self.compiler.find_library_file(
Anthony Baxterc51ee692006-04-01 00:57:31 +00001155 sqlite_dirs_to_check + lib_dirs, 'sqlite3')
Hirokazu Yamamoto1ae415c2008-10-03 17:34:49 +00001156 if sqlite_libfile:
1157 sqlite_libdir = [os.path.abspath(os.path.dirname(sqlite_libfile))]
Anthony Baxterc51ee692006-04-01 00:57:31 +00001158
1159 if sqlite_incdir and sqlite_libdir:
Gerhard Häring3e99c0a2006-04-23 15:24:26 +00001160 sqlite_srcs = ['_sqlite/cache.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001161 '_sqlite/connection.c',
Anthony Baxterc51ee692006-04-01 00:57:31 +00001162 '_sqlite/cursor.c',
1163 '_sqlite/microprotocols.c',
1164 '_sqlite/module.c',
1165 '_sqlite/prepare_protocol.c',
1166 '_sqlite/row.c',
1167 '_sqlite/statement.c',
1168 '_sqlite/util.c', ]
1169
Anthony Baxterc51ee692006-04-01 00:57:31 +00001170 sqlite_defines = []
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001171 if host_platform != "win32":
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001172 sqlite_defines.append(('MODULE_NAME', '"sqlite3"'))
Anthony Baxterc51ee692006-04-01 00:57:31 +00001173 else:
Anthony Baxter8e7b4902006-04-05 18:25:33 +00001174 sqlite_defines.append(('MODULE_NAME', '\\"sqlite3\\"'))
1175
Gerhard Häring3bbb6722010-03-05 09:12:37 +00001176 # Comment this out if you want the sqlite3 module to be able to load extensions.
1177 sqlite_defines.append(("SQLITE_OMIT_LOAD_EXTENSION", "1"))
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001178
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001179 if host_platform == 'darwin':
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001180 # In every directory on the search path search for a dynamic
1181 # library and then a static library, instead of first looking
Ezio Melottic2077b02011-03-16 12:34:31 +02001182 # for dynamic libraries on the entire path.
1183 # This way a statically linked custom sqlite gets picked up
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001184 # before the dynamic library in /usr/lib.
1185 sqlite_extra_link_args = ('-Wl,-search_paths_first',)
1186 else:
1187 sqlite_extra_link_args = ()
1188
Anthony Baxterc51ee692006-04-01 00:57:31 +00001189 exts.append(Extension('_sqlite3', sqlite_srcs,
1190 define_macros=sqlite_defines,
Anthony Baxter3dc6bb32006-04-03 02:20:49 +00001191 include_dirs=["Modules/_sqlite",
Anthony Baxterc51ee692006-04-01 00:57:31 +00001192 sqlite_incdir],
1193 library_dirs=sqlite_libdir,
Ronald Oussoren39be38c2006-05-26 11:38:39 +00001194 extra_link_args=sqlite_extra_link_args,
Anthony Baxterc51ee692006-04-01 00:57:31 +00001195 libraries=["sqlite3",]))
Skip Montanarod1287322007-03-06 15:41:38 +00001196 else:
1197 missing.append('_sqlite3')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001198
1199 # Look for Berkeley db 1.85. Note that it is built as a different
1200 # module name so it can be included even when later versions are
1201 # available. A very restrictive search is performed to avoid
1202 # accidentally building this module with a later version of the
1203 # underlying db library. May BSD-ish Unixes incorporate db 1.85
1204 # symbols into libc and place the include file in /usr/include.
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001205 #
1206 # If the better bsddb library can be built (db_incs is defined)
1207 # we do not build this one. Otherwise this build will pick up
1208 # the more recent berkeleydb's db.h file first in the include path
1209 # when attempting to compile and it will fail.
Skip Montanaro22e00c42003-05-06 20:43:34 +00001210 f = "/usr/include/db.h"
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001211
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001212 if host_platform == 'darwin':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001213 if is_macosx_sdk_path(f):
1214 sysroot = macosx_sdk_root()
1215 f = os.path.join(sysroot, f[1:])
1216
Gregory P. Smith4eb60e52007-08-26 00:26:00 +00001217 if os.path.exists(f) and not db_incs:
Skip Montanaro22e00c42003-05-06 20:43:34 +00001218 data = open(f).read()
1219 m = re.search(r"#s*define\s+HASHVERSION\s+2\s*", data)
1220 if m is not None:
1221 # bingo - old version used hash file format version 2
1222 ### XXX this should be fixed to not be platform-dependent
1223 ### but I don't have direct access to an osf1 platform and
1224 ### seemed to be muffing the search somehow
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001225 libraries = host_platform == "osf1" and ['db'] or None
Skip Montanaro22e00c42003-05-06 20:43:34 +00001226 if libraries is not None:
1227 exts.append(Extension('bsddb185', ['bsddbmodule.c'],
1228 libraries=libraries))
1229 else:
1230 exts.append(Extension('bsddb185', ['bsddbmodule.c']))
Skip Montanarod1287322007-03-06 15:41:38 +00001231 else:
1232 missing.append('bsddb185')
1233 else:
1234 missing.append('bsddb185')
Skip Montanaro22e00c42003-05-06 20:43:34 +00001235
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001236 dbm_order = ['gdbm']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001237 # The standard Unix dbm module:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001238 if host_platform not in ['cygwin']:
Matthias Klose51c614e2009-04-29 19:52:49 +00001239 config_args = [arg.strip("'")
1240 for arg in sysconfig.get_config_var("CONFIG_ARGS").split()]
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001241 dbm_args = [arg for arg in config_args
Matthias Klose10cbe482009-04-29 17:18:19 +00001242 if arg.startswith('--with-dbmliborder=')]
1243 if dbm_args:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001244 dbm_order = [arg.split('=')[-1] for arg in dbm_args][-1].split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001245 else:
Matthias Klose51c614e2009-04-29 19:52:49 +00001246 dbm_order = "ndbm:gdbm:bdb".split(":")
Matthias Klose10cbe482009-04-29 17:18:19 +00001247 dbmext = None
1248 for cand in dbm_order:
1249 if cand == "ndbm":
1250 if find_file("ndbm.h", inc_dirs, []) is not None:
Nick Coghlan970fcef2012-06-17 18:35:39 +10001251 # Some systems have -lndbm, others have -lgdbm_compat,
1252 # others don't have either
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001253 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001254 'ndbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001255 ndbm_libs = ['ndbm']
Nick Coghlan970fcef2012-06-17 18:35:39 +10001256 elif self.compiler.find_library_file(lib_dirs,
1257 'gdbm_compat'):
1258 ndbm_libs = ['gdbm_compat']
Matthias Klose10cbe482009-04-29 17:18:19 +00001259 else:
1260 ndbm_libs = []
1261 print "building dbm using ndbm"
1262 dbmext = Extension('dbm', ['dbmmodule.c'],
1263 define_macros=[
1264 ('HAVE_NDBM_H',None),
1265 ],
1266 libraries=ndbm_libs)
1267 break
1268
1269 elif cand == "gdbm":
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001270 if self.compiler.find_library_file(lib_dirs, 'gdbm'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001271 gdbm_libs = ['gdbm']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001272 if self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001273 'gdbm_compat'):
Matthias Klose10cbe482009-04-29 17:18:19 +00001274 gdbm_libs.append('gdbm_compat')
1275 if find_file("gdbm/ndbm.h", inc_dirs, []) is not None:
1276 print "building dbm using gdbm"
1277 dbmext = Extension(
1278 'dbm', ['dbmmodule.c'],
1279 define_macros=[
1280 ('HAVE_GDBM_NDBM_H', None),
1281 ],
1282 libraries = gdbm_libs)
1283 break
1284 if find_file("gdbm-ndbm.h", inc_dirs, []) is not None:
1285 print "building dbm using gdbm"
1286 dbmext = Extension(
1287 'dbm', ['dbmmodule.c'],
1288 define_macros=[
1289 ('HAVE_GDBM_DASH_NDBM_H', None),
1290 ],
1291 libraries = gdbm_libs)
1292 break
1293 elif cand == "bdb":
1294 if db_incs is not None:
1295 print "building dbm using bdb"
1296 dbmext = Extension('dbm', ['dbmmodule.c'],
1297 library_dirs=dblib_dir,
1298 runtime_library_dirs=dblib_dir,
1299 include_dirs=db_incs,
1300 define_macros=[
1301 ('HAVE_BERKDB_H', None),
1302 ('DB_DBM_HSEARCH', None),
1303 ],
1304 libraries=dblibs)
1305 break
1306 if dbmext is not None:
1307 exts.append(dbmext)
Skip Montanarod1287322007-03-06 15:41:38 +00001308 else:
1309 missing.append('dbm')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001310
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001311 # Anthony Baxter's gdbm module. GNU dbm(3) will require -lgdbm:
Benjamin Petersonedfe72f2010-01-01 15:21:13 +00001312 if ('gdbm' in dbm_order and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001313 self.compiler.find_library_file(lib_dirs, 'gdbm')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001314 exts.append( Extension('gdbm', ['gdbmmodule.c'],
1315 libraries = ['gdbm'] ) )
Skip Montanarod1287322007-03-06 15:41:38 +00001316 else:
1317 missing.append('gdbm')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001318
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001319 # Unix-only modules
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001320 if host_platform not in ['win32']:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001321 # Steen Lumholt's termios module
1322 exts.append( Extension('termios', ['termios.c']) )
1323 # Jeremy Hylton's rlimit interface
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001324 if host_platform not in ['atheos']:
Martin v. Löwisf90ae202002-06-11 06:22:31 +00001325 exts.append( Extension('resource', ['resource.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001326 else:
1327 missing.append('resource')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001328
Andrew M. Kuchlingcf393f32001-02-21 02:38:24 +00001329 # Sun yellow pages. Some systems have the functions in libc.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001330 if (host_platform not in ['cygwin', 'atheos', 'qnx6'] and
Benjamin Petersoneb74da82009-12-30 03:02:34 +00001331 find_file('rpcsvc/yp_prot.h', inc_dirs, []) is not None):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001332 if (self.compiler.find_library_file(lib_dirs, 'nsl')):
Andrew M. Kuchling6efc6e72001-02-27 20:54:23 +00001333 libs = ['nsl']
1334 else:
1335 libs = []
1336 exts.append( Extension('nis', ['nismodule.c'],
1337 libraries = libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001338 else:
1339 missing.append('nis')
1340 else:
1341 missing.extend(['nis', 'resource', 'termios'])
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001342
Skip Montanaro72092942004-02-07 12:50:19 +00001343 # Curses support, requiring the System V version of curses, often
Fredrik Lundhade711a2001-01-24 08:00:28 +00001344 # provided by the ncurses library.
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001345 panel_library = 'panel'
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001346 curses_incs = None
Stefan Krah449aa862010-06-03 12:39:50 +00001347 if curses_library.startswith('ncurses'):
1348 if curses_library == 'ncursesw':
1349 # Bug 1464056: If _curses.so links with ncursesw,
1350 # _curses_panel.so must link with panelw.
1351 panel_library = 'panelw'
1352 curses_libs = [curses_library]
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001353 curses_incs = find_file('curses.h', inc_dirs,
1354 [os.path.join(d, 'ncursesw') for d in inc_dirs])
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001355 exts.append( Extension('_curses', ['_cursesmodule.c'],
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001356 include_dirs = curses_incs,
Martin v. Löwisa55e55e2006-02-11 15:55:14 +00001357 libraries = curses_libs) )
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001358 elif curses_library == 'curses' and host_platform != 'darwin':
Michael W. Hudson5b109102002-01-23 15:04:41 +00001359 # OSX has an old Berkeley curses, not good enough for
1360 # the _curses module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001361 if (self.compiler.find_library_file(lib_dirs, 'terminfo')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001362 curses_libs = ['curses', 'terminfo']
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001363 elif (self.compiler.find_library_file(lib_dirs, 'termcap')):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001364 curses_libs = ['curses', 'termcap']
Neal Norwitz0b27ff92003-03-31 15:53:49 +00001365 else:
1366 curses_libs = ['curses']
Fredrik Lundhade711a2001-01-24 08:00:28 +00001367
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001368 exts.append( Extension('_curses', ['_cursesmodule.c'],
1369 libraries = curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001370 else:
1371 missing.append('_curses')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001372
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001373 # If the curses module is enabled, check for the panel module
Andrew M. Kuchlinge7ffbb22001-12-06 15:57:16 +00001374 if (module_enabled(exts, '_curses') and
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001375 self.compiler.find_library_file(lib_dirs, panel_library)):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001376 exts.append( Extension('_curses_panel', ['_curses_panel.c'],
doko@ubuntu.comf27ec3e2014-04-17 20:11:19 +02001377 include_dirs = curses_incs,
Andrew M. Kuchling86070422006-08-06 22:07:04 +00001378 libraries = [panel_library] + curses_libs) )
Skip Montanarod1287322007-03-06 15:41:38 +00001379 else:
1380 missing.append('_curses_panel')
Fredrik Lundhade711a2001-01-24 08:00:28 +00001381
Barry Warsaw259b1e12002-08-13 20:09:26 +00001382 # Andrew Kuchling's zlib module. Note that some versions of zlib
1383 # 1.1.3 have security problems. See CERT Advisory CA-2002-07:
1384 # http://www.cert.org/advisories/CA-2002-07.html
1385 #
1386 # zlib 1.1.4 is fixed, but at least one vendor (RedHat) has decided to
1387 # patch its zlib 1.1.3 package instead of upgrading to 1.1.4. For
1388 # now, we still accept 1.1.3, because we think it's difficult to
1389 # exploit this in Python, and we'd rather make it RedHat's problem
1390 # than our problem <wink>.
1391 #
1392 # You can upgrade zlib to version 1.1.4 yourself by going to
1393 # http://www.gzip.org/zlib/
Guido van Rossume6970912001-04-15 15:16:12 +00001394 zlib_inc = find_file('zlib.h', [], inc_dirs)
Gregory P. Smith440ca772008-03-24 00:08:01 +00001395 have_zlib = False
Guido van Rossume6970912001-04-15 15:16:12 +00001396 if zlib_inc is not None:
1397 zlib_h = zlib_inc[0] + '/zlib.h'
1398 version = '"0.0.0"'
Barry Warsaw259b1e12002-08-13 20:09:26 +00001399 version_req = '"1.1.3"'
Ned Deily6ea3c9b2013-10-18 21:33:57 -07001400 if host_platform == 'darwin' and is_macosx_sdk_path(zlib_h):
1401 zlib_h = os.path.join(macosx_sdk_root(), zlib_h[1:])
Guido van Rossume6970912001-04-15 15:16:12 +00001402 fp = open(zlib_h)
1403 while 1:
1404 line = fp.readline()
1405 if not line:
1406 break
Guido van Rossum8cdc03d2002-08-06 17:28:30 +00001407 if line.startswith('#define ZLIB_VERSION'):
Guido van Rossume6970912001-04-15 15:16:12 +00001408 version = line.split()[2]
1409 break
1410 if version >= version_req:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001411 if (self.compiler.find_library_file(lib_dirs, 'z')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001412 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001413 zlib_extra_link_args = ('-Wl,-search_paths_first',)
1414 else:
1415 zlib_extra_link_args = ()
Guido van Rossume6970912001-04-15 15:16:12 +00001416 exts.append( Extension('zlib', ['zlibmodule.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001417 libraries = ['z'],
1418 extra_link_args = zlib_extra_link_args))
Gregory P. Smith440ca772008-03-24 00:08:01 +00001419 have_zlib = True
Skip Montanarod1287322007-03-06 15:41:38 +00001420 else:
1421 missing.append('zlib')
1422 else:
1423 missing.append('zlib')
1424 else:
1425 missing.append('zlib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001426
Gregory P. Smith440ca772008-03-24 00:08:01 +00001427 # Helper module for various ascii-encoders. Uses zlib for an optimized
1428 # crc32 if we have it. Otherwise binascii uses its own.
1429 if have_zlib:
1430 extra_compile_args = ['-DUSE_ZLIB_CRC32']
1431 libraries = ['z']
1432 extra_link_args = zlib_extra_link_args
1433 else:
1434 extra_compile_args = []
1435 libraries = []
1436 extra_link_args = []
1437 exts.append( Extension('binascii', ['binascii.c'],
1438 extra_compile_args = extra_compile_args,
1439 libraries = libraries,
1440 extra_link_args = extra_link_args) )
1441
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001442 # Gustavo Niemeyer's bz2 module.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001443 if (self.compiler.find_library_file(lib_dirs, 'bz2')):
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001444 if host_platform == "darwin":
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001445 bz2_extra_link_args = ('-Wl,-search_paths_first',)
1446 else:
1447 bz2_extra_link_args = ()
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001448 exts.append( Extension('bz2', ['bz2module.c'],
Ronald Oussoren9b8b6192006-06-27 12:53:52 +00001449 libraries = ['bz2'],
1450 extra_link_args = bz2_extra_link_args) )
Skip Montanarod1287322007-03-06 15:41:38 +00001451 else:
1452 missing.append('bz2')
Gustavo Niemeyerf8ca8362002-11-05 16:50:05 +00001453
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001454 # Interface to the Expat XML parser
1455 #
Benjamin Peterson2fd2e862009-12-31 16:28:24 +00001456 # Expat was written by James Clark and is now maintained by a group of
1457 # developers on SourceForge; see www.libexpat.org for more information.
1458 # The pyexpat module was written by Paul Prescod after a prototype by
1459 # Jack Jansen. The Expat source is included in Modules/expat/. Usage
1460 # of a system shared libexpat.so is possible with --with-system-expat
Benjamin Peterson206e10c2010-10-31 16:40:21 +00001461 # configure option.
Fred Drakefc8341d2002-06-17 17:55:30 +00001462 #
1463 # More information on Expat can be found at www.libexpat.org.
1464 #
Benjamin Peterson2c196742009-12-31 03:17:18 +00001465 if '--with-system-expat' in sysconfig.get_config_var("CONFIG_ARGS"):
1466 expat_inc = []
1467 define_macros = []
1468 expat_lib = ['expat']
1469 expat_sources = []
Christian Heimes56656b02013-02-09 17:02:06 +01001470 expat_depends = []
Benjamin Peterson2c196742009-12-31 03:17:18 +00001471 else:
1472 expat_inc = [os.path.join(os.getcwd(), srcdir, 'Modules', 'expat')]
1473 define_macros = [
1474 ('HAVE_EXPAT_CONFIG_H', '1'),
1475 ]
1476 expat_lib = []
1477 expat_sources = ['expat/xmlparse.c',
1478 'expat/xmlrole.c',
1479 'expat/xmltok.c']
Christian Heimes56656b02013-02-09 17:02:06 +01001480 expat_depends = ['expat/ascii.h',
1481 'expat/asciitab.h',
1482 'expat/expat.h',
1483 'expat/expat_config.h',
1484 'expat/expat_external.h',
1485 'expat/internal.h',
1486 'expat/latin1tab.h',
1487 'expat/utf8tab.h',
1488 'expat/xmlrole.h',
1489 'expat/xmltok.h',
1490 'expat/xmltok_impl.h'
1491 ]
Ronald Oussoren988117f2006-04-29 11:31:35 +00001492
Fred Drake2d59a492003-10-21 15:41:15 +00001493 exts.append(Extension('pyexpat',
1494 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001495 include_dirs = expat_inc,
1496 libraries = expat_lib,
Christian Heimes56656b02013-02-09 17:02:06 +01001497 sources = ['pyexpat.c'] + expat_sources,
1498 depends = expat_depends,
Fred Drake2d59a492003-10-21 15:41:15 +00001499 ))
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001500
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001501 # Fredrik Lundh's cElementTree module. Note that this also
1502 # uses expat (via the CAPI hook in pyexpat).
1503
Hye-Shik Chang6c403592006-03-27 08:43:11 +00001504 if os.path.isfile(os.path.join(srcdir, 'Modules', '_elementtree.c')):
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001505 define_macros.append(('USE_PYEXPAT_CAPI', None))
1506 exts.append(Extension('_elementtree',
1507 define_macros = define_macros,
Benjamin Peterson2c196742009-12-31 03:17:18 +00001508 include_dirs = expat_inc,
1509 libraries = expat_lib,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001510 sources = ['_elementtree.c'],
Christian Heimes56656b02013-02-09 17:02:06 +01001511 depends = ['pyexpat.c'] + expat_sources +
1512 expat_depends,
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001513 ))
Skip Montanarod1287322007-03-06 15:41:38 +00001514 else:
1515 missing.append('_elementtree')
Fredrik Lundh4c86ec62005-12-14 18:46:16 +00001516
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001517 # Hye-Shik Chang's CJKCodecs modules.
Martin v. Löwise2713be2005-03-08 15:03:08 +00001518 if have_unicode:
1519 exts.append(Extension('_multibytecodec',
1520 ['cjkcodecs/multibytecodec.c']))
1521 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
Skip Montanarod1287322007-03-06 15:41:38 +00001522 exts.append(Extension('_codecs_%s' % loc,
Martin v. Löwise2713be2005-03-08 15:03:08 +00001523 ['cjkcodecs/_codecs_%s.c' % loc]))
Skip Montanarod1287322007-03-06 15:41:38 +00001524 else:
1525 missing.append('_multibytecodec')
1526 for loc in ('kr', 'jp', 'cn', 'tw', 'hk', 'iso2022'):
1527 missing.append('_codecs_%s' % loc)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001528
Michael W. Hudson5b109102002-01-23 15:04:41 +00001529 # Dynamic loading module
Guido van Rossum770acd32002-09-12 14:41:20 +00001530 if sys.maxint == 0x7fffffff:
1531 # This requires sizeof(int) == sizeof(long) == sizeof(char*)
1532 dl_inc = find_file('dlfcn.h', [], inc_dirs)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001533 if (dl_inc is not None) and (host_platform not in ['atheos']):
Guido van Rossum770acd32002-09-12 14:41:20 +00001534 exts.append( Extension('dl', ['dlmodule.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001535 else:
1536 missing.append('dl')
1537 else:
1538 missing.append('dl')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001539
Thomas Hellercf567c12006-03-08 19:51:58 +00001540 # Thomas Heller's _ctypes module
Martin v. Löwis9176fc12006-04-11 11:12:43 +00001541 self.detect_ctypes(inc_dirs, lib_dirs)
Thomas Hellercf567c12006-03-08 19:51:58 +00001542
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001543 # Richard Oudkerk's multiprocessing module
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001544 if host_platform == 'win32': # Windows
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001545 macros = dict()
1546 libraries = ['ws2_32']
1547
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001548 elif host_platform == 'darwin': # Mac OSX
Jesse Noller355b1262009-04-02 00:03:28 +00001549 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001550 libraries = []
1551
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001552 elif host_platform == 'cygwin': # Cygwin
Jesse Noller355b1262009-04-02 00:03:28 +00001553 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001554 libraries = []
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001555
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001556 elif host_platform in ('freebsd4', 'freebsd5', 'freebsd6', 'freebsd7', 'freebsd8'):
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001557 # FreeBSD's P1003.1b semaphore support is very experimental
1558 # and has many known problems. (as of June 2008)
Jesse Noller355b1262009-04-02 00:03:28 +00001559 macros = dict()
Hye-Shik Chang99c48a82008-06-28 01:04:31 +00001560 libraries = []
1561
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001562 elif host_platform.startswith('openbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001563 macros = dict()
Jesse Noller37040cd2008-09-30 00:15:45 +00001564 libraries = []
1565
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001566 elif host_platform.startswith('netbsd'):
Jesse Noller355b1262009-04-02 00:03:28 +00001567 macros = dict()
Jesse Noller40a61642009-03-31 18:12:35 +00001568 libraries = []
1569
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001570 else: # Linux and other unices
Jesse Noller355b1262009-04-02 00:03:28 +00001571 macros = dict()
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001572 libraries = ['rt']
1573
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001574 if host_platform == 'win32':
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001575 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1576 '_multiprocessing/semaphore.c',
1577 '_multiprocessing/pipe_connection.c',
1578 '_multiprocessing/socket_connection.c',
1579 '_multiprocessing/win32_functions.c'
1580 ]
1581
1582 else:
1583 multiprocessing_srcs = [ '_multiprocessing/multiprocessing.c',
1584 '_multiprocessing/socket_connection.c'
1585 ]
Mark Dickinsonc4920e82009-11-20 19:30:22 +00001586 if (sysconfig.get_config_var('HAVE_SEM_OPEN') and not
Mark Dickinson5afa6d42009-11-28 10:44:20 +00001587 sysconfig.get_config_var('POSIX_SEMAPHORES_NOT_ENABLED')):
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001588 multiprocessing_srcs.append('_multiprocessing/semaphore.c')
1589
Jesse Nollerf6da8d12009-01-23 14:04:41 +00001590 if sysconfig.get_config_var('WITH_THREAD'):
1591 exts.append ( Extension('_multiprocessing', multiprocessing_srcs,
1592 define_macros=macros.items(),
1593 include_dirs=["Modules/_multiprocessing"]))
1594 else:
1595 missing.append('_multiprocessing')
1596
Benjamin Peterson190d56e2008-06-11 02:40:25 +00001597 # End multiprocessing
1598
1599
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001600 # Platform-specific libraries
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001601 if host_platform == 'linux2':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001602 # Linux-specific modules
1603 exts.append( Extension('linuxaudiodev', ['linuxaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001604 else:
1605 missing.append('linuxaudiodev')
Greg Ward0a6355e2003-01-08 01:37:41 +00001606
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001607 if (host_platform in ('linux2', 'freebsd4', 'freebsd5', 'freebsd6',
Matthias Klose8a96d202010-04-21 22:18:52 +00001608 'freebsd7', 'freebsd8')
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001609 or host_platform.startswith("gnukfreebsd")):
Guido van Rossum0c016a92003-02-13 16:12:21 +00001610 exts.append( Extension('ossaudiodev', ['ossaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001611 else:
1612 missing.append('ossaudiodev')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001613
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001614 if host_platform == 'sunos5':
Fredrik Lundhade711a2001-01-24 08:00:28 +00001615 # SunOS specific modules
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001616 exts.append( Extension('sunaudiodev', ['sunaudiodev.c']) )
Skip Montanarod1287322007-03-06 15:41:38 +00001617 else:
1618 missing.append('sunaudiodev')
Michael W. Hudson5b109102002-01-23 15:04:41 +00001619
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001620 if host_platform == 'darwin':
Ronald Oussorena5b642c2009-10-08 08:04:15 +00001621 # _scproxy
1622 exts.append(Extension("_scproxy", [os.path.join(srcdir, "Mac/Modules/_scproxy.c")],
1623 extra_link_args= [
1624 '-framework', 'SystemConfiguration',
1625 '-framework', 'CoreFoundation'
1626 ]))
1627
1628
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001629 if host_platform == 'darwin' and ("--disable-toolbox-glue" not in
Ronald Oussoren090f8152006-03-30 20:18:33 +00001630 sysconfig.get_config_var("CONFIG_ARGS")):
1631
Ronald Oussoren05b0d1d2010-03-08 07:06:47 +00001632 if int(os.uname()[2].split('.')[0]) >= 8:
Ronald Oussoren090f8152006-03-30 20:18:33 +00001633 # We're on Mac OS X 10.4 or later, the compiler should
1634 # support '-Wno-deprecated-declarations'. This will
1635 # surpress deprecation warnings for the Carbon extensions,
1636 # these extensions wrap the Carbon APIs and even those
1637 # parts that are deprecated.
1638 carbon_extra_compile_args = ['-Wno-deprecated-declarations']
1639 else:
1640 carbon_extra_compile_args = []
1641
Just van Rossum05ced6a2002-11-24 23:15:57 +00001642 # Mac OS X specific modules.
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001643 def macSrcExists(name1, name2=''):
1644 if not name1:
1645 return None
1646 names = (name1,)
1647 if name2:
1648 names = (name1, name2)
1649 path = os.path.join(srcdir, 'Mac', 'Modules', *names)
1650 return os.path.exists(path)
1651
1652 def addMacExtension(name, kwds, extra_srcs=[]):
1653 dirname = ''
1654 if name[0] == '_':
1655 dirname = name[1:].lower()
1656 cname = name + '.c'
1657 cmodulename = name + 'module.c'
1658 # Check for NNN.c, NNNmodule.c, _nnn/NNN.c, _nnn/NNNmodule.c
1659 if macSrcExists(cname):
1660 srcs = [cname]
1661 elif macSrcExists(cmodulename):
1662 srcs = [cmodulename]
1663 elif macSrcExists(dirname, cname):
1664 # XXX(nnorwitz): If all the names ended with module, we
1665 # wouldn't need this condition. ibcarbon is the only one.
1666 srcs = [os.path.join(dirname, cname)]
1667 elif macSrcExists(dirname, cmodulename):
1668 srcs = [os.path.join(dirname, cmodulename)]
1669 else:
1670 raise RuntimeError("%s not found" % name)
1671
1672 # Here's the whole point: add the extension with sources
1673 exts.append(Extension(name, srcs + extra_srcs, **kwds))
1674
1675 # Core Foundation
1676 core_kwds = {'extra_compile_args': carbon_extra_compile_args,
1677 'extra_link_args': ['-framework', 'CoreFoundation'],
1678 }
1679 addMacExtension('_CF', core_kwds, ['cf/pycfbridge.c'])
1680 addMacExtension('autoGIL', core_kwds)
1681
Ronald Oussoren51f06332009-09-20 10:31:22 +00001682
1683
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001684 # Carbon
1685 carbon_kwds = {'extra_compile_args': carbon_extra_compile_args,
1686 'extra_link_args': ['-framework', 'Carbon'],
1687 }
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001688 CARBON_EXTS = ['ColorPicker', 'gestalt', 'MacOS', 'Nav',
1689 'OSATerminology', 'icglue',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001690 # All these are in subdirs
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001691 '_AE', '_AH', '_App', '_CarbonEvt', '_Cm', '_Ctl',
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001692 '_Dlg', '_Drag', '_Evt', '_File', '_Folder', '_Fm',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001693 '_Help', '_Icn', '_IBCarbon', '_List',
1694 '_Menu', '_Mlte', '_OSA', '_Res', '_Qd', '_Qdoffs',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001695 '_Scrap', '_Snd', '_TE',
Anthony Baxtera2a26b92006-04-05 17:30:38 +00001696 ]
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001697 for name in CARBON_EXTS:
1698 addMacExtension(name, carbon_kwds)
1699
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001700 # Workaround for a bug in the version of gcc shipped with Xcode 3.
1701 # The _Win extension should build just like the other Carbon extensions, but
1702 # this actually results in a hard crash of the linker.
1703 #
1704 if '-arch ppc64' in cflags and '-arch ppc' in cflags:
1705 win_kwds = {'extra_compile_args': carbon_extra_compile_args + ['-arch', 'i386', '-arch', 'ppc'],
1706 'extra_link_args': ['-framework', 'Carbon', '-arch', 'i386', '-arch', 'ppc'],
1707 }
1708 addMacExtension('_Win', win_kwds)
1709 else:
1710 addMacExtension('_Win', carbon_kwds)
1711
1712
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001713 # Application Services & QuickTime
1714 app_kwds = {'extra_compile_args': carbon_extra_compile_args,
1715 'extra_link_args': ['-framework','ApplicationServices'],
1716 }
1717 addMacExtension('_Launch', app_kwds)
1718 addMacExtension('_CG', app_kwds)
1719
Just van Rossum05ced6a2002-11-24 23:15:57 +00001720 exts.append( Extension('_Qt', ['qt/_Qtmodule.c'],
Ronald Oussoren090f8152006-03-30 20:18:33 +00001721 extra_compile_args=carbon_extra_compile_args,
1722 extra_link_args=['-framework', 'QuickTime',
Just van Rossum05ced6a2002-11-24 23:15:57 +00001723 '-framework', 'Carbon']) )
Neal Norwitz3e1ec3a2006-04-03 04:52:05 +00001724
Michael W. Hudson5b109102002-01-23 15:04:41 +00001725
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001726 self.extensions.extend(exts)
1727
1728 # Call the method for detecting whether _tkinter can be compiled
1729 self.detect_tkinter(inc_dirs, lib_dirs)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001730
Skip Montanarod1287322007-03-06 15:41:38 +00001731 if '_tkinter' not in [e.name for e in self.extensions]:
1732 missing.append('_tkinter')
1733
Georg Brandl28523642013-10-13 23:38:44 +02001734## # Uncomment these lines if you want to play with xxmodule.c
1735## ext = Extension('xx', ['xxmodule.c'])
1736## self.extensions.append(ext)
1737
Skip Montanarod1287322007-03-06 15:41:38 +00001738 return missing
1739
Ned Deilya2a9f572013-10-25 00:30:10 -07001740 def detect_tkinter_explicitly(self):
1741 # Build _tkinter using explicit locations for Tcl/Tk.
1742 #
1743 # This is enabled when both arguments are given to ./configure:
1744 #
1745 # --with-tcltk-includes="-I/path/to/tclincludes \
1746 # -I/path/to/tkincludes"
1747 # --with-tcltk-libs="-L/path/to/tcllibs -ltclm.n \
1748 # -L/path/to/tklibs -ltkm.n"
1749 #
1750 # These values can also be specified or overriden via make:
1751 # make TCLTK_INCLUDES="..." TCLTK_LIBS="..."
1752 #
1753 # This can be useful for building and testing tkinter with multiple
1754 # versions of Tcl/Tk. Note that a build of Tk depends on a particular
1755 # build of Tcl so you need to specify both arguments and use care when
1756 # overriding.
1757
1758 # The _TCLTK variables are created in the Makefile sharedmods target.
1759 tcltk_includes = os.environ.get('_TCLTK_INCLUDES')
1760 tcltk_libs = os.environ.get('_TCLTK_LIBS')
1761 if not (tcltk_includes and tcltk_libs):
1762 # Resume default configuration search.
1763 return 0
1764
1765 extra_compile_args = tcltk_includes.split()
1766 extra_link_args = tcltk_libs.split()
1767 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1768 define_macros=[('WITH_APPINIT', 1)],
1769 extra_compile_args = extra_compile_args,
1770 extra_link_args = extra_link_args,
1771 )
1772 self.extensions.append(ext)
1773 return 1
1774
Jack Jansen0b06be72002-06-21 14:48:38 +00001775 def detect_tkinter_darwin(self, inc_dirs, lib_dirs):
1776 # The _tkinter module, using frameworks. Since frameworks are quite
1777 # different the UNIX search logic is not sharable.
1778 from os.path import join, exists
1779 framework_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001780 '/Library/Frameworks',
Ronald Oussorencea1ddb2009-03-04 21:30:12 +00001781 '/System/Library/Frameworks/',
Jack Jansen0b06be72002-06-21 14:48:38 +00001782 join(os.getenv('HOME'), '/Library/Frameworks')
1783 ]
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001784
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001785 sysroot = macosx_sdk_root()
1786
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001787 # Find the directory that contains the Tcl.framework and Tk.framework
Jack Jansen0b06be72002-06-21 14:48:38 +00001788 # bundles.
1789 # XXX distutils should support -F!
1790 for F in framework_dirs:
Tim Peters2c60f7a2003-01-29 03:49:43 +00001791 # both Tcl.framework and Tk.framework should be present
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001792
1793
Jack Jansen0b06be72002-06-21 14:48:38 +00001794 for fw in 'Tcl', 'Tk':
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001795 if is_macosx_sdk_path(F):
1796 if not exists(join(sysroot, F[1:], fw + '.framework')):
1797 break
1798 else:
1799 if not exists(join(F, fw + '.framework')):
1800 break
Jack Jansen0b06be72002-06-21 14:48:38 +00001801 else:
1802 # ok, F is now directory with both frameworks. Continure
1803 # building
1804 break
1805 else:
1806 # Tk and Tcl frameworks not found. Normal "unix" tkinter search
1807 # will now resume.
1808 return 0
Tim Peters2c60f7a2003-01-29 03:49:43 +00001809
Jack Jansen0b06be72002-06-21 14:48:38 +00001810 # For 8.4a2, we must add -I options that point inside the Tcl and Tk
1811 # frameworks. In later release we should hopefully be able to pass
Tim Peters2c60f7a2003-01-29 03:49:43 +00001812 # the -F option to gcc, which specifies a framework lookup path.
Jack Jansen0b06be72002-06-21 14:48:38 +00001813 #
1814 include_dirs = [
Tim Peters2c60f7a2003-01-29 03:49:43 +00001815 join(F, fw + '.framework', H)
Jack Jansen0b06be72002-06-21 14:48:38 +00001816 for fw in 'Tcl', 'Tk'
1817 for H in 'Headers', 'Versions/Current/PrivateHeaders'
1818 ]
1819
Tim Peters2c60f7a2003-01-29 03:49:43 +00001820 # For 8.4a2, the X11 headers are not included. Rather than include a
Jack Jansen0b06be72002-06-21 14:48:38 +00001821 # complicated search, this is a hard-coded path. It could bail out
1822 # if X11 libs are not found...
1823 include_dirs.append('/usr/X11R6/include')
1824 frameworks = ['-framework', 'Tcl', '-framework', 'Tk']
1825
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001826 # All existing framework builds of Tcl/Tk don't support 64-bit
1827 # architectures.
1828 cflags = sysconfig.get_config_vars('CFLAGS')[0]
1829 archs = re.findall('-arch\s+(\w+)', cflags)
Ronald Oussoren593e4ca2010-06-03 09:47:21 +00001830
1831 if is_macosx_sdk_path(F):
1832 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(os.path.join(sysroot, F[1:]),))
1833 else:
1834 fp = os.popen("file %s/Tk.framework/Tk | grep 'for architecture'"%(F,))
1835
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001836 detected_archs = []
1837 for ln in fp:
1838 a = ln.split()[-1]
1839 if a in archs:
1840 detected_archs.append(ln.split()[-1])
1841 fp.close()
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001842
Ronald Oussoren91a11a42009-09-15 18:33:33 +00001843 for a in detected_archs:
1844 frameworks.append('-arch')
1845 frameworks.append(a)
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001846
Jack Jansen0b06be72002-06-21 14:48:38 +00001847 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1848 define_macros=[('WITH_APPINIT', 1)],
1849 include_dirs = include_dirs,
1850 libraries = [],
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001851 extra_compile_args = frameworks[2:],
Jack Jansen0b06be72002-06-21 14:48:38 +00001852 extra_link_args = frameworks,
1853 )
1854 self.extensions.append(ext)
1855 return 1
1856
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001857 def detect_tkinter(self, inc_dirs, lib_dirs):
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001858 # The _tkinter module.
Michael W. Hudson5b109102002-01-23 15:04:41 +00001859
Ned Deilya2a9f572013-10-25 00:30:10 -07001860 # Check whether --with-tcltk-includes and --with-tcltk-libs were
1861 # configured or passed into the make target. If so, use these values
1862 # to build tkinter and bypass the searches for Tcl and TK in standard
1863 # locations.
1864 if self.detect_tkinter_explicitly():
1865 return
1866
Jack Jansen0b06be72002-06-21 14:48:38 +00001867 # Rather than complicate the code below, detecting and building
1868 # AquaTk is a separate method. Only one Tkinter will be built on
1869 # Darwin - either AquaTk, if it is found, or X11 based Tk.
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001870 if (host_platform == 'darwin' and
Skip Montanaro0174ddd2005-12-30 05:01:26 +00001871 self.detect_tkinter_darwin(inc_dirs, lib_dirs)):
Tim Peters2c60f7a2003-01-29 03:49:43 +00001872 return
Jack Jansen0b06be72002-06-21 14:48:38 +00001873
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001874 # Assume we haven't found any of the libraries or include files
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001875 # The versions with dots are used on Unix, and the versions without
1876 # dots on Windows, for detection by cygwin.
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001877 tcllib = tklib = tcl_includes = tk_includes = None
Guilherme Polofb118352009-08-16 14:34:26 +00001878 for version in ['8.6', '86', '8.5', '85', '8.4', '84', '8.3', '83',
1879 '8.2', '82', '8.1', '81', '8.0', '80']:
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001880 tklib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001881 'tk' + version)
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001882 tcllib = self.compiler.find_library_file(lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001883 'tcl' + version)
Michael W. Hudson5b109102002-01-23 15:04:41 +00001884 if tklib and tcllib:
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001885 # Exit the loop when we've found the Tcl/Tk libraries
1886 break
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001887
Fredrik Lundhade711a2001-01-24 08:00:28 +00001888 # Now check for the header files
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001889 if tklib and tcllib:
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001890 # Check for the include files on Debian and {Free,Open}BSD, where
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001891 # they're put in /usr/include/{tcl,tk}X.Y
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001892 dotversion = version
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001893 if '.' not in dotversion and "bsd" in host_platform.lower():
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001894 # OpenBSD and FreeBSD use Tcl/Tk library names like libtcl83.a,
1895 # but the include subdirs are named like .../include/tcl8.3.
1896 dotversion = dotversion[:-1] + '.' + dotversion[-1]
1897 tcl_include_sub = []
1898 tk_include_sub = []
1899 for dir in inc_dirs:
1900 tcl_include_sub += [dir + os.sep + "tcl" + dotversion]
1901 tk_include_sub += [dir + os.sep + "tk" + dotversion]
1902 tk_include_sub += tcl_include_sub
1903 tcl_includes = find_file('tcl.h', inc_dirs, tcl_include_sub)
1904 tk_includes = find_file('tk.h', inc_dirs, tk_include_sub)
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001905
Martin v. Löwise86a59a2003-05-03 08:45:51 +00001906 if (tcllib is None or tklib is None or
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001907 tcl_includes is None or tk_includes is None):
Andrew M. Kuchling3c0aa7e2004-03-21 18:57:35 +00001908 self.announce("INFO: Can't locate Tcl/Tk libs and/or headers", 2)
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001909 return
Fredrik Lundhade711a2001-01-24 08:00:28 +00001910
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001911 # OK... everything seems to be present for Tcl/Tk.
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001912
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001913 include_dirs = [] ; libs = [] ; defs = [] ; added_lib_dirs = []
1914 for dir in tcl_includes + tk_includes:
1915 if dir not in include_dirs:
1916 include_dirs.append(dir)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001917
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001918 # Check for various platform-specific directories
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001919 if host_platform == 'sunos5':
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001920 include_dirs.append('/usr/openwin/include')
1921 added_lib_dirs.append('/usr/openwin/lib')
1922 elif os.path.exists('/usr/X11R6/include'):
1923 include_dirs.append('/usr/X11R6/include')
Martin v. Löwisfba73692004-11-13 11:13:35 +00001924 added_lib_dirs.append('/usr/X11R6/lib64')
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001925 added_lib_dirs.append('/usr/X11R6/lib')
1926 elif os.path.exists('/usr/X11R5/include'):
1927 include_dirs.append('/usr/X11R5/include')
1928 added_lib_dirs.append('/usr/X11R5/lib')
1929 else:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001930 # Assume default location for X11
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001931 include_dirs.append('/usr/X11/include')
1932 added_lib_dirs.append('/usr/X11/lib')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001933
Jason Tishler9181c942003-02-05 15:16:17 +00001934 # If Cygwin, then verify that X is installed before proceeding
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001935 if host_platform == 'cygwin':
Jason Tishler9181c942003-02-05 15:16:17 +00001936 x11_inc = find_file('X11/Xlib.h', [], include_dirs)
1937 if x11_inc is None:
1938 return
1939
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001940 # Check for BLT extension
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001941 if self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001942 'BLT8.0'):
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001943 defs.append( ('WITH_BLT', 1) )
1944 libs.append('BLT8.0')
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001945 elif self.compiler.find_library_file(lib_dirs + added_lib_dirs,
Tarek Ziadée670e5a2009-07-06 12:50:46 +00001946 'BLT'):
Martin v. Löwis427a2902002-12-12 20:23:38 +00001947 defs.append( ('WITH_BLT', 1) )
1948 libs.append('BLT')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001949
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001950 # Add the Tcl/Tk libraries
Jason Tishlercccac1a2003-02-05 15:06:46 +00001951 libs.append('tk'+ version)
1952 libs.append('tcl'+ version)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001953
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001954 if host_platform in ['aix3', 'aix4']:
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001955 libs.append('ld')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001956
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001957 # Finally, link with the X11 libraries (not appropriate on cygwin)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01001958 if host_platform != "cygwin":
Martin v. Löwis3db5b8c2001-07-24 06:54:01 +00001959 libs.append('X11')
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001960
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001961 ext = Extension('_tkinter', ['_tkinter.c', 'tkappinit.c'],
1962 define_macros=[('WITH_APPINIT', 1)] + defs,
1963 include_dirs = include_dirs,
1964 libraries = libs,
1965 library_dirs = added_lib_dirs,
1966 )
1967 self.extensions.append(ext)
Fredrik Lundhade711a2001-01-24 08:00:28 +00001968
Andrew M. Kuchlingfbe73762001-01-18 18:44:20 +00001969 # XXX handle these, but how to detect?
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001970 # *** Uncomment and edit for PIL (TkImaging) extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001971 # -DWITH_PIL -I../Extensions/Imaging/libImaging tkImaging.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001972 # *** Uncomment and edit for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001973 # -DWITH_TOGL togl.c \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001974 # *** Uncomment these for TOGL extension only:
Fredrik Lundhade711a2001-01-24 08:00:28 +00001975 # -lGL -lGLU -lXext -lXmu \
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00001976
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001977 def configure_ctypes_darwin(self, ext):
1978 # Darwin (OS X) uses preconfigured files, in
1979 # the Modules/_ctypes/libffi_osx directory.
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00001980 srcdir = sysconfig.get_config_var('srcdir')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001981 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
1982 '_ctypes', 'libffi_osx'))
1983 sources = [os.path.join(ffi_srcdir, p)
1984 for p in ['ffi.c',
Ronald Oussoren5640ce22008-06-05 12:58:24 +00001985 'x86/darwin64.S',
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001986 'x86/x86-darwin.S',
1987 'x86/x86-ffi_darwin.c',
1988 'x86/x86-ffi64.c',
1989 'powerpc/ppc-darwin.S',
1990 'powerpc/ppc-darwin_closure.S',
1991 'powerpc/ppc-ffi_darwin.c',
1992 'powerpc/ppc64-darwin_closure.S',
1993 ]]
1994
1995 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00001996 self.compiler.src_extensions.append('.S')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00001997
1998 include_dirs = [os.path.join(ffi_srcdir, 'include'),
1999 os.path.join(ffi_srcdir, 'powerpc')]
2000 ext.include_dirs.extend(include_dirs)
2001 ext.sources.extend(sources)
2002 return True
2003
Thomas Hellereba43c12006-04-07 19:04:09 +00002004 def configure_ctypes(self, ext):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002005 if not self.use_system_libffi:
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002006 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002007 return self.configure_ctypes_darwin(ext)
2008
Neil Schemenauerc59c5f32009-02-05 16:32:29 +00002009 srcdir = sysconfig.get_config_var('srcdir')
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002010 ffi_builddir = os.path.join(self.build_temp, 'libffi')
2011 ffi_srcdir = os.path.abspath(os.path.join(srcdir, 'Modules',
2012 '_ctypes', 'libffi'))
2013 ffi_configfile = os.path.join(ffi_builddir, 'fficonfig.py')
Thomas Hellercf567c12006-03-08 19:51:58 +00002014
Thomas Heller5e218b42006-04-27 15:50:42 +00002015 from distutils.dep_util import newer_group
2016
2017 config_sources = [os.path.join(ffi_srcdir, fname)
Martin v. Löwisf1a4aa32007-02-14 11:30:56 +00002018 for fname in os.listdir(ffi_srcdir)
2019 if os.path.isfile(os.path.join(ffi_srcdir, fname))]
Thomas Heller5e218b42006-04-27 15:50:42 +00002020 if self.force or newer_group(config_sources,
2021 ffi_configfile):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002022 from distutils.dir_util import mkpath
2023 mkpath(ffi_builddir)
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002024 config_args = [arg for arg in sysconfig.get_config_var("CONFIG_ARGS").split()
2025 if (('--host=' in arg) or ('--build=' in arg))]
Christian Heimes6fd32482012-09-06 18:02:49 +02002026 if not self.verbose:
2027 config_args.append("-q")
Thomas Hellercf567c12006-03-08 19:51:58 +00002028
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002029 # Pass empty CFLAGS because we'll just append the resulting
2030 # CFLAGS to Python's; -g or -O2 is to be avoided.
2031 cmd = "cd %s && env CFLAGS='' '%s/configure' %s" \
2032 % (ffi_builddir, ffi_srcdir, " ".join(config_args))
Thomas Hellercf567c12006-03-08 19:51:58 +00002033
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002034 res = os.system(cmd)
2035 if res or not os.path.exists(ffi_configfile):
2036 print "Failed to configure _ctypes module"
2037 return False
Thomas Hellercf567c12006-03-08 19:51:58 +00002038
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002039 fficonfig = {}
Antoine Pitrou1379b842010-01-13 11:57:42 +00002040 with open(ffi_configfile) as f:
2041 exec f in fficonfig
Thomas Hellercf567c12006-03-08 19:51:58 +00002042
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002043 # Add .S (preprocessed assembly) to C compiler source extensions.
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002044 self.compiler.src_extensions.append('.S')
Thomas Hellercf567c12006-03-08 19:51:58 +00002045
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002046 include_dirs = [os.path.join(ffi_builddir, 'include'),
Antoine Pitrou8c510e72010-01-13 11:47:49 +00002047 ffi_builddir,
2048 os.path.join(ffi_srcdir, 'src')]
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002049 extra_compile_args = fficonfig['ffi_cflags'].split()
Thomas Hellereba43c12006-04-07 19:04:09 +00002050
Antoine Pitrou8c510e72010-01-13 11:47:49 +00002051 ext.sources.extend(os.path.join(ffi_srcdir, f) for f in
2052 fficonfig['ffi_sources'])
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002053 ext.include_dirs.extend(include_dirs)
2054 ext.extra_compile_args.extend(extra_compile_args)
Thomas Heller795246c2006-04-07 19:27:56 +00002055 return True
Thomas Hellereba43c12006-04-07 19:04:09 +00002056
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002057 def detect_ctypes(self, inc_dirs, lib_dirs):
2058 self.use_system_libffi = False
Thomas Hellereba43c12006-04-07 19:04:09 +00002059 include_dirs = []
2060 extra_compile_args = []
Thomas Heller17984892006-08-04 18:57:34 +00002061 extra_link_args = []
Thomas Hellercf567c12006-03-08 19:51:58 +00002062 sources = ['_ctypes/_ctypes.c',
2063 '_ctypes/callbacks.c',
2064 '_ctypes/callproc.c',
2065 '_ctypes/stgdict.c',
Thomas Heller001d3a12010-08-08 17:56:41 +00002066 '_ctypes/cfield.c']
Thomas Hellercf567c12006-03-08 19:51:58 +00002067 depends = ['_ctypes/ctypes.h']
2068
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002069 if host_platform == 'darwin':
Ronald Oussoren30a171f2010-09-16 11:35:07 +00002070 sources.append('_ctypes/malloc_closure.c')
Thomas Hellercf567c12006-03-08 19:51:58 +00002071 sources.append('_ctypes/darwin/dlfcn_simple.c')
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002072 extra_compile_args.append('-DMACOSX')
Thomas Hellercf567c12006-03-08 19:51:58 +00002073 include_dirs.append('_ctypes/darwin')
2074# XXX Is this still needed?
2075## extra_link_args.extend(['-read_only_relocs', 'warning'])
2076
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002077 elif host_platform == 'sunos5':
Martin v. Löwis73f12a32006-08-09 23:42:18 +00002078 # XXX This shouldn't be necessary; it appears that some
2079 # of the assembler code is non-PIC (i.e. it has relocations
2080 # when it shouldn't. The proper fix would be to rewrite
2081 # the assembler code to be PIC.
2082 # This only works with GCC; the Sun compiler likely refuses
2083 # this option. If you want to compile ctypes with the Sun
2084 # compiler, please research a proper solution, instead of
2085 # finding some -z option for the Sun compiler.
Thomas Heller17984892006-08-04 18:57:34 +00002086 extra_link_args.append('-mimpure-text')
2087
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002088 elif host_platform.startswith('hp-ux'):
Thomas Heller03b75dd2008-05-20 19:53:47 +00002089 extra_link_args.append('-fPIC')
2090
Thomas Hellercf567c12006-03-08 19:51:58 +00002091 ext = Extension('_ctypes',
2092 include_dirs=include_dirs,
2093 extra_compile_args=extra_compile_args,
Thomas Heller17984892006-08-04 18:57:34 +00002094 extra_link_args=extra_link_args,
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002095 libraries=[],
Thomas Hellercf567c12006-03-08 19:51:58 +00002096 sources=sources,
2097 depends=depends)
2098 ext_test = Extension('_ctypes_test',
2099 sources=['_ctypes/_ctypes_test.c'])
2100 self.extensions.extend([ext, ext_test])
2101
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002102 if not '--with-system-ffi' in sysconfig.get_config_var("CONFIG_ARGS"):
2103 return
2104
doko@python.orgd65e2ba2013-01-31 23:52:03 +01002105 if host_platform == 'darwin':
Thomas Heller8bdf81d2008-03-04 20:09:11 +00002106 # OS X 10.5 comes with libffi.dylib; the include files are
2107 # in /usr/include/ffi
2108 inc_dirs.append('/usr/include/ffi')
2109
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002110 ffi_inc = [sysconfig.get_config_var("LIBFFI_INCLUDEDIR")]
Matthias Kloseca6d9e92010-04-21 21:45:30 +00002111 if not ffi_inc or ffi_inc[0] == '':
Benjamin Peterson1c335e62010-01-01 15:16:29 +00002112 ffi_inc = find_file('ffi.h', [], inc_dirs)
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002113 if ffi_inc is not None:
2114 ffi_h = ffi_inc[0] + '/ffi.h'
2115 fp = open(ffi_h)
2116 while 1:
2117 line = fp.readline()
2118 if not line:
2119 ffi_inc = None
2120 break
2121 if line.startswith('#define LIBFFI_H'):
2122 break
2123 ffi_lib = None
2124 if ffi_inc is not None:
2125 for lib_name in ('ffi_convenience', 'ffi_pic', 'ffi'):
Tarek Ziadé35a3f572010-03-05 00:29:38 +00002126 if (self.compiler.find_library_file(lib_dirs, lib_name)):
Martin v. Löwis9176fc12006-04-11 11:12:43 +00002127 ffi_lib = lib_name
2128 break
2129
2130 if ffi_inc and ffi_lib:
2131 ext.include_dirs.extend(ffi_inc)
2132 ext.libraries.append(ffi_lib)
2133 self.use_system_libffi = True
2134
2135
Andrew M. Kuchlingf52d27e2001-05-21 20:29:27 +00002136class PyBuildInstall(install):
2137 # Suppress the warning about installation into the lib_dynload
2138 # directory, which is not in sys.path when running Python during
2139 # installation:
2140 def initialize_options (self):
2141 install.initialize_options(self)
2142 self.warn_dir=0
Michael W. Hudson5b109102002-01-23 15:04:41 +00002143
Michael W. Hudson529a5052002-12-17 16:47:17 +00002144class PyBuildInstallLib(install_lib):
2145 # Do exactly what install_lib does but make sure correct access modes get
2146 # set on installed directories and files. All installed files with get
2147 # mode 644 unless they are a shared library in which case they will get
2148 # mode 755. All installed directories will get mode 755.
2149
2150 so_ext = sysconfig.get_config_var("SO")
2151
2152 def install(self):
2153 outfiles = install_lib.install(self)
2154 self.set_file_modes(outfiles, 0644, 0755)
2155 self.set_dir_modes(self.install_dir, 0755)
2156 return outfiles
2157
2158 def set_file_modes(self, files, defaultMode, sharedLibMode):
2159 if not self.is_chmod_supported(): return
2160 if not files: return
2161
2162 for filename in files:
2163 if os.path.islink(filename): continue
2164 mode = defaultMode
2165 if filename.endswith(self.so_ext): mode = sharedLibMode
2166 log.info("changing mode of %s to %o", filename, mode)
2167 if not self.dry_run: os.chmod(filename, mode)
2168
2169 def set_dir_modes(self, dirname, mode):
2170 if not self.is_chmod_supported(): return
2171 os.path.walk(dirname, self.set_dir_modes_visitor, mode)
2172
2173 def set_dir_modes_visitor(self, mode, dirname, names):
2174 if os.path.islink(dirname): return
2175 log.info("changing mode of %s to %o", dirname, mode)
2176 if not self.dry_run: os.chmod(dirname, mode)
2177
2178 def is_chmod_supported(self):
2179 return hasattr(os, 'chmod')
2180
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002181SUMMARY = """
2182Python is an interpreted, interactive, object-oriented programming
2183language. It is often compared to Tcl, Perl, Scheme or Java.
2184
2185Python combines remarkable power with very clear syntax. It has
2186modules, classes, exceptions, very high level dynamic data types, and
2187dynamic typing. There are interfaces to many system calls and
2188libraries, as well as to various windowing systems (X11, Motif, Tk,
2189Mac, MFC). New built-in modules are easily written in C or C++. Python
2190is also usable as an extension language for applications that need a
2191programmable interface.
2192
2193The Python implementation is portable: it runs on many brands of UNIX,
2194on Windows, DOS, OS/2, Mac, Amiga... If your favorite system isn't
2195listed here, it may still be supported, if there's a C compiler for
2196it. Ask around on comp.lang.python -- or just try compiling Python
2197yourself.
2198"""
2199
2200CLASSIFIERS = """
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002201Development Status :: 6 - Mature
2202License :: OSI Approved :: Python Software Foundation License
2203Natural Language :: English
2204Programming Language :: C
2205Programming Language :: Python
2206Topic :: Software Development
2207"""
2208
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002209def main():
Andrew M. Kuchling62686692001-05-21 20:48:09 +00002210 # turn off warnings when deprecated modules are imported
2211 import warnings
2212 warnings.filterwarnings("ignore",category=DeprecationWarning)
Guido van Rossum14ee89c2003-02-20 02:52:04 +00002213 setup(# PyPI Metadata (PEP 301)
2214 name = "Python",
2215 version = sys.version.split()[0],
2216 url = "http://www.python.org/%s" % sys.version[:3],
2217 maintainer = "Guido van Rossum and the Python community",
2218 maintainer_email = "python-dev@python.org",
2219 description = "A high-level object-oriented programming language",
2220 long_description = SUMMARY.strip(),
2221 license = "PSF license",
2222 classifiers = filter(None, CLASSIFIERS.split("\n")),
2223 platforms = ["Many"],
2224
2225 # Build info
Michael W. Hudson529a5052002-12-17 16:47:17 +00002226 cmdclass = {'build_ext':PyBuildExt, 'install':PyBuildInstall,
2227 'install_lib':PyBuildInstallLib},
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002228 # The struct module is defined here, because build_ext won't be
2229 # called unless there's at least one extension module defined.
Bob Ippolito7ccc95a2006-05-23 19:11:34 +00002230 ext_modules=[Extension('_struct', ['_struct.c'])],
Andrew M. Kuchlingaece4272001-02-28 20:56:49 +00002231
2232 # Scripts to install
Skip Montanaro852f7992004-06-26 22:29:42 +00002233 scripts = ['Tools/scripts/pydoc', 'Tools/scripts/idle',
Martin v. Löwiscdbc9772008-03-24 12:57:53 +00002234 'Tools/scripts/2to3',
Skip Montanaro852f7992004-06-26 22:29:42 +00002235 'Lib/smtpd.py']
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002236 )
Fredrik Lundhade711a2001-01-24 08:00:28 +00002237
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002238# --install-platlib
2239if __name__ == '__main__':
Andrew M. Kuchling00e0f212001-01-17 15:23:23 +00002240 main()