blob: 9993fba1ab4cb1759ef0a61ecc41d0f2381c7146 [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
Greg Ward7d73b9e2000-03-09 03:16:05 +000074 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000075 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +000076 base = os.path.dirname(os.path.abspath(sys.executable))
77 if plat_specific:
78 inc_dir = base
79 else:
80 inc_dir = os.path.join(base, "Include")
81 if not os.path.exists(inc_dir):
82 inc_dir = os.path.join(os.path.dirname(base), "Include")
83 return inc_dir
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000084 return os.path.join(prefix, "include", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +000085 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000086 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000087 elif os.name == "mac":
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000088 if plat_specific:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000089 return os.path.join(prefix, "Mac", "Include")
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000090 else:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000091 return os.path.join(prefix, "Include")
Marc-André Lemburg2544f512002-01-31 18:56:00 +000092 elif os.name == "os2":
93 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000094 else:
Fred Drake70b014d2001-07-18 18:39:56 +000095 raise DistutilsPlatformError(
96 "I don't know where Python installs its C header files "
97 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +000098
99
Greg Wardd38e6f72000-04-10 01:17:49 +0000100def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +0000101 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +0000102 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +0000103
Fred Drakec1ee39a2000-03-09 15:54:52 +0000104 If 'plat_specific' is true, return the directory containing
105 platform-specific modules, i.e. any module from a non-pure-Python
106 module distribution; otherwise, return the platform-shared library
107 directory. If 'standard_lib' is true, return the directory
108 containing standard Python library modules; otherwise, return the
109 directory for site-specific modules.
110
Greg Wardd38e6f72000-04-10 01:17:49 +0000111 If 'prefix' is supplied, use it instead of sys.prefix or
112 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +0000113 """
Greg Wardd38e6f72000-04-10 01:17:49 +0000114 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +0000115 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +0000116
Greg Ward7d73b9e2000-03-09 03:16:05 +0000117 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +0000118 libpython = os.path.join(prefix,
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +0000119 "lib", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +0000120 if standard_lib:
121 return libpython
122 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +0000123 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000124
125 elif os.name == "nt":
126 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000127 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000128 else:
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000129 if get_python_version() < "2.2":
Greg Wardf17efb92001-08-23 20:53:27 +0000130 return prefix
131 else:
132 return os.path.join(PREFIX, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000133
134 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000135 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000136 if standard_lib:
Jack Jansen212a2e12001-09-04 12:01:49 +0000137 return os.path.join(prefix, "Lib", "lib-dynload")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000138 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000139 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000140 else:
141 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000142 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000143 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000144 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000145
146 elif os.name == "os2":
147 if standard_lib:
148 return os.path.join(PREFIX, "Lib")
149 else:
150 return os.path.join(PREFIX, "Lib", "site-packages")
151
Greg Ward7d73b9e2000-03-09 03:16:05 +0000152 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000153 raise DistutilsPlatformError(
154 "I don't know where Python installs its library "
155 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000156
Greg Ward7d73b9e2000-03-09 03:16:05 +0000157
Fred Drake70b014d2001-07-18 18:39:56 +0000158def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000159 """Do any platform-specific customization of a CCompiler instance.
160
161 Mainly needed on Unix, so we can plug in the information that
162 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000163 """
164 if compiler.compiler_type == "unix":
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000165 (cc, cxx, opt, cflags, ccshared, ldshared, so_ext) = \
Tim Petersfffc4b72005-05-18 02:18:09 +0000166 get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
Brett Cannon08cd5982005-04-24 22:26:38 +0000167 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000168
Guido van Rossum8bc09652008-02-21 18:18:37 +0000169 if 'CC' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000170 cc = os.environ['CC']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000171 if 'CXX' in os.environ:
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000172 cxx = os.environ['CXX']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000173 if 'LDSHARED' in os.environ:
Anthony Baxter22dcf662004-10-13 15:54:17 +0000174 ldshared = os.environ['LDSHARED']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000175 if 'CPP' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000176 cpp = os.environ['CPP']
177 else:
178 cpp = cc + " -E" # not always
Guido van Rossum8bc09652008-02-21 18:18:37 +0000179 if 'LDFLAGS' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000180 ldshared = ldshared + ' ' + os.environ['LDFLAGS']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000181 if 'CFLAGS' in os.environ:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000182 cflags = opt + ' ' + os.environ['CFLAGS']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000183 ldshared = ldshared + ' ' + os.environ['CFLAGS']
Guido van Rossum8bc09652008-02-21 18:18:37 +0000184 if 'CPPFLAGS' in os.environ:
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000185 cpp = cpp + ' ' + os.environ['CPPFLAGS']
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000186 cflags = cflags + ' ' + os.environ['CPPFLAGS']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000187 ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
188
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000189 cc_cmd = cc + ' ' + cflags
Greg Ward879f0f12000-09-15 01:15:08 +0000190 compiler.set_executables(
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000191 preprocessor=cpp,
Greg Ward879f0f12000-09-15 01:15:08 +0000192 compiler=cc_cmd,
193 compiler_so=cc_cmd + ' ' + ccshared,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000194 compiler_cxx=cxx,
Greg Ward879f0f12000-09-15 01:15:08 +0000195 linker_so=ldshared,
196 linker_exe=cc)
197
198 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000199
200
Greg Ward9ddaaa11999-01-06 14:46:06 +0000201def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000202 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000203 if python_build:
Christian Heimesd3fc07a42007-12-06 13:15:13 +0000204 if os.name == "nt":
205 inc_dir = os.path.join(project_base, "PC")
206 else:
207 inc_dir = project_base
Fred Drakec916cdc2001-08-02 20:03:12 +0000208 else:
209 inc_dir = get_python_inc(plat_specific=1)
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000210 if get_python_version() < '2.2':
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000211 config_h = 'config.h'
212 else:
213 # The name of the config.h file changed in 2.2
214 config_h = 'pyconfig.h'
215 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000216
Greg Ward1190ee31998-12-18 23:46:33 +0000217
Greg Ward9ddaaa11999-01-06 14:46:06 +0000218def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000219 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000220 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +0000221 return os.path.join(os.path.dirname(sys.executable), "Makefile")
Fred Drakec1ee39a2000-03-09 15:54:52 +0000222 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
223 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000224
Greg Ward1190ee31998-12-18 23:46:33 +0000225
Greg Ward9ddaaa11999-01-06 14:46:06 +0000226def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000227 """Parse a config.h-style file.
228
229 A dictionary containing name/value pairs is returned. If an
230 optional dictionary is passed in as the second argument, it is
231 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000232 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000233 if g is None:
234 g = {}
Martin v. Löwis10acfd02006-04-10 12:39:36 +0000235 define_rx = re.compile("#define ([A-Z][A-Za-z0-9_]+) (.*)\n")
236 undef_rx = re.compile("/[*] #undef ([A-Z][A-Za-z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000237 #
Greg Ward1190ee31998-12-18 23:46:33 +0000238 while 1:
239 line = fp.readline()
240 if not line:
241 break
242 m = define_rx.match(line)
243 if m:
244 n, v = m.group(1, 2)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000245 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000246 except ValueError: pass
247 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000248 else:
249 m = undef_rx.match(line)
250 if m:
251 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000252 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000253
Greg Wardd283ce72000-09-17 00:53:02 +0000254
255# Regexes needed for parsing Makefile (and similar syntaxes,
256# like old-style Setup files).
257_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
258_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
259_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
260
Greg Ward3fff8d22000-09-15 00:03:13 +0000261def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000262 """Parse a Makefile-style file.
263
264 A dictionary containing name/value pairs is returned. If an
265 optional dictionary is passed in as the second argument, it is
266 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000267 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000268 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000269 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000270
Greg Ward9ddaaa11999-01-06 14:46:06 +0000271 if g is None:
272 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000273 done = {}
274 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000275
Greg Ward1190ee31998-12-18 23:46:33 +0000276 while 1:
277 line = fp.readline()
Greg Wardd283ce72000-09-17 00:53:02 +0000278 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000279 break
Greg Wardd283ce72000-09-17 00:53:02 +0000280 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000281 if m:
282 n, v = m.group(1, 2)
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000283 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +0000284 if "$" in v:
285 notdone[n] = v
286 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000287 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000288 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +0000289 done[n] = v
290
291 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000292 while notdone:
293 for name in notdone.keys():
294 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000295 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000296 if m:
297 n = m.group(1)
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000298 found = True
Guido van Rossum8bc09652008-02-21 18:18:37 +0000299 if n in done:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000300 item = str(done[n])
Guido van Rossum8bc09652008-02-21 18:18:37 +0000301 elif n in notdone:
Greg Ward1190ee31998-12-18 23:46:33 +0000302 # get it on a subsequent round
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000303 found = False
Guido van Rossum8bc09652008-02-21 18:18:37 +0000304 elif n in os.environ:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000305 # do it like make: fall back to environment
306 item = os.environ[n]
Greg Ward1190ee31998-12-18 23:46:33 +0000307 else:
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000308 done[n] = item = ""
309 if found:
Greg Ward1190ee31998-12-18 23:46:33 +0000310 after = value[m.end():]
Martin v. Löwisd7c795e2005-04-25 07:14:03 +0000311 value = value[:m.start()] + item + after
Greg Ward1190ee31998-12-18 23:46:33 +0000312 if "$" in after:
313 notdone[name] = value
314 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000315 try: value = int(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000316 except ValueError:
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000317 done[name] = string.strip(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000318 else:
319 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000320 del notdone[name]
321 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000322 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000323 del notdone[name]
324
Greg Wardd283ce72000-09-17 00:53:02 +0000325 fp.close()
326
Greg Ward1190ee31998-12-18 23:46:33 +0000327 # save the results in the global dictionary
328 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000329 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000330
331
Greg Wardd283ce72000-09-17 00:53:02 +0000332def expand_makefile_vars(s, vars):
333 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
334 'string' according to 'vars' (a dictionary mapping variable names to
335 values). Variables not present in 'vars' are silently expanded to the
336 empty string. The variable values in 'vars' should not contain further
337 variable expansions; if 'vars' is the output of 'parse_makefile()',
338 you're fine. Returns a variable-expanded version of 's'.
339 """
340
341 # This algorithm does multiple expansion, so if vars['foo'] contains
342 # "${bar}", it will expand ${foo} to ${bar}, and then expand
343 # ${bar}... and so forth. This is fine as long as 'vars' comes from
344 # 'parse_makefile()', which takes care of such expansions eagerly,
345 # according to make's variable expansion semantics.
346
347 while 1:
348 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
349 if m:
Greg Wardd283ce72000-09-17 00:53:02 +0000350 (beg, end) = m.span()
351 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
352 else:
353 break
354 return s
355
356
Greg Ward879f0f12000-09-15 01:15:08 +0000357_config_vars = None
358
Greg Ward9ddaaa11999-01-06 14:46:06 +0000359def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000360 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000361 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000362 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000363 try:
364 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000365 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000366 except IOError, msg:
367 my_msg = "invalid Python installation: unable to open %s" % filename
368 if hasattr(msg, "strerror"):
369 my_msg = my_msg + " (%s)" % msg.strerror
370
Fred Drake70b014d2001-07-18 18:39:56 +0000371 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000372
Martin v. Löwis10acfd02006-04-10 12:39:36 +0000373 # load the installed pyconfig.h:
374 try:
375 filename = get_config_h_filename()
376 parse_config_h(file(filename), g)
377 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
382 raise DistutilsPlatformError(my_msg)
383
Jack Jansen6b08a402004-06-03 12:41:45 +0000384 # On MacOSX we need to check the setting of the environment variable
385 # MACOSX_DEPLOYMENT_TARGET: configure bases some choices on it so
386 # it needs to be compatible.
Jack Jansenbe954622004-12-26 23:07:48 +0000387 # If it isn't set we set it to the configure-time value
Guido van Rossum8bc09652008-02-21 18:18:37 +0000388 if sys.platform == 'darwin' and 'MACOSX_DEPLOYMENT_TARGET' in g:
Ronald Oussoren988117f2006-04-29 11:31:35 +0000389 cfg_target = g['MACOSX_DEPLOYMENT_TARGET']
Jack Jansen6b08a402004-06-03 12:41:45 +0000390 cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
Jack Jansenbe954622004-12-26 23:07:48 +0000391 if cur_target == '':
392 cur_target = cfg_target
393 os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
Ronald Oussoren59075eb2006-04-17 14:43:30 +0000394 elif map(int, cfg_target.split('.')) > map(int, cur_target.split('.')):
Jack Jansen6b08a402004-06-03 12:41:45 +0000395 my_msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure'
396 % (cur_target, cfg_target))
397 raise DistutilsPlatformError(my_msg)
Tim Peters182b5ac2004-07-18 06:16:08 +0000398
Greg Ward4f880282000-06-27 01:59:06 +0000399 # On AIX, there are wrong paths to the linker scripts in the Makefile
400 # -- these paths are relative to the Python source, but when installed
401 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000402 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000403 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000404
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000405 elif get_python_version() < '2.1':
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000406 # The following two branches are for 1.5.2 compatibility.
407 if sys.platform == 'aix4': # what about AIX 3.x ?
408 # Linker script is in the config directory, not in Modules as the
409 # Makefile says.
410 python_lib = get_python_lib(standard_lib=1)
411 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
412 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000413
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000414 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
415
416 elif sys.platform == 'beos':
417 # Linker script is in the config directory. In the Makefile it is
418 # relative to the srcdir, which after installation no longer makes
419 # sense.
420 python_lib = get_python_lib(standard_lib=1)
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000421 linkerscript_path = string.split(g['LDSHARED'])[0]
422 linkerscript_name = os.path.basename(linkerscript_path)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000423 linkerscript = os.path.join(python_lib, 'config',
424 linkerscript_name)
Fred Drakeb94b8492001-12-06 20:51:35 +0000425
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000426 # XXX this isn't the right place to do this: adding the Python
427 # library to the link, if needed, should be in the "build_ext"
428 # command. (It's also needed for non-MS compilers on Windows, and
429 # it's taken care of for them by the 'build_ext.get_libraries()'
430 # method.)
431 g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000432 (linkerscript, PREFIX, get_python_version()))
Fred Drakeb94b8492001-12-06 20:51:35 +0000433
Greg Ward879f0f12000-09-15 01:15:08 +0000434 global _config_vars
435 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000436
Greg Ward9ddaaa11999-01-06 14:46:06 +0000437
Greg Ward4d74d731999-06-08 01:58:36 +0000438def _init_nt():
439 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000440 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000441 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000442 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
443 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000444
Greg Ward32162e81999-08-29 18:22:13 +0000445 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000446 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000447
Fred Drake69e2c6e2000-02-08 15:55:42 +0000448 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000449 g['EXE'] = ".exe"
Christian Heimesd3fc07a42007-12-06 13:15:13 +0000450 g['VERSION'] = get_python_version().replace(".", "")
451 g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))
Greg Ward879f0f12000-09-15 01:15:08 +0000452
453 global _config_vars
454 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000455
Fred Drake69e2c6e2000-02-08 15:55:42 +0000456
Greg Ward0eff87a2000-03-07 03:30:09 +0000457def _init_mac():
458 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000459 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000460 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000461 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
462 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000463
464 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000465 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000466
Jack Jansendd13a202001-05-17 12:52:01 +0000467 import MacOS
468 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000469 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000470 else:
471 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000472
473 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000474 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
475 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000476
Jack Jansenab5320b2002-06-26 15:42:49 +0000477 # These are used by the extension module build
478 g['srcdir'] = ':'
Greg Ward879f0f12000-09-15 01:15:08 +0000479 global _config_vars
480 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000481
Fred Drake69e2c6e2000-02-08 15:55:42 +0000482
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000483def _init_os2():
484 """Initialize the module as appropriate for OS/2"""
485 g = {}
486 # set basic install directories
487 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
488 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
489
490 # XXX hmmm.. a normal install puts include files here
491 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
492
493 g['SO'] = '.pyd'
494 g['EXE'] = ".exe"
495
496 global _config_vars
497 _config_vars = g
498
499
Greg Ward879f0f12000-09-15 01:15:08 +0000500def get_config_vars(*args):
501 """With no arguments, return a dictionary of all configuration
502 variables relevant for the current platform. Generally this includes
503 everything needed to build extensions and install both pure modules and
504 extensions. On Unix, this means every variable defined in Python's
505 installed Makefile; on Windows and Mac OS it's a much smaller set.
506
507 With arguments, return a list of values that result from looking up
508 each argument in the configuration variable dictionary.
509 """
510 global _config_vars
511 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000512 func = globals().get("_init_" + os.name)
513 if func:
514 func()
515 else:
516 _config_vars = {}
517
518 # Normalized versions of prefix and exec_prefix are handy to have;
519 # in fact, these are the standard versions used most places in the
520 # Distutils.
521 _config_vars['prefix'] = PREFIX
522 _config_vars['exec_prefix'] = EXEC_PREFIX
523
Ronald Oussorenb02daf72006-05-23 12:01:11 +0000524 if sys.platform == 'darwin':
525 kernel_version = os.uname()[2] # Kernel version (8.4.3)
526 major_version = int(kernel_version.split('.')[0])
527
528 if major_version < 8:
529 # On Mac OS X before 10.4, check if -arch and -isysroot
530 # are in CFLAGS or LDFLAGS and remove them if they are.
531 # This is needed when building extensions on a 10.3 system
532 # using a universal build of python.
Ronald Oussorend6103692006-10-08 17:49:52 +0000533 for key in ('LDFLAGS', 'BASECFLAGS',
534 # a number of derived variables. These need to be
535 # patched up as well.
536 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
Ronald Oussorenb02daf72006-05-23 12:01:11 +0000537 flags = _config_vars[key]
538 flags = re.sub('-arch\s+\w+\s', ' ', flags)
Ronald Oussoren7b9053a2006-06-27 10:08:25 +0000539 flags = re.sub('-isysroot [^ \t]*', ' ', flags)
Ronald Oussorenb02daf72006-05-23 12:01:11 +0000540 _config_vars[key] = flags
541
Ronald Oussoren5640ce22008-06-05 12:58:24 +0000542 else:
543
544 # Allow the user to override the architecture flags using
545 # an environment variable.
546 # NOTE: This name was introduced by Apple in OSX 10.5 and
547 # is used by several scripting languages distributed with
548 # that OS release.
549
550 if 'ARCHFLAGS' in os.environ:
551 arch = os.environ['ARCHFLAGS']
552 for key in ('LDFLAGS', 'BASECFLAGS',
553 # a number of derived variables. These need to be
554 # patched up as well.
555 'CFLAGS', 'PY_CFLAGS', 'BLDSHARED'):
556
557 flags = _config_vars[key]
558 flags = re.sub('-arch\s+\w+\s', ' ', flags)
559 flags = flags + ' ' + arch
560 _config_vars[key] = flags
561
Greg Ward879f0f12000-09-15 01:15:08 +0000562 if args:
563 vals = []
564 for name in args:
565 vals.append(_config_vars.get(name))
566 return vals
567 else:
568 return _config_vars
569
570def get_config_var(name):
571 """Return the value of a single variable using the dictionary
572 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000573 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000574 """
575 return get_config_vars().get(name)