blob: 1bd62097f04e95344c2f9168e49aed1902642a2b [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
Fred Drakec1ee39a2000-03-09 15:54:52 +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
Fred Drake16c8d702002-06-04 15:28:21 +000025# python_build: (Boolean) if true, we're either building Python or
26# building an extension with an un-installed Python, so we use
27# different (hard-wired) directories.
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000028
Fred Drake16c8d702002-06-04 15:28:21 +000029argv0_path = os.path.dirname(os.path.abspath(sys.executable))
30landmark = os.path.join(argv0_path, "Modules", "Setup")
Michael W. Hudson6b7d69d2002-07-12 09:16:44 +000031
32python_build = os.path.isfile(landmark)
33
Fred Drake16c8d702002-06-04 15:28:21 +000034del argv0_path, landmark
Fred Drakec1ee39a2000-03-09 15:54:52 +000035
Fred Drakec916cdc2001-08-02 20:03:12 +000036
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000037def get_python_version():
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +000038 """Return a string containing the major and minor Python version,
39 leaving off the patchlevel. Sample return values could be '1.5'
40 or '2.2'.
41 """
42 return sys.version[:3]
43
44
Greg Wardd38e6f72000-04-10 01:17:49 +000045def get_python_inc(plat_specific=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000046 """Return the directory containing installed Python header files.
Fred Drakec1ee39a2000-03-09 15:54:52 +000047
48 If 'plat_specific' is false (the default), this is the path to the
49 non-platform-specific header files, i.e. Python.h and so on;
50 otherwise, this is the path to platform-specific header files
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000051 (namely pyconfig.h).
Fred Drakec1ee39a2000-03-09 15:54:52 +000052
Greg Wardd38e6f72000-04-10 01:17:49 +000053 If 'prefix' is supplied, use it instead of sys.prefix or
54 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakeb94b8492001-12-06 20:51:35 +000055 """
Greg Wardd38e6f72000-04-10 01:17:49 +000056 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000057 prefix = plat_specific and EXEC_PREFIX or PREFIX
Greg Ward7d73b9e2000-03-09 03:16:05 +000058 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000059 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +000060 base = os.path.dirname(os.path.abspath(sys.executable))
61 if plat_specific:
62 inc_dir = base
63 else:
64 inc_dir = os.path.join(base, "Include")
65 if not os.path.exists(inc_dir):
66 inc_dir = os.path.join(os.path.dirname(base), "Include")
67 return inc_dir
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +000068 return os.path.join(prefix, "include", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +000069 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000070 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000071 elif os.name == "mac":
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000072 if plat_specific:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000073 return os.path.join(prefix, "Mac", "Include")
Neal Norwitz80a3e0a2002-06-26 22:05:33 +000074 else:
Martin v. Löwis23b44a32003-10-24 20:09:23 +000075 return os.path.join(prefix, "Include")
Marc-André Lemburg2544f512002-01-31 18:56:00 +000076 elif os.name == "os2":
77 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000078 else:
Fred Drake70b014d2001-07-18 18:39:56 +000079 raise DistutilsPlatformError(
80 "I don't know where Python installs its C header files "
81 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +000082
83
Greg Wardd38e6f72000-04-10 01:17:49 +000084def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000085 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +000086 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +000087
Fred Drakec1ee39a2000-03-09 15:54:52 +000088 If 'plat_specific' is true, return the directory containing
89 platform-specific modules, i.e. any module from a non-pure-Python
90 module distribution; otherwise, return the platform-shared library
91 directory. If 'standard_lib' is true, return the directory
92 containing standard Python library modules; otherwise, return the
93 directory for site-specific modules.
94
Greg Wardd38e6f72000-04-10 01:17:49 +000095 If 'prefix' is supplied, use it instead of sys.prefix or
96 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +000097 """
Greg Wardd38e6f72000-04-10 01:17:49 +000098 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000099 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +0000100
Greg Ward7d73b9e2000-03-09 03:16:05 +0000101 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +0000102 libpython = os.path.join(prefix,
Andrew M. Kuchling0ff98b92002-11-14 01:43:00 +0000103 "lib", "python" + get_python_version())
Greg Ward7d73b9e2000-03-09 03:16:05 +0000104 if standard_lib:
105 return libpython
106 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +0000107 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000108
109 elif os.name == "nt":
110 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000111 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000112 else:
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000113 if get_python_version() < "2.2":
Greg Wardf17efb92001-08-23 20:53:27 +0000114 return prefix
115 else:
116 return os.path.join(PREFIX, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000117
118 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000119 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000120 if standard_lib:
Jack Jansen212a2e12001-09-04 12:01:49 +0000121 return os.path.join(prefix, "Lib", "lib-dynload")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000122 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000123 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000124 else:
125 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000126 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000127 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000128 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000129
130 elif os.name == "os2":
131 if standard_lib:
132 return os.path.join(PREFIX, "Lib")
133 else:
134 return os.path.join(PREFIX, "Lib", "site-packages")
135
Greg Ward7d73b9e2000-03-09 03:16:05 +0000136 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000137 raise DistutilsPlatformError(
138 "I don't know where Python installs its library "
139 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000140
Greg Ward7d73b9e2000-03-09 03:16:05 +0000141
Fred Drake70b014d2001-07-18 18:39:56 +0000142def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000143 """Do any platform-specific customization of a CCompiler instance.
144
145 Mainly needed on Unix, so we can plug in the information that
146 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000147 """
148 if compiler.compiler_type == "unix":
Brett Cannon08cd5982005-04-24 22:26:38 +0000149 (cc, cxx, opt, extra_cflags, basecflags, ccshared, ldshared, so_ext) = \
150 get_config_vars('CC', 'CXX', 'OPT', 'EXTRA_CFLAGS', 'BASECFLAGS',
151 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000152
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000153 if os.environ.has_key('CC'):
154 cc = os.environ['CC']
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000155 if os.environ.has_key('CXX'):
156 cxx = os.environ['CXX']
Anthony Baxter22dcf662004-10-13 15:54:17 +0000157 if os.environ.has_key('LDSHARED'):
158 ldshared = os.environ['LDSHARED']
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000159 if os.environ.has_key('CPP'):
160 cpp = os.environ['CPP']
161 else:
162 cpp = cc + " -E" # not always
163 if os.environ.has_key('LDFLAGS'):
164 ldshared = ldshared + ' ' + os.environ['LDFLAGS']
Jack Jansen4f82a512003-02-10 14:02:33 +0000165 if basecflags:
Martin v. Löwis23b44a32003-10-24 20:09:23 +0000166 opt = basecflags + ' ' + opt
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000167 if os.environ.has_key('CFLAGS'):
168 opt = opt + ' ' + os.environ['CFLAGS']
169 ldshared = ldshared + ' ' + os.environ['CFLAGS']
170 if os.environ.has_key('CPPFLAGS'):
171 cpp = cpp + ' ' + os.environ['CPPFLAGS']
172 opt = opt + ' ' + os.environ['CPPFLAGS']
173 ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
174
Brett Cannon08cd5982005-04-24 22:26:38 +0000175 cc_cmd = ' '.join(str(x) for x in (cc, opt, extra_cflags) if x)
Greg Ward879f0f12000-09-15 01:15:08 +0000176 compiler.set_executables(
Andrew M. Kuchling29c86232002-11-04 19:53:24 +0000177 preprocessor=cpp,
Greg Ward879f0f12000-09-15 01:15:08 +0000178 compiler=cc_cmd,
179 compiler_so=cc_cmd + ' ' + ccshared,
Gustavo Niemeyer6b016852002-11-05 16:12:02 +0000180 compiler_cxx=cxx,
Greg Ward879f0f12000-09-15 01:15:08 +0000181 linker_so=ldshared,
182 linker_exe=cc)
183
184 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000185
186
Greg Ward9ddaaa11999-01-06 14:46:06 +0000187def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000188 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000189 if python_build:
190 inc_dir = os.curdir
191 else:
192 inc_dir = get_python_inc(plat_specific=1)
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000193 if get_python_version() < '2.2':
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000194 config_h = 'config.h'
195 else:
196 # The name of the config.h file changed in 2.2
197 config_h = 'pyconfig.h'
198 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000199
Greg Ward1190ee31998-12-18 23:46:33 +0000200
Greg Ward9ddaaa11999-01-06 14:46:06 +0000201def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000202 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000203 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +0000204 return os.path.join(os.path.dirname(sys.executable), "Makefile")
Fred Drakec1ee39a2000-03-09 15:54:52 +0000205 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
206 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000207
Greg Ward1190ee31998-12-18 23:46:33 +0000208
Greg Ward9ddaaa11999-01-06 14:46:06 +0000209def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000210 """Parse a config.h-style file.
211
212 A dictionary containing name/value pairs is returned. If an
213 optional dictionary is passed in as the second argument, it is
214 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000215 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000216 if g is None:
217 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000218 define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n")
219 undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000220 #
Greg Ward1190ee31998-12-18 23:46:33 +0000221 while 1:
222 line = fp.readline()
223 if not line:
224 break
225 m = define_rx.match(line)
226 if m:
227 n, v = m.group(1, 2)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000228 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000229 except ValueError: pass
230 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000231 else:
232 m = undef_rx.match(line)
233 if m:
234 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000235 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000236
Greg Wardd283ce72000-09-17 00:53:02 +0000237
238# Regexes needed for parsing Makefile (and similar syntaxes,
239# like old-style Setup files).
240_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
241_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
242_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
243
Greg Ward3fff8d22000-09-15 00:03:13 +0000244def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000245 """Parse a Makefile-style file.
246
247 A dictionary containing name/value pairs is returned. If an
248 optional dictionary is passed in as the second argument, it is
249 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000250 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000251 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000252 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000253
Greg Ward9ddaaa11999-01-06 14:46:06 +0000254 if g is None:
255 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000256 done = {}
257 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000258
Greg Ward1190ee31998-12-18 23:46:33 +0000259 while 1:
260 line = fp.readline()
Greg Wardd283ce72000-09-17 00:53:02 +0000261 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000262 break
Greg Wardd283ce72000-09-17 00:53:02 +0000263 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000264 if m:
265 n, v = m.group(1, 2)
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000266 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +0000267 if "$" in v:
268 notdone[n] = v
269 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000270 try: v = int(v)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000271 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +0000272 done[n] = v
273
274 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000275 while notdone:
276 for name in notdone.keys():
277 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000278 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000279 if m:
280 n = m.group(1)
281 if done.has_key(n):
282 after = value[m.end():]
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000283 value = value[:m.start()] + str(done[n]) + after
Greg Ward1190ee31998-12-18 23:46:33 +0000284 if "$" in after:
285 notdone[name] = value
286 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000287 try: value = int(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000288 except ValueError:
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000289 done[name] = string.strip(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000290 else:
291 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000292 del notdone[name]
293 elif notdone.has_key(n):
294 # get it on a subsequent round
295 pass
296 else:
297 done[n] = ""
298 after = value[m.end():]
299 value = value[:m.start()] + after
300 if "$" in after:
301 notdone[name] = value
302 else:
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000303 try: value = int(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000304 except ValueError:
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000305 done[name] = string.strip(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000306 else:
307 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000308 del notdone[name]
309 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000310 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000311 del notdone[name]
312
Greg Wardd283ce72000-09-17 00:53:02 +0000313 fp.close()
314
Greg Ward1190ee31998-12-18 23:46:33 +0000315 # save the results in the global dictionary
316 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000317 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000318
319
Greg Wardd283ce72000-09-17 00:53:02 +0000320def expand_makefile_vars(s, vars):
321 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
322 'string' according to 'vars' (a dictionary mapping variable names to
323 values). Variables not present in 'vars' are silently expanded to the
324 empty string. The variable values in 'vars' should not contain further
325 variable expansions; if 'vars' is the output of 'parse_makefile()',
326 you're fine. Returns a variable-expanded version of 's'.
327 """
328
329 # This algorithm does multiple expansion, so if vars['foo'] contains
330 # "${bar}", it will expand ${foo} to ${bar}, and then expand
331 # ${bar}... and so forth. This is fine as long as 'vars' comes from
332 # 'parse_makefile()', which takes care of such expansions eagerly,
333 # according to make's variable expansion semantics.
334
335 while 1:
336 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
337 if m:
Greg Wardd283ce72000-09-17 00:53:02 +0000338 (beg, end) = m.span()
339 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
340 else:
341 break
342 return s
343
344
Greg Ward879f0f12000-09-15 01:15:08 +0000345_config_vars = None
346
Greg Ward9ddaaa11999-01-06 14:46:06 +0000347def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000348 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000349 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000350 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000351 try:
352 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000353 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000354 except IOError, msg:
355 my_msg = "invalid Python installation: unable to open %s" % filename
356 if hasattr(msg, "strerror"):
357 my_msg = my_msg + " (%s)" % msg.strerror
358
Fred Drake70b014d2001-07-18 18:39:56 +0000359 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000360
Jack Jansen6b08a402004-06-03 12:41:45 +0000361 # On MacOSX we need to check the setting of the environment variable
362 # MACOSX_DEPLOYMENT_TARGET: configure bases some choices on it so
363 # it needs to be compatible.
Jack Jansenbe954622004-12-26 23:07:48 +0000364 # If it isn't set we set it to the configure-time value
Jack Jansen6b08a402004-06-03 12:41:45 +0000365 if sys.platform == 'darwin' and g.has_key('CONFIGURE_MACOSX_DEPLOYMENT_TARGET'):
366 cfg_target = g['CONFIGURE_MACOSX_DEPLOYMENT_TARGET']
367 cur_target = os.getenv('MACOSX_DEPLOYMENT_TARGET', '')
Jack Jansenbe954622004-12-26 23:07:48 +0000368 if cur_target == '':
369 cur_target = cfg_target
370 os.putenv('MACOSX_DEPLOYMENT_TARGET', cfg_target)
Jack Jansen6b08a402004-06-03 12:41:45 +0000371 if cfg_target != cur_target:
372 my_msg = ('$MACOSX_DEPLOYMENT_TARGET mismatch: now "%s" but "%s" during configure'
373 % (cur_target, cfg_target))
374 raise DistutilsPlatformError(my_msg)
Tim Peters182b5ac2004-07-18 06:16:08 +0000375
Greg Ward4f880282000-06-27 01:59:06 +0000376 # On AIX, there are wrong paths to the linker scripts in the Makefile
377 # -- these paths are relative to the Python source, but when installed
378 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000379 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000380 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000381
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000382 elif get_python_version() < '2.1':
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000383 # The following two branches are for 1.5.2 compatibility.
384 if sys.platform == 'aix4': # what about AIX 3.x ?
385 # Linker script is in the config directory, not in Modules as the
386 # Makefile says.
387 python_lib = get_python_lib(standard_lib=1)
388 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
389 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000390
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000391 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
392
393 elif sys.platform == 'beos':
394 # Linker script is in the config directory. In the Makefile it is
395 # relative to the srcdir, which after installation no longer makes
396 # sense.
397 python_lib = get_python_lib(standard_lib=1)
Andrew M. Kuchling33635aa2002-11-13 17:03:05 +0000398 linkerscript_path = string.split(g['LDSHARED'])[0]
399 linkerscript_name = os.path.basename(linkerscript_path)
Jeremy Hyltona5f4c072002-11-05 20:11:08 +0000400 linkerscript = os.path.join(python_lib, 'config',
401 linkerscript_name)
Fred Drakeb94b8492001-12-06 20:51:35 +0000402
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000403 # XXX this isn't the right place to do this: adding the Python
404 # library to the link, if needed, should be in the "build_ext"
405 # command. (It's also needed for non-MS compilers on Windows, and
406 # it's taken care of for them by the 'build_ext.get_libraries()'
407 # method.)
408 g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
Martin v. Löwisdf37c8c2005-03-03 11:08:03 +0000409 (linkerscript, PREFIX, get_python_version()))
Fred Drakeb94b8492001-12-06 20:51:35 +0000410
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"
Greg Ward879f0f12000-09-15 01:15:08 +0000427
428 global _config_vars
429 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000430
Fred Drake69e2c6e2000-02-08 15:55:42 +0000431
Greg Ward0eff87a2000-03-07 03:30:09 +0000432def _init_mac():
433 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000434 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000435 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000436 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
437 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000438
439 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000440 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000441
Jack Jansendd13a202001-05-17 12:52:01 +0000442 import MacOS
443 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000444 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000445 else:
446 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000447
448 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000449 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
450 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000451
Jack Jansenab5320b2002-06-26 15:42:49 +0000452 # These are used by the extension module build
453 g['srcdir'] = ':'
Greg Ward879f0f12000-09-15 01:15:08 +0000454 global _config_vars
455 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000456
Fred Drake69e2c6e2000-02-08 15:55:42 +0000457
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000458def _init_os2():
459 """Initialize the module as appropriate for OS/2"""
460 g = {}
461 # set basic install directories
462 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
463 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
464
465 # XXX hmmm.. a normal install puts include files here
466 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
467
468 g['SO'] = '.pyd'
469 g['EXE'] = ".exe"
470
471 global _config_vars
472 _config_vars = g
473
474
Greg Ward879f0f12000-09-15 01:15:08 +0000475def get_config_vars(*args):
476 """With no arguments, return a dictionary of all configuration
477 variables relevant for the current platform. Generally this includes
478 everything needed to build extensions and install both pure modules and
479 extensions. On Unix, this means every variable defined in Python's
480 installed Makefile; on Windows and Mac OS it's a much smaller set.
481
482 With arguments, return a list of values that result from looking up
483 each argument in the configuration variable dictionary.
484 """
485 global _config_vars
486 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000487 func = globals().get("_init_" + os.name)
488 if func:
489 func()
490 else:
491 _config_vars = {}
492
493 # Normalized versions of prefix and exec_prefix are handy to have;
494 # in fact, these are the standard versions used most places in the
495 # Distutils.
496 _config_vars['prefix'] = PREFIX
497 _config_vars['exec_prefix'] = EXEC_PREFIX
498
499 if args:
500 vals = []
501 for name in args:
502 vals.append(_config_vars.get(name))
503 return vals
504 else:
505 return _config_vars
506
507def get_config_var(name):
508 """Return the value of a single variable using the dictionary
509 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000510 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000511 """
512 return get_config_vars().get(name)