blob: b17743a8651768cbbdc4b8c260a5747a6be458a2 [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
Guido van Rossum63236cf2007-05-25 18:39:29 +000014import io
Greg Ward9ddaaa11999-01-06 14:46:06 +000015import os
16import re
Greg Ward9ddaaa11999-01-06 14:46:06 +000017import sys
Greg Ward1190ee31998-12-18 23:46:33 +000018
Guido van Rossum45aecf42006-03-15 04:58:47 +000019from .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 Heimes255f53b2007-12-08 15:33:56 +000025# Path to the base directory of the project. On Windows the binary may
Christian Heimesd5e2b6f2008-03-19 21:50:51 +000026# live in project/PCBuild9. If we're dealing with an x64 Windows build,
27# it'll live in project/PCbuild/amd64.
Christian Heimes255f53b2007-12-08 15:33:56 +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 Heimesd9a4d1d2008-01-01 14:42:15 +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))
Christian Heimesd5e2b6f2008-03-19 21:50:51 +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 Heimes255f53b2007-12-08 15:33:56 +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 Heimes0449f632007-12-15 01:27:15 +000043# Setup.local is available for Makefile builds including VPATH builds,
44# Setup.dist is available on Windows
Christian Heimes2202f872008-02-06 14:31:34 +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 Drakec916cdc2001-08-02 20:03:12 +000051
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000052def get_python_version():
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +000053 """Return a string containing the major and minor Python version,
54 leaving off the patchlevel. Sample return values could be '1.5'
55 or '2.2'.
56 """
57 return sys.version[:3]
58
59
Greg Wardd38e6f72000-04-10 01:17:49 +000060def get_python_inc(plat_specific=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000061 """Return the directory containing installed Python header files.
Fred Drakec1ee39a2000-03-09 15:54:52 +000062
63 If 'plat_specific' is false (the default), this is the path to the
64 non-platform-specific header files, i.e. Python.h and so on;
65 otherwise, this is the path to platform-specific header files
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000066 (namely pyconfig.h).
Fred Drakec1ee39a2000-03-09 15:54:52 +000067
Greg Wardd38e6f72000-04-10 01:17:49 +000068 If 'prefix' is supplied, use it instead of sys.prefix or
69 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakeb94b8492001-12-06 20:51:35 +000070 """
Greg Wardd38e6f72000-04-10 01:17:49 +000071 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000072 prefix = plat_specific and EXEC_PREFIX or PREFIX
Greg Ward7d73b9e2000-03-09 03:16:05 +000073 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000074 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +000075 base = os.path.dirname(os.path.abspath(sys.executable))
76 if plat_specific:
77 inc_dir = base
78 else:
79 inc_dir = os.path.join(base, "Include")
80 if not os.path.exists(inc_dir):
81 inc_dir = os.path.join(os.path.dirname(base), "Include")
82 return inc_dir
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000083 return os.path.join(prefix, "include", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +000084 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000085 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000086 elif os.name == "mac":
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000087 if plat_specific:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000088 return os.path.join(prefix, "Mac", "Include")
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000089 else:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000090 return os.path.join(prefix, "Include")
Marc-André Lemburg2544f512002-01-31 18:56:00 +000091 elif os.name == "os2":
92 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000093 else:
Fred Drake70b014d2001-07-18 18:39:56 +000094 raise DistutilsPlatformError(
95 "I don't know where Python installs its C header files "
96 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +000097
98
Greg Wardd38e6f72000-04-10 01:17:49 +000099def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +0000100 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +0000101 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +0000102
Fred Drakec1ee39a2000-03-09 15:54:52 +0000103 If 'plat_specific' is true, return the directory containing
104 platform-specific modules, i.e. any module from a non-pure-Python
105 module distribution; otherwise, return the platform-shared library
106 directory. If 'standard_lib' is true, return the directory
107 containing standard Python library modules; otherwise, return the
108 directory for site-specific modules.
109
Greg Wardd38e6f72000-04-10 01:17:49 +0000110 If 'prefix' is supplied, use it instead of sys.prefix or
111 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +0000112 """
Greg Wardd38e6f72000-04-10 01:17:49 +0000113 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +0000114 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +0000115
Greg Ward7d73b9e2000-03-09 03:16:05 +0000116 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +0000117 libpython = os.path.join(prefix,
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +0000118 "lib", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +0000119 if standard_lib:
120 return libpython
121 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +0000122 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000123 elif os.name == "nt":
124 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000125 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000126 else:
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000127 if get_python_version() < "2.2":
Greg Wardf17efb92001-08-23 20:53:27 +0000128 return prefix
129 else:
130 return os.path.join(PREFIX, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000131 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000132 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000133 if standard_lib:
Jack Jansen212a2e12001-09-04 12:01:49 +0000134 return os.path.join(prefix, "Lib", "lib-dynload")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000135 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000136 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000137 else:
138 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000139 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000140 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000141 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000142 elif os.name == "os2":
143 if standard_lib:
144 return os.path.join(PREFIX, "Lib")
145 else:
146 return os.path.join(PREFIX, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000147 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000148 raise DistutilsPlatformError(
149 "I don't know where Python installs its library "
150 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000151
Greg Ward7d73b9e2000-03-09 03:16:05 +0000152
Fred Drake70b014d2001-07-18 18:39:56 +0000153def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000154 """Do any platform-specific customization of a CCompiler instance.
155
156 Mainly needed on Unix, so we can plug in the information that
157 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000158 """
159 if compiler.compiler_type == "unix":
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000160 (cc, cxx, opt, cflags, ccshared, ldshared, so_ext) = \
Tim Petersfffc4b72005-05-18 02:18:09 +0000161 get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
Brett Cannon08cd5982005-04-24 22:26:38 +0000162 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000163
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000164 if 'CC' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000165 cc = os.environ['CC']
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000166 if 'CXX' in os.environ:
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000167 cxx = os.environ['CXX']
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000168 if 'LDSHARED' in os.environ:
Anthony Baxter22dcf662004-10-13 15:54:17 +0000169 ldshared = os.environ['LDSHARED']
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000170 if 'CPP' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000171 cpp = os.environ['CPP']
172 else:
173 cpp = cc + " -E" # not always
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000174 if 'LDFLAGS' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000175 ldshared = ldshared + ' ' + os.environ['LDFLAGS']
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000176 if 'CFLAGS' in os.environ:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000177 cflags = opt + ' ' + os.environ['CFLAGS']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000178 ldshared = ldshared + ' ' + os.environ['CFLAGS']
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000179 if 'CPPFLAGS' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000180 cpp = cpp + ' ' + os.environ['CPPFLAGS']
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000181 cflags = cflags + ' ' + os.environ['CPPFLAGS']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000182 ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
183
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000184 cc_cmd = cc + ' ' + cflags
Greg Ward879f0f12000-09-15 01:15:08 +0000185 compiler.set_executables(
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000186 preprocessor=cpp,
Greg Ward879f0f12000-09-15 01:15:08 +0000187 compiler=cc_cmd,
188 compiler_so=cc_cmd + ' ' + ccshared,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000189 compiler_cxx=cxx,
Greg Ward879f0f12000-09-15 01:15:08 +0000190 linker_so=ldshared,
191 linker_exe=cc)
192
193 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000194
195
Greg Ward9ddaaa11999-01-06 14:46:06 +0000196def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000197 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000198 if python_build:
Christian Heimes255f53b2007-12-08 15:33:56 +0000199 if os.name == "nt":
200 inc_dir = os.path.join(project_base, "PC")
201 else:
202 inc_dir = project_base
Fred Drakec916cdc2001-08-02 20:03:12 +0000203 else:
204 inc_dir = get_python_inc(plat_specific=1)
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000205 if get_python_version() < '2.2':
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000206 config_h = 'config.h'
207 else:
208 # The name of the config.h file changed in 2.2
209 config_h = 'pyconfig.h'
210 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000211
Greg Ward1190ee31998-12-18 23:46:33 +0000212
Greg Ward9ddaaa11999-01-06 14:46:06 +0000213def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000214 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000215 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +0000216 return os.path.join(os.path.dirname(sys.executable), "Makefile")
Fred Drakec1ee39a2000-03-09 15:54:52 +0000217 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
218 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000219
Greg Ward1190ee31998-12-18 23:46:33 +0000220
Greg Ward9ddaaa11999-01-06 14:46:06 +0000221def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000222 """Parse a config.h-style file.
223
224 A dictionary containing name/value pairs is returned. If an
225 optional dictionary is passed in as the second argument, it is
226 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000227 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000228 if g is None:
229 g = {}
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000230 define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
231 undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000232 #
Collin Winter5b7e9d72007-08-30 03:52:21 +0000233 while True:
Greg Ward1190ee31998-12-18 23:46:33 +0000234 line = fp.readline()
235 if not line:
236 break
237 m = define_rx.match(line)
238 if m:
239 n, v = m.group(1, 2)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000240 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000241 except ValueError: pass
242 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000243 else:
244 m = undef_rx.match(line)
245 if m:
246 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000247 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000248
Greg Wardd283ce72000-09-17 00:53:02 +0000249
250# Regexes needed for parsing Makefile (and similar syntaxes,
251# like old-style Setup files).
252_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
253_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
254_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
255
Greg Ward3fff8d22000-09-15 00:03:13 +0000256def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000257 """Parse a Makefile-style file.
258
259 A dictionary containing name/value pairs is returned. If an
260 optional dictionary is passed in as the second argument, it is
261 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000262 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000263 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000264 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000265
Greg Ward9ddaaa11999-01-06 14:46:06 +0000266 if g is None:
267 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000268 done = {}
269 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000270
Collin Winter5b7e9d72007-08-30 03:52:21 +0000271 while True:
Greg Ward1190ee31998-12-18 23:46:33 +0000272 line = fp.readline()
Collin Winter5b7e9d72007-08-30 03:52:21 +0000273 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000274 break
Greg Wardd283ce72000-09-17 00:53:02 +0000275 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000276 if m:
277 n, v = m.group(1, 2)
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000278 v = v.strip()
Greg Ward1190ee31998-12-18 23:46:33 +0000279 if "$" in v:
280 notdone[n] = v
281 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000282 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000283 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +0000284 done[n] = v
285
286 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000287 while notdone:
Guido van Rossumcc2b0162007-02-11 06:12:03 +0000288 for name in list(notdone):
Greg Ward1190ee31998-12-18 23:46:33 +0000289 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000290 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000291 if m:
292 n = m.group(1)
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000293 found = True
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000294 if n in done:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000295 item = str(done[n])
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000296 elif n in notdone:
Greg Ward1190ee31998-12-18 23:46:33 +0000297 # get it on a subsequent round
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000298 found = False
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000299 elif n in os.environ:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000300 # do it like make: fall back to environment
301 item = os.environ[n]
Greg Ward1190ee31998-12-18 23:46:33 +0000302 else:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000303 done[n] = item = ""
304 if found:
Greg Ward1190ee31998-12-18 23:46:33 +0000305 after = value[m.end():]
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000306 value = value[:m.start()] + item + after
Greg Ward1190ee31998-12-18 23:46:33 +0000307 if "$" in after:
308 notdone[name] = value
309 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000310 try: value = int(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000311 except ValueError:
Neal Norwitz9d72bb42007-04-17 08:48:32 +0000312 done[name] = value.strip()
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000313 else:
314 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000315 del notdone[name]
316 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000317 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000318 del notdone[name]
319
Greg Wardd283ce72000-09-17 00:53:02 +0000320 fp.close()
321
Greg Ward1190ee31998-12-18 23:46:33 +0000322 # save the results in the global dictionary
323 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000324 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000325
326
Greg Wardd283ce72000-09-17 00:53:02 +0000327def expand_makefile_vars(s, vars):
328 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
329 'string' according to 'vars' (a dictionary mapping variable names to
330 values). Variables not present in 'vars' are silently expanded to the
331 empty string. The variable values in 'vars' should not contain further
332 variable expansions; if 'vars' is the output of 'parse_makefile()',
333 you're fine. Returns a variable-expanded version of 's'.
334 """
335
336 # This algorithm does multiple expansion, so if vars['foo'] contains
337 # "${bar}", it will expand ${foo} to ${bar}, and then expand
338 # ${bar}... and so forth. This is fine as long as 'vars' comes from
339 # 'parse_makefile()', which takes care of such expansions eagerly,
340 # according to make's variable expansion semantics.
341
Collin Winter5b7e9d72007-08-30 03:52:21 +0000342 while True:
Greg Wardd283ce72000-09-17 00:53:02 +0000343 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
344 if m:
Greg Wardd283ce72000-09-17 00:53:02 +0000345 (beg, end) = m.span()
346 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
347 else:
348 break
349 return s
350
351
Greg Ward879f0f12000-09-15 01:15:08 +0000352_config_vars = None
353
Greg Ward9ddaaa11999-01-06 14:46:06 +0000354def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000355 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000356 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000357 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000358 try:
359 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000360 parse_makefile(filename, g)
Guido van Rossumb940e112007-01-10 16:19:56 +0000361 except IOError as msg:
Greg Warda570c052000-05-23 23:14:00 +0000362 my_msg = "invalid Python installation: unable to open %s" % filename
363 if hasattr(msg, "strerror"):
364 my_msg = my_msg + " (%s)" % msg.strerror
365
Fred Drake70b014d2001-07-18 18:39:56 +0000366 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000367
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000368 # load the installed pyconfig.h:
369 try:
370 filename = get_config_h_filename()
Guido van Rossum63236cf2007-05-25 18:39:29 +0000371 parse_config_h(io.open(filename), g)
Guido van Rossumb940e112007-01-10 16:19:56 +0000372 except IOError as msg:
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000373 my_msg = "invalid Python installation: unable to open %s" % filename
374 if hasattr(msg, "strerror"):
375 my_msg = my_msg + " (%s)" % msg.strerror
376
377 raise DistutilsPlatformError(my_msg)
378
Jack Jansen6b08a402004-06-03 12:41:45 +0000379 # On MacOSX we need to check the setting of the environment variable
380 # MACOSX_DEPLOYMENT_TARGET: configure bases some choices on it so
381 # it needs to be compatible.
Jack Jansenbe954622004-12-26 23:07:48 +0000382 # If it isn't set we set it to the configure-time value
Guido van Rossume2b70bc2006-08-18 22:13:04 +0000383 if sys.platform == 'darwin' and 'MACOSX_DEPLOYMENT_TARGET' in g:
Thomas Wouters477c8d52006-05-27 19:21:47 +0000384 cfg_target = g['MACOSX_DEPLOYMENT_TARGET']
Jack Jansen6b08a402004-06-03 12:41:45 +0000385 cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
Jack Jansenbe954622004-12-26 23:07:48 +0000386 if cur_target == '':
387 cur_target = cfg_target
388 os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
Guido van Rossumc1f779c2007-07-03 08:25:58 +0000389 elif [int(x) for x in cfg_target.split('.')] > [int(x) for x in cur_target.split('.')]:
Jack Jansen6b08a402004-06-03 12:41:45 +0000390 my_msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure'
391 % (cur_target, cfg_target))
392 raise DistutilsPlatformError(my_msg)
Tim Peters182b5ac2004-07-18 06:16:08 +0000393
Greg Ward4f880282000-06-27 01:59:06 +0000394 # On AIX, there are wrong paths to the linker scripts in the Makefile
395 # -- these paths are relative to the Python source, but when installed
396 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000397 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000398 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000399
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000400 elif get_python_version() < '2.1':
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000401 # The following two branches are for 1.5.2 compatibility.
402 if sys.platform == 'aix4': # what about AIX 3.x ?
403 # Linker script is in the config directory, not in Modules as the
404 # Makefile says.
405 python_lib = get_python_lib(standard_lib=1)
406 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
407 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000408
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000409 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
410
Greg Ward879f0f12000-09-15 01:15:08 +0000411 global _config_vars
412 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000413
Greg Ward9ddaaa11999-01-06 14:46:06 +0000414
Greg Ward4d74d731999-06-08 01:58:36 +0000415def _init_nt():
416 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000417 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000418 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000419 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
420 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000421
Greg Ward32162e81999-08-29 18:22:13 +0000422 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000423 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000424
Fred Drake69e2c6e2000-02-08 15:55:42 +0000425 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000426 g['EXE'] = ".exe"
Christian Heimes255f53b2007-12-08 15:33:56 +0000427 g['VERSION'] = get_python_version().replace(".", "")
428 g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
Greg Ward879f0f12000-09-15 01:15:08 +0000429
430 global _config_vars
431 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000432
Fred Drake69e2c6e2000-02-08 15:55:42 +0000433
Greg Ward0eff87a2000-03-07 03:30:09 +0000434def _init_mac():
435 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000436 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000437 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000438 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
439 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000440
441 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000442 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000443
Jack Jansendd13a202001-05-17 12:52:01 +0000444 import MacOS
445 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000446 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000447 else:
448 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000449
450 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000451 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
452 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000453
Jack Jansenab5320b2002-06-26 15:42:49 +0000454 # These are used by the extension module build
455 g['srcdir'] = ':'
Greg Ward879f0f12000-09-15 01:15:08 +0000456 global _config_vars
457 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000458
Fred Drake69e2c6e2000-02-08 15:55:42 +0000459
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000460def _init_os2():
461 """Initialize the module as appropriate for OS/2"""
462 g = {}
463 # set basic install directories
464 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
465 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
466
467 # XXX hmmm.. a normal install puts include files here
468 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
469
470 g['SO'] = '.pyd'
471 g['EXE'] = ".exe"
472
473 global _config_vars
474 _config_vars = g
475
476
Greg Ward879f0f12000-09-15 01:15:08 +0000477def get_config_vars(*args):
478 """With no arguments, return a dictionary of all configuration
479 variables relevant for the current platform. Generally this includes
480 everything needed to build extensions and install both pure modules and
481 extensions. On Unix, this means every variable defined in Python's
482 installed Makefile; on Windows and Mac OS it's a much smaller set.
483
484 With arguments, return a list of values that result from looking up
485 each argument in the configuration variable dictionary.
486 """
487 global _config_vars
488 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000489 func = globals().get("_init_" + os.name)
490 if func:
491 func()
492 else:
493 _config_vars = {}
494
495 # Normalized versions of prefix and exec_prefix are handy to have;
496 # in fact, these are the standard versions used most places in the
497 # Distutils.
498 _config_vars['prefix'] = PREFIX
499 _config_vars['exec_prefix'] = EXEC_PREFIX
500
Thomas Wouters477c8d52006-05-27 19:21:47 +0000501 if sys.platform == 'darwin':
502 kernel_version = os.uname()[2] # Kernel version (8.4.3)
503 major_version = int(kernel_version.split('.')[0])
504
505 if major_version < 8:
506 # On Mac OS X before 10.4, check if -arch and -isysroot
507 # are in CFLAGS or LDFLAGS and remove them if they are.
508 # This is needed when building extensions on a 10.3 system
509 # using a universal build of python.
Thomas Wouters89f507f2006-12-13 04:49:30 +0000510 for key in ('LDFLAGS', 'BASECFLAGS',
511 # a number of derived variables. These need to be
512 # patched up as well.
513 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
Thomas Wouters477c8d52006-05-27 19:21:47 +0000514 flags = _config_vars[key]
Antoine Pitroufd036452008-08-19 17:56:33 +0000515 flags = re.sub('-arch\s+\w+\s', ' ', flags, re.ASCII)
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000516 flags = re.sub('-isysroot [^ \t]*', ' ', flags)
Thomas Wouters477c8d52006-05-27 19:21:47 +0000517 _config_vars[key] = flags
518
Georg Brandlfcaf9102008-07-16 02:17:56 +0000519 else:
520
521 # Allow the user to override the architecture flags using
522 # an environment variable.
523 # NOTE: This name was introduced by Apple in OSX 10.5 and
524 # is used by several scripting languages distributed with
525 # that OS release.
526
527 if 'ARCHFLAGS' in os.environ:
528 arch = os.environ['ARCHFLAGS']
529 for key in ('LDFLAGS', 'BASECFLAGS',
530 # a number of derived variables. These need to be
531 # patched up as well.
532 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
533
534 flags = _config_vars[key]
535 flags = re.sub('-arch\s+\w+\s', ' ', flags)
536 flags = flags + ' ' + arch
537 _config_vars[key] = flags
538
Greg Ward879f0f12000-09-15 01:15:08 +0000539 if args:
540 vals = []
541 for name in args:
542 vals.append(_config_vars.get(name))
543 return vals
544 else:
545 return _config_vars
546
547def get_config_var(name):
548 """Return the value of a single variable using the dictionary
549 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000550 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000551 """
552 return get_config_vars().get(name)