blob: bb53315bcad7b46f0df33f6581e52c82058ba93b [file] [log] [blame]
Fred Drake70b014d2001-07-18 18:39:56 +00001"""Provide access to Python's configuration information. The specific
2configuration variables available depend heavily on the platform and
3configuration. The values may be retrieved using
4get_config_var(name), and the list of variables is available via
5get_config_vars().keys(). Additional convenience functions are also
6available.
Greg Ward1190ee31998-12-18 23:46:33 +00007
8Written by: Fred L. Drake, Jr.
9Email: <fdrake@acm.org>
Greg Ward1190ee31998-12-18 23:46:33 +000010"""
11
Greg Ward82d71ca2000-06-03 00:44:30 +000012__revision__ = "$Id$"
Greg Ward1190ee31998-12-18 23:46:33 +000013
Greg Ward9ddaaa11999-01-06 14:46:06 +000014import os
15import re
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +000016import string
Greg Ward9ddaaa11999-01-06 14:46:06 +000017import sys
Greg Ward1190ee31998-12-18 23:46:33 +000018
Guido van Rossumf8480a72006-03-15 23:08:13 +000019from distutils.errors import DistutilsPlatformError
Greg Warda0ca3f22000-02-02 00:05:14 +000020
Greg Ward879f0f12000-09-15 01:15:08 +000021# These are needed in a couple of spots, so just compute them once.
Greg Wardcf6bea32000-04-10 01:15:06 +000022PREFIX = os.path.normpath(sys.prefix)
23EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
Fred Drakec1ee39a2000-03-09 15:54:52 +000024
Christian Heimesd3fc07a42007-12-06 13:15:13 +000025# Path to the base directory of the project. On Windows the binary may
Trent Nelsonb27745f2008-03-19 06:28:24 +000026# live in project/PCBuild9. If we're dealing with an x64 Windows build,
27# it'll live in project/PCbuild/amd64.
Christian Heimesd3fc07a42007-12-06 13:15:13 +000028project_base = os.path.dirname(os.path.abspath(sys.executable))
29if os.name == "nt" and "pcbuild" in project_base[-8:].lower():
30 project_base = os.path.abspath(os.path.join(project_base, os.path.pardir))
Christian Heimes9a1d8ce2008-01-01 14:37:32 +000031# PC/VS7.1
32if os.name == "nt" and "\\pc\\v" in project_base[-10:].lower():
33 project_base = os.path.abspath(os.path.join(project_base, os.path.pardir,
34 os.path.pardir))
Trent Nelsonb27745f2008-03-19 06:28:24 +000035# PC/AMD64
36if os.name == "nt" and "\\pcbuild\\amd64" in project_base[-14:].lower():
37 project_base = os.path.abspath(os.path.join(project_base, os.path.pardir,
38 os.path.pardir))
Christian Heimesd3fc07a42007-12-06 13:15:13 +000039
Fred Drake16c8d702002-06-04 15:28:21 +000040# python_build: (Boolean) if true, we're either building Python or
41# building an extension with an un-installed Python, so we use
42# different (hard-wired) directories.
Christian Heimesc67a15d2007-12-14 23:42:36 +000043# Setup.local is available for Makefile builds including VPATH builds,
44# Setup.dist is available on Windows
Marc-André Lemburg2db7cd32008-02-05 14:50:40 +000045def _python_build():
46 for fn in ("Setup.dist", "Setup.local"):
47 if os.path.isfile(os.path.join(project_base, "Modules", fn)):
48 return True
49 return False
50python_build = _python_build()
Fred Drakec1ee39a2000-03-09 15:54:52 +000051
Fred Drakec916cdc2001-08-02 20:03:12 +000052
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000053def get_python_version():
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +000054 """Return a string containing the major and minor Python version,
55 leaving off the patchlevel. Sample return values could be '1.5'
56 or '2.2'.
57 """
58 return sys.version[:3]
59
60
Greg Wardd38e6f72000-04-10 01:17:49 +000061def get_python_inc(plat_specific=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000062 """Return the directory containing installed Python header files.
Fred Drakec1ee39a2000-03-09 15:54:52 +000063
64 If 'plat_specific' is false (the default), this is the path to the
65 non-platform-specific header files, i.e. Python.h and so on;
66 otherwise, this is the path to platform-specific header files
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000067 (namely pyconfig.h).
Fred Drakec1ee39a2000-03-09 15:54:52 +000068
Greg Wardd38e6f72000-04-10 01:17:49 +000069 If 'prefix' is supplied, use it instead of sys.prefix or
70 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakeb94b8492001-12-06 20:51:35 +000071 """
Greg Wardd38e6f72000-04-10 01:17:49 +000072 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000073 prefix = plat_specific and EXEC_PREFIX or PREFIX
Tarek Ziadé68ca24b2010-04-30 12:18:51 +000074
Greg Ward7d73b9e2000-03-09 03:16:05 +000075 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000076 if python_build:
Tarek Ziadé68ca24b2010-04-30 12:18:51 +000077 buildir = os.path.dirname(sys.executable)
Fred Drake16c8d702002-06-04 15:28:21 +000078 if plat_specific:
Tarek Ziadé68ca24b2010-04-30 12:18:51 +000079 # python.h is located in the buildir
80 inc_dir = buildir
Fred Drake16c8d702002-06-04 15:28:21 +000081 else:
Tarek Ziadé68ca24b2010-04-30 12:18:51 +000082 # the source dir is relative to the buildir
83 srcdir = os.path.abspath(os.path.join(buildir,
84 get_config_var('srcdir')))
85 # Include is located in the srcdir
86 inc_dir = os.path.join(srcdir, "Include")
Fred Drake16c8d702002-06-04 15:28:21 +000087 return inc_dir
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000088 return os.path.join(prefix, "include", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +000089 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000090 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000091 elif os.name == "mac":
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000092 if plat_specific:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000093 return os.path.join(prefix, "Mac", "Include")
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000094 else:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000095 return os.path.join(prefix, "Include")
Marc-André Lemburg2544f512002-01-31 18:56:00 +000096 elif os.name == "os2":
97 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000098 else:
Fred Drake70b014d2001-07-18 18:39:56 +000099 raise DistutilsPlatformError(
100 "I don't know where Python installs its C header files "
101 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000102
103
Greg Wardd38e6f72000-04-10 01:17:49 +0000104def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +0000105 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +0000106 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +0000107
Fred Drakec1ee39a2000-03-09 15:54:52 +0000108 If 'plat_specific' is true, return the directory containing
109 platform-specific modules, i.e. any module from a non-pure-Python
110 module distribution; otherwise, return the platform-shared library
111 directory. If 'standard_lib' is true, return the directory
112 containing standard Python library modules; otherwise, return the
113 directory for site-specific modules.
114
Greg Wardd38e6f72000-04-10 01:17:49 +0000115 If 'prefix' is supplied, use it instead of sys.prefix or
116 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +0000117 """
Greg Wardd38e6f72000-04-10 01:17:49 +0000118 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +0000119 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +0000120
Greg Ward7d73b9e2000-03-09 03:16:05 +0000121 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +0000122 libpython = os.path.join(prefix,
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +0000123 "lib", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +0000124 if standard_lib:
125 return libpython
126 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +0000127 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000128
129 elif os.name == "nt":
130 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000131 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000132 else:
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000133 if get_python_version() < "2.2":
Greg Wardf17efb92001-08-23 20:53:27 +0000134 return prefix
135 else:
Tarek Ziadé436eb082009-02-10 12:33:42 +0000136 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000137
138 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000139 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000140 if standard_lib:
Jack Jansen212a2e12001-09-04 12:01:49 +0000141 return os.path.join(prefix, "Lib", "lib-dynload")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000142 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000143 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000144 else:
145 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000146 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000147 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000148 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000149
150 elif os.name == "os2":
151 if standard_lib:
Tarek Ziadé436eb082009-02-10 12:33:42 +0000152 return os.path.join(prefix, "Lib")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000153 else:
Tarek Ziadé436eb082009-02-10 12:33:42 +0000154 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000155
Greg Ward7d73b9e2000-03-09 03:16:05 +0000156 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000157 raise DistutilsPlatformError(
158 "I don't know where Python installs its library "
159 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000160
Greg Ward7d73b9e2000-03-09 03:16:05 +0000161
Fred Drake70b014d2001-07-18 18:39:56 +0000162def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000163 """Do any platform-specific customization of a CCompiler instance.
164
165 Mainly needed on Unix, so we can plug in the information that
166 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000167 """
168 if compiler.compiler_type == "unix":
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000169 (cc, cxx, opt, cflags, ccshared, ldshared, so_ext) = \
Tim Petersfffc4b72005-05-18 02:18:09 +0000170 get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
Brett Cannon08cd5982005-04-24 22:26:38 +0000171 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000172
Guido van Rossum8bc09652008-02-21 18:18:37 +0000173 if 'CC' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000174 cc = os.environ['CC']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000175 if 'CXX' in os.environ:
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000176 cxx = os.environ['CXX']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000177 if 'LDSHARED' in os.environ:
Anthony Baxter22dcf662004-10-13 15:54:17 +0000178 ldshared = os.environ['LDSHARED']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000179 if 'CPP' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000180 cpp = os.environ['CPP']
181 else:
182 cpp = cc + " -E" # not always
Guido van Rossum8bc09652008-02-21 18:18:37 +0000183 if 'LDFLAGS' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000184 ldshared = ldshared + ' ' + os.environ['LDFLAGS']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000185 if 'CFLAGS' in os.environ:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000186 cflags = opt + ' ' + os.environ['CFLAGS']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000187 ldshared = ldshared + ' ' + os.environ['CFLAGS']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000188 if 'CPPFLAGS' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000189 cpp = cpp + ' ' + os.environ['CPPFLAGS']
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000190 cflags = cflags + ' ' + os.environ['CPPFLAGS']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000191 ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
192
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000193 cc_cmd = cc + ' ' + cflags
Greg Ward879f0f12000-09-15 01:15:08 +0000194 compiler.set_executables(
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000195 preprocessor=cpp,
Greg Ward879f0f12000-09-15 01:15:08 +0000196 compiler=cc_cmd,
197 compiler_so=cc_cmd + ' ' + ccshared,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000198 compiler_cxx=cxx,
Greg Ward879f0f12000-09-15 01:15:08 +0000199 linker_so=ldshared,
200 linker_exe=cc)
201
202 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000203
204
Greg Ward9ddaaa11999-01-06 14:46:06 +0000205def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000206 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000207 if python_build:
Christian Heimesd3fc07a42007-12-06 13:15:13 +0000208 if os.name == "nt":
209 inc_dir = os.path.join(project_base, "PC")
210 else:
211 inc_dir = project_base
Fred Drakec916cdc2001-08-02 20:03:12 +0000212 else:
213 inc_dir = get_python_inc(plat_specific=1)
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000214 if get_python_version() < '2.2':
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000215 config_h = 'config.h'
216 else:
217 # The name of the config.h file changed in 2.2
218 config_h = 'pyconfig.h'
219 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000220
Greg Ward1190ee31998-12-18 23:46:33 +0000221
Greg Ward9ddaaa11999-01-06 14:46:06 +0000222def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000223 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000224 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +0000225 return os.path.join(os.path.dirname(sys.executable), "Makefile")
Fred Drakec1ee39a2000-03-09 15:54:52 +0000226 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
227 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000228
Greg Ward1190ee31998-12-18 23:46:33 +0000229
Greg Ward9ddaaa11999-01-06 14:46:06 +0000230def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000231 """Parse a config.h-style file.
232
233 A dictionary containing name/value pairs is returned. If an
234 optional dictionary is passed in as the second argument, it is
235 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000236 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000237 if g is None:
238 g = {}
Martin v. Löwis10acfd02006-04-10 12:39:36 +0000239 define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
240 undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000241 #
Greg Ward1190ee31998-12-18 23:46:33 +0000242 while 1:
243 line = fp.readline()
244 if not line:
245 break
246 m = define_rx.match(line)
247 if m:
248 n, v = m.group(1, 2)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000249 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000250 except ValueError: pass
251 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000252 else:
253 m = undef_rx.match(line)
254 if m:
255 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000256 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000257
Greg Wardd283ce72000-09-17 00:53:02 +0000258
259# Regexes needed for parsing Makefile (and similar syntaxes,
260# like old-style Setup files).
261_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
262_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
263_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
264
Greg Ward3fff8d22000-09-15 00:03:13 +0000265def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000266 """Parse a Makefile-style file.
267
268 A dictionary containing name/value pairs is returned. If an
269 optional dictionary is passed in as the second argument, it is
270 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000271 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000272 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000273 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000274
Greg Ward9ddaaa11999-01-06 14:46:06 +0000275 if g is None:
276 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000277 done = {}
278 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000279
Greg Ward1190ee31998-12-18 23:46:33 +0000280 while 1:
281 line = fp.readline()
Tarek Ziadé6b16c002009-06-11 08:26:40 +0000282 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000283 break
Greg Wardd283ce72000-09-17 00:53:02 +0000284 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000285 if m:
286 n, v = m.group(1, 2)
Tarek Ziadé6b16c002009-06-11 08:26:40 +0000287 v = v.strip()
288 # `$$' is a literal `$' in make
289 tmpv = v.replace('$$', '')
290
291 if "$" in tmpv:
Greg Ward1190ee31998-12-18 23:46:33 +0000292 notdone[n] = v
293 else:
Tarek Ziadé6b16c002009-06-11 08:26:40 +0000294 try:
295 v = int(v)
296 except ValueError:
297 # insert literal `$'
298 done[n] = v.replace('$$', '$')
299 else:
300 done[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000301
302 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000303 while notdone:
304 for name in notdone.keys():
305 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000306 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000307 if m:
308 n = m.group(1)
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000309 found = True
Guido van Rossum8bc09652008-02-21 18:18:37 +0000310 if n in done:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000311 item = str(done[n])
Guido van Rossum8bc09652008-02-21 18:18:37 +0000312 elif n in notdone:
Greg Ward1190ee31998-12-18 23:46:33 +0000313 # get it on a subsequent round
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000314 found = False
Guido van Rossum8bc09652008-02-21 18:18:37 +0000315 elif n in os.environ:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000316 # do it like make: fall back to environment
317 item = os.environ[n]
Greg Ward1190ee31998-12-18 23:46:33 +0000318 else:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000319 done[n] = item = ""
320 if found:
Greg Ward1190ee31998-12-18 23:46:33 +0000321 after = value[m.end():]
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000322 value = value[:m.start()] + item + after
Greg Ward1190ee31998-12-18 23:46:33 +0000323 if "$" in after:
324 notdone[name] = value
325 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000326 try: value = int(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000327 except ValueError:
Tarek Ziadé6b16c002009-06-11 08:26:40 +0000328 done[name] = value.strip()
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000329 else:
330 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000331 del notdone[name]
332 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000333 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000334 del notdone[name]
335
Greg Wardd283ce72000-09-17 00:53:02 +0000336 fp.close()
337
Greg Ward1190ee31998-12-18 23:46:33 +0000338 # save the results in the global dictionary
339 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000340 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000341
342
Greg Wardd283ce72000-09-17 00:53:02 +0000343def expand_makefile_vars(s, vars):
344 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
345 'string' according to 'vars' (a dictionary mapping variable names to
346 values). Variables not present in 'vars' are silently expanded to the
347 empty string. The variable values in 'vars' should not contain further
348 variable expansions; if 'vars' is the output of 'parse_makefile()',
349 you're fine. Returns a variable-expanded version of 's'.
350 """
351
352 # This algorithm does multiple expansion, so if vars['foo'] contains
353 # "${bar}", it will expand ${foo} to ${bar}, and then expand
354 # ${bar}... and so forth. This is fine as long as 'vars' comes from
355 # 'parse_makefile()', which takes care of such expansions eagerly,
356 # according to make's variable expansion semantics.
357
358 while 1:
359 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
360 if m:
Greg Wardd283ce72000-09-17 00:53:02 +0000361 (beg, end) = m.span()
362 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
363 else:
364 break
365 return s
366
367
Greg Ward879f0f12000-09-15 01:15:08 +0000368_config_vars = None
369
Greg Ward9ddaaa11999-01-06 14:46:06 +0000370def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000371 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000372 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000373 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000374 try:
375 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000376 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000377 except IOError, msg:
378 my_msg = "invalid Python installation: unable to open %s" % filename
379 if hasattr(msg, "strerror"):
380 my_msg = my_msg + " (%s)" % msg.strerror
381
Fred Drake70b014d2001-07-18 18:39:56 +0000382 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000383
Martin v. Löwis10acfd02006-04-10 12:39:36 +0000384 # load the installed pyconfig.h:
385 try:
386 filename = get_config_h_filename()
387 parse_config_h(file(filename), g)
388 except IOError, msg:
389 my_msg = "invalid Python installation: unable to open %s" % filename
390 if hasattr(msg, "strerror"):
391 my_msg = my_msg + " (%s)" % msg.strerror
392
393 raise DistutilsPlatformError(my_msg)
394
Jack Jansen6b08a402004-06-03 12:41:45 +0000395 # On MacOSX we need to check the setting of the environment variable
396 # MACOSX_DEPLOYMENT_TARGET: configure bases some choices on it so
397 # it needs to be compatible.
Jack Jansenbe954622004-12-26 23:07:48 +0000398 # If it isn't set we set it to the configure-time value
Guido van Rossum8bc09652008-02-21 18:18:37 +0000399 if sys.platform == 'darwin' and 'MACOSX_DEPLOYMENT_TARGET' in g:
Ronald Oussoren988117f2006-04-29 11:31:35 +0000400 cfg_target = g['MACOSX_DEPLOYMENT_TARGET']
Jack Jansen6b08a402004-06-03 12:41:45 +0000401 cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
Jack Jansenbe954622004-12-26 23:07:48 +0000402 if cur_target == '':
403 cur_target = cfg_target
404 os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
Ronald Oussoren59075eb2006-04-17 14:43:30 +0000405 elif map(int, cfg_target.split('.')) > map(int, cur_target.split('.')):
Jack Jansen6b08a402004-06-03 12:41:45 +0000406 my_msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure'
407 % (cur_target, cfg_target))
408 raise DistutilsPlatformError(my_msg)
Tim Peters182b5ac2004-07-18 06:16:08 +0000409
Greg Ward4f880282000-06-27 01:59:06 +0000410 # On AIX, there are wrong paths to the linker scripts in the Makefile
411 # -- these paths are relative to the Python source, but when installed
412 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000413 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000414 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000415
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000416 elif get_python_version() < '2.1':
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000417 # The following two branches are for 1.5.2 compatibility.
418 if sys.platform == 'aix4': # what about AIX 3.x ?
419 # Linker script is in the config directory, not in Modules as the
420 # Makefile says.
421 python_lib = get_python_lib(standard_lib=1)
422 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
423 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000424
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000425 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
426
427 elif sys.platform == 'beos':
428 # Linker script is in the config directory. In the Makefile it is
429 # relative to the srcdir, which after installation no longer makes
430 # sense.
431 python_lib = get_python_lib(standard_lib=1)
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000432 linkerscript_path = string.split(g['LDSHARED'])[0]
433 linkerscript_name = os.path.basename(linkerscript_path)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000434 linkerscript = os.path.join(python_lib, 'config',
435 linkerscript_name)
Fred Drakeb94b8492001-12-06 20:51:35 +0000436
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000437 # XXX this isn't the right place to do this: adding the Python
438 # library to the link, if needed, should be in the "build_ext"
439 # command. (It's also needed for non-MS compilers on Windows, and
440 # it's taken care of for them by the 'build_ext.get_libraries()'
441 # method.)
442 g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000443 (linkerscript, PREFIX, get_python_version()))
Fred Drakeb94b8492001-12-06 20:51:35 +0000444
Greg Ward879f0f12000-09-15 01:15:08 +0000445 global _config_vars
446 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000447
Greg Ward9ddaaa11999-01-06 14:46:06 +0000448
Greg Ward4d74d731999-06-08 01:58:36 +0000449def _init_nt():
450 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000451 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000452 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000453 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
454 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000455
Greg Ward32162e81999-08-29 18:22:13 +0000456 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000457 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000458
Fred Drake69e2c6e2000-02-08 15:55:42 +0000459 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000460 g['EXE'] = ".exe"
Christian Heimesd3fc07a42007-12-06 13:15:13 +0000461 g['VERSION'] = get_python_version().replace(".", "")
462 g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
Greg Ward879f0f12000-09-15 01:15:08 +0000463
464 global _config_vars
465 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000466
Fred Drake69e2c6e2000-02-08 15:55:42 +0000467
Greg Ward0eff87a2000-03-07 03:30:09 +0000468def _init_mac():
469 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000470 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000471 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000472 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
473 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000474
475 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000476 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000477
Jack Jansendd13a202001-05-17 12:52:01 +0000478 import MacOS
479 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000480 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000481 else:
482 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000483
484 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000485 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
486 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000487
Jack Jansenab5320b2002-06-26 15:42:49 +0000488 # These are used by the extension module build
489 g['srcdir'] = ':'
Greg Ward879f0f12000-09-15 01:15:08 +0000490 global _config_vars
491 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000492
Fred Drake69e2c6e2000-02-08 15:55:42 +0000493
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000494def _init_os2():
495 """Initialize the module as appropriate for OS/2"""
496 g = {}
497 # set basic install directories
498 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
499 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
500
501 # XXX hmmm.. a normal install puts include files here
502 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
503
504 g['SO'] = '.pyd'
505 g['EXE'] = ".exe"
506
507 global _config_vars
508 _config_vars = g
509
510
Greg Ward879f0f12000-09-15 01:15:08 +0000511def get_config_vars(*args):
512 """With no arguments, return a dictionary of all configuration
513 variables relevant for the current platform. Generally this includes
514 everything needed to build extensions and install both pure modules and
515 extensions. On Unix, this means every variable defined in Python's
516 installed Makefile; on Windows and Mac OS it's a much smaller set.
517
518 With arguments, return a list of values that result from looking up
519 each argument in the configuration variable dictionary.
520 """
521 global _config_vars
522 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000523 func = globals().get("_init_" + os.name)
524 if func:
525 func()
526 else:
527 _config_vars = {}
528
529 # Normalized versions of prefix and exec_prefix are handy to have;
530 # in fact, these are the standard versions used most places in the
531 # Distutils.
532 _config_vars['prefix'] = PREFIX
533 _config_vars['exec_prefix'] = EXEC_PREFIX
534
Ronald Oussorenb02daf72006-05-23 12:01:11 +0000535 if sys.platform == 'darwin':
536 kernel_version = os.uname()[2] # Kernel version (8.4.3)
537 major_version = int(kernel_version.split('.')[0])
538
539 if major_version < 8:
540 # On Mac OS X before 10.4, check if -arch and -isysroot
541 # are in CFLAGS or LDFLAGS and remove them if they are.
542 # This is needed when building extensions on a 10.3 system
543 # using a universal build of python.
Ronald Oussoren61f6a1b2009-12-10 10:29:05 +0000544 for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
Ronald Oussorend6103692006-10-08 17:49:52 +0000545 # a number of derived variables. These need to be
546 # patched up as well.
547 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
Ronald Oussorenb02daf72006-05-23 12:01:11 +0000548 flags = _config_vars[key]
549 flags = re.sub('-arch\s+\w+\s', ' ', flags)
Ronald Oussoren7b9053a2006-06-27 10:08:25 +0000550 flags = re.sub('-isysroot [^ \t]*', ' ', flags)
Ronald Oussorenb02daf72006-05-23 12:01:11 +0000551 _config_vars[key] = flags
552
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000553 else:
554
555 # Allow the user to override the architecture flags using
556 # an environment variable.
557 # NOTE: This name was introduced by Apple in OSX 10.5 and
558 # is used by several scripting languages distributed with
559 # that OS release.
560
561 if 'ARCHFLAGS' in os.environ:
562 arch = os.environ['ARCHFLAGS']
Ronald Oussoren61f6a1b2009-12-10 10:29:05 +0000563 for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000564 # a number of derived variables. These need to be
565 # patched up as well.
566 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
567
568 flags = _config_vars[key]
569 flags = re.sub('-arch\s+\w+\s', ' ', flags)
570 flags = flags + ' ' + arch
571 _config_vars[key] = flags
572
Ronald Oussorend787abf2009-09-22 19:31:34 +0000573 # If we're on OSX 10.5 or later and the user tries to
574 # compiles an extension using an SDK that is not present
575 # on the current machine it is better to not use an SDK
576 # than to fail.
577 #
578 # The major usecase for this is users using a Python.org
579 # binary installer on OSX 10.6: that installer uses
580 # the 10.4u SDK, but that SDK is not installed by default
581 # when you install Xcode.
582 #
583 m = re.search('-isysroot\s+(\S+)', _config_vars['CFLAGS'])
584 if m is not None:
585 sdk = m.group(1)
586 if not os.path.exists(sdk):
Ronald Oussoren61f6a1b2009-12-10 10:29:05 +0000587 for key in ('LDFLAGS', 'BASECFLAGS', 'LDSHARED',
Ronald Oussorend787abf2009-09-22 19:31:34 +0000588 # a number of derived variables. These need to be
589 # patched up as well.
590 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
591
592 flags = _config_vars[key]
593 flags = re.sub('-isysroot\s+\S+(\s|$)', ' ', flags)
594 _config_vars[key] = flags
595
Greg Ward879f0f12000-09-15 01:15:08 +0000596 if args:
597 vals = []
598 for name in args:
599 vals.append(_config_vars.get(name))
600 return vals
601 else:
602 return _config_vars
603
604def get_config_var(name):
605 """Return the value of a single variable using the dictionary
606 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000607 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000608 """
609 return get_config_vars().get(name)