blob: d773f1490543fab797bb5e2a22782c732a7fb1ed [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>
10Initial date: 17-Dec-1998
11"""
12
Greg Ward82d71ca2000-06-03 00:44:30 +000013__revision__ = "$Id$"
Greg Ward1190ee31998-12-18 23:46:33 +000014
Greg Ward9ddaaa11999-01-06 14:46:06 +000015import os
16import re
17import string
18import sys
Greg Ward1190ee31998-12-18 23:46:33 +000019
Fred Drakec1ee39a2000-03-09 15:54:52 +000020from errors import DistutilsPlatformError
Greg Warda0ca3f22000-02-02 00:05:14 +000021
Greg Ward879f0f12000-09-15 01:15:08 +000022# These are needed in a couple of spots, so just compute them once.
Greg Wardcf6bea32000-04-10 01:15:06 +000023PREFIX = os.path.normpath(sys.prefix)
24EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
Fred Drakec1ee39a2000-03-09 15:54:52 +000025
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000026# Boolean; if it's true, we're still building Python, so
27# we use different (hard-wired) directories.
28
29python_build = 0
30
31def set_python_build():
Fred Drakec916cdc2001-08-02 20:03:12 +000032 """Set the python_build flag to true.
33
34 This means that we're building Python itself. Only called from
35 the setup.py script shipped with Python.
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000036 """
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000037 global python_build
38 python_build = 1
Fred Drakec1ee39a2000-03-09 15:54:52 +000039
Fred Drakec916cdc2001-08-02 20:03:12 +000040
Greg Wardd38e6f72000-04-10 01:17:49 +000041def get_python_inc(plat_specific=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000042 """Return the directory containing installed Python header files.
Fred Drakec1ee39a2000-03-09 15:54:52 +000043
44 If 'plat_specific' is false (the default), this is the path to the
45 non-platform-specific header files, i.e. Python.h and so on;
46 otherwise, this is the path to platform-specific header files
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000047 (namely pyconfig.h).
Fred Drakec1ee39a2000-03-09 15:54:52 +000048
Greg Wardd38e6f72000-04-10 01:17:49 +000049 If 'prefix' is supplied, use it instead of sys.prefix or
50 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakeb94b8492001-12-06 20:51:35 +000051 """
Greg Wardd38e6f72000-04-10 01:17:49 +000052 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000053 prefix = plat_specific and EXEC_PREFIX or PREFIX
Greg Ward7d73b9e2000-03-09 03:16:05 +000054 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000055 if python_build:
56 return "Include/"
Greg Wardcf6bea32000-04-10 01:15:06 +000057 return os.path.join(prefix, "include", "python" + sys.version[:3])
Greg Ward7d73b9e2000-03-09 03:16:05 +000058 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000059 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000060 elif os.name == "mac":
Greg Wardcf6bea32000-04-10 01:15:06 +000061 return os.path.join(prefix, "Include")
Marc-André Lemburg2544f512002-01-31 18:56:00 +000062 elif os.name == "os2":
63 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000064 else:
Fred Drake70b014d2001-07-18 18:39:56 +000065 raise DistutilsPlatformError(
66 "I don't know where Python installs its C header files "
67 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +000068
69
Greg Wardd38e6f72000-04-10 01:17:49 +000070def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000071 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +000072 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +000073
Fred Drakec1ee39a2000-03-09 15:54:52 +000074 If 'plat_specific' is true, return the directory containing
75 platform-specific modules, i.e. any module from a non-pure-Python
76 module distribution; otherwise, return the platform-shared library
77 directory. If 'standard_lib' is true, return the directory
78 containing standard Python library modules; otherwise, return the
79 directory for site-specific modules.
80
Greg Wardd38e6f72000-04-10 01:17:49 +000081 If 'prefix' is supplied, use it instead of sys.prefix or
82 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +000083 """
Greg Wardd38e6f72000-04-10 01:17:49 +000084 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000085 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +000086
Greg Ward7d73b9e2000-03-09 03:16:05 +000087 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +000088 libpython = os.path.join(prefix,
Fred Drakec1ee39a2000-03-09 15:54:52 +000089 "lib", "python" + sys.version[:3])
Greg Ward7d73b9e2000-03-09 03:16:05 +000090 if standard_lib:
91 return libpython
92 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +000093 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +000094
95 elif os.name == "nt":
96 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +000097 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +000098 else:
Greg Wardf17efb92001-08-23 20:53:27 +000099 if sys.version < "2.2":
100 return prefix
101 else:
102 return os.path.join(PREFIX, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000103
104 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000105 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000106 if standard_lib:
Jack Jansen212a2e12001-09-04 12:01:49 +0000107 return os.path.join(prefix, "Lib", "lib-dynload")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000108 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000109 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000110 else:
111 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000112 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000113 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000114 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000115
116 elif os.name == "os2":
117 if standard_lib:
118 return os.path.join(PREFIX, "Lib")
119 else:
120 return os.path.join(PREFIX, "Lib", "site-packages")
121
Greg Ward7d73b9e2000-03-09 03:16:05 +0000122 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000123 raise DistutilsPlatformError(
124 "I don't know where Python installs its library "
125 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000126
Greg Ward7d73b9e2000-03-09 03:16:05 +0000127
Fred Drake70b014d2001-07-18 18:39:56 +0000128def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000129 """Do any platform-specific customization of a CCompiler instance.
130
131 Mainly needed on Unix, so we can plug in the information that
132 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000133 """
134 if compiler.compiler_type == "unix":
Greg Ward879f0f12000-09-15 01:15:08 +0000135 (cc, opt, ccshared, ldshared, so_ext) = \
136 get_config_vars('CC', 'OPT', 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000137
Greg Ward879f0f12000-09-15 01:15:08 +0000138 cc_cmd = cc + ' ' + opt
139 compiler.set_executables(
140 preprocessor=cc + " -E", # not always!
141 compiler=cc_cmd,
142 compiler_so=cc_cmd + ' ' + ccshared,
143 linker_so=ldshared,
144 linker_exe=cc)
145
146 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000147
148
Greg Ward9ddaaa11999-01-06 14:46:06 +0000149def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000150 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000151 if python_build:
152 inc_dir = os.curdir
153 else:
154 inc_dir = get_python_inc(plat_specific=1)
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000155 if sys.version < '2.2':
156 config_h = 'config.h'
157 else:
158 # The name of the config.h file changed in 2.2
159 config_h = 'pyconfig.h'
160 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000161
Greg Ward1190ee31998-12-18 23:46:33 +0000162
Greg Ward9ddaaa11999-01-06 14:46:06 +0000163def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000164 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000165 if python_build:
Neil Schemenauer84d14ba2001-01-24 17:17:20 +0000166 return './Makefile'
Fred Drakec1ee39a2000-03-09 15:54:52 +0000167 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
168 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000169
Greg Ward1190ee31998-12-18 23:46:33 +0000170
Greg Ward9ddaaa11999-01-06 14:46:06 +0000171def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000172 """Parse a config.h-style file.
173
174 A dictionary containing name/value pairs is returned. If an
175 optional dictionary is passed in as the second argument, it is
176 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000177 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000178 if g is None:
179 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000180 define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n")
181 undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000182 #
Greg Ward1190ee31998-12-18 23:46:33 +0000183 while 1:
184 line = fp.readline()
185 if not line:
186 break
187 m = define_rx.match(line)
188 if m:
189 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000190 try: v = string.atoi(v)
191 except ValueError: pass
192 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000193 else:
194 m = undef_rx.match(line)
195 if m:
196 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000197 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000198
Greg Wardd283ce72000-09-17 00:53:02 +0000199
200# Regexes needed for parsing Makefile (and similar syntaxes,
201# like old-style Setup files).
202_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
203_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
204_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
205
Greg Ward3fff8d22000-09-15 00:03:13 +0000206def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000207 """Parse a Makefile-style file.
208
209 A dictionary containing name/value pairs is returned. If an
210 optional dictionary is passed in as the second argument, it is
211 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000212 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000213 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000214 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000215
Greg Ward9ddaaa11999-01-06 14:46:06 +0000216 if g is None:
217 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000218 done = {}
219 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000220
Greg Ward1190ee31998-12-18 23:46:33 +0000221 while 1:
222 line = fp.readline()
Greg Wardd283ce72000-09-17 00:53:02 +0000223 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000224 break
Greg Wardd283ce72000-09-17 00:53:02 +0000225 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000226 if m:
227 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000228 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +0000229 if "$" in v:
230 notdone[n] = v
231 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000232 try: v = string.atoi(v)
233 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +0000234 done[n] = v
235
236 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000237 while notdone:
238 for name in notdone.keys():
239 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000240 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000241 if m:
242 n = m.group(1)
243 if done.has_key(n):
244 after = value[m.end():]
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000245 value = value[:m.start()] + str(done[n]) + after
Greg Ward1190ee31998-12-18 23:46:33 +0000246 if "$" in after:
247 notdone[name] = value
248 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000249 try: value = string.atoi(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000250 except ValueError:
251 done[name] = string.strip(value)
252 else:
253 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000254 del notdone[name]
255 elif notdone.has_key(n):
256 # get it on a subsequent round
257 pass
258 else:
259 done[n] = ""
260 after = value[m.end():]
261 value = value[:m.start()] + after
262 if "$" in after:
263 notdone[name] = value
264 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000265 try: value = string.atoi(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000266 except ValueError:
267 done[name] = string.strip(value)
268 else:
269 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000270 del notdone[name]
271 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000272 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000273 del notdone[name]
274
Greg Wardd283ce72000-09-17 00:53:02 +0000275 fp.close()
276
Greg Ward1190ee31998-12-18 23:46:33 +0000277 # save the results in the global dictionary
278 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000279 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000280
281
Greg Wardd283ce72000-09-17 00:53:02 +0000282def expand_makefile_vars(s, vars):
283 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
284 'string' according to 'vars' (a dictionary mapping variable names to
285 values). Variables not present in 'vars' are silently expanded to the
286 empty string. The variable values in 'vars' should not contain further
287 variable expansions; if 'vars' is the output of 'parse_makefile()',
288 you're fine. Returns a variable-expanded version of 's'.
289 """
290
291 # This algorithm does multiple expansion, so if vars['foo'] contains
292 # "${bar}", it will expand ${foo} to ${bar}, and then expand
293 # ${bar}... and so forth. This is fine as long as 'vars' comes from
294 # 'parse_makefile()', which takes care of such expansions eagerly,
295 # according to make's variable expansion semantics.
296
297 while 1:
298 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
299 if m:
300 name = m.group(1)
301 (beg, end) = m.span()
302 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
303 else:
304 break
305 return s
306
307
Greg Ward879f0f12000-09-15 01:15:08 +0000308_config_vars = None
309
Greg Ward9ddaaa11999-01-06 14:46:06 +0000310def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000311 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000312 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000313 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000314 try:
315 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000316 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000317 except IOError, msg:
318 my_msg = "invalid Python installation: unable to open %s" % filename
319 if hasattr(msg, "strerror"):
320 my_msg = my_msg + " (%s)" % msg.strerror
321
Fred Drake70b014d2001-07-18 18:39:56 +0000322 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000323
324
Greg Ward4f880282000-06-27 01:59:06 +0000325 # On AIX, there are wrong paths to the linker scripts in the Makefile
326 # -- these paths are relative to the Python source, but when installed
327 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000328 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000329 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000330
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000331 elif sys.version < '2.1':
332 # The following two branches are for 1.5.2 compatibility.
333 if sys.platform == 'aix4': # what about AIX 3.x ?
334 # Linker script is in the config directory, not in Modules as the
335 # Makefile says.
336 python_lib = get_python_lib(standard_lib=1)
337 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
338 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000339
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000340 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
341
342 elif sys.platform == 'beos':
343 # Linker script is in the config directory. In the Makefile it is
344 # relative to the srcdir, which after installation no longer makes
345 # sense.
346 python_lib = get_python_lib(standard_lib=1)
347 linkerscript_name = os.path.basename(string.split(g['LDSHARED'])[0])
348 linkerscript = os.path.join(python_lib, 'config', linkerscript_name)
Fred Drakeb94b8492001-12-06 20:51:35 +0000349
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000350 # XXX this isn't the right place to do this: adding the Python
351 # library to the link, if needed, should be in the "build_ext"
352 # command. (It's also needed for non-MS compilers on Windows, and
353 # it's taken care of for them by the 'build_ext.get_libraries()'
354 # method.)
355 g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
356 (linkerscript, PREFIX, sys.version[0:3]))
Fred Drakeb94b8492001-12-06 20:51:35 +0000357
Greg Ward879f0f12000-09-15 01:15:08 +0000358 global _config_vars
359 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000360
Greg Ward9ddaaa11999-01-06 14:46:06 +0000361
Greg Ward4d74d731999-06-08 01:58:36 +0000362def _init_nt():
363 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000364 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000365 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000366 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
367 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000368
Greg Ward32162e81999-08-29 18:22:13 +0000369 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000370 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000371
Fred Drake69e2c6e2000-02-08 15:55:42 +0000372 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000373 g['EXE'] = ".exe"
Greg Ward879f0f12000-09-15 01:15:08 +0000374
375 global _config_vars
376 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000377
Fred Drake69e2c6e2000-02-08 15:55:42 +0000378
Greg Ward0eff87a2000-03-07 03:30:09 +0000379def _init_mac():
380 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000381 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000382 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000383 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
384 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000385
386 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000387 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000388
Jack Jansendd13a202001-05-17 12:52:01 +0000389 import MacOS
390 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000391 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000392 else:
393 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000394
395 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000396 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
397 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000398
Greg Ward879f0f12000-09-15 01:15:08 +0000399 global _config_vars
400 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000401
Fred Drake69e2c6e2000-02-08 15:55:42 +0000402
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000403def _init_os2():
404 """Initialize the module as appropriate for OS/2"""
405 g = {}
406 # set basic install directories
407 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
408 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
409
410 # XXX hmmm.. a normal install puts include files here
411 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
412
413 g['SO'] = '.pyd'
414 g['EXE'] = ".exe"
415
416 global _config_vars
417 _config_vars = g
418
419
Greg Ward879f0f12000-09-15 01:15:08 +0000420def get_config_vars(*args):
421 """With no arguments, return a dictionary of all configuration
422 variables relevant for the current platform. Generally this includes
423 everything needed to build extensions and install both pure modules and
424 extensions. On Unix, this means every variable defined in Python's
425 installed Makefile; on Windows and Mac OS it's a much smaller set.
426
427 With arguments, return a list of values that result from looking up
428 each argument in the configuration variable dictionary.
429 """
430 global _config_vars
431 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000432 func = globals().get("_init_" + os.name)
433 if func:
434 func()
435 else:
436 _config_vars = {}
437
438 # Normalized versions of prefix and exec_prefix are handy to have;
439 # in fact, these are the standard versions used most places in the
440 # Distutils.
441 _config_vars['prefix'] = PREFIX
442 _config_vars['exec_prefix'] = EXEC_PREFIX
443
444 if args:
445 vals = []
446 for name in args:
447 vals.append(_config_vars.get(name))
448 return vals
449 else:
450 return _config_vars
451
452def get_config_var(name):
453 """Return the value of a single variable using the dictionary
454 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000455 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000456 """
457 return get_config_vars().get(name)