blob: 3e323533b6e80a2adf7b0267bf380382abd8044e [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
Fred Drake16c8d702002-06-04 15:28:21 +000026# python_build: (Boolean) if true, we're either building Python or
27# building an extension with an un-installed Python, so we use
28# different (hard-wired) directories.
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000029
Fred Drake16c8d702002-06-04 15:28:21 +000030argv0_path = os.path.dirname(os.path.abspath(sys.executable))
31landmark = os.path.join(argv0_path, "Modules", "Setup")
32if not os.path.isfile(landmark):
33 python_build = 0
34elif os.path.isfile(os.path.join(argv0_path, "Lib", "os.py")):
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000035 python_build = 1
Fred Drake16c8d702002-06-04 15:28:21 +000036else:
37 python_build = os.path.isfile(os.path.join(os.path.dirname(argv0_path),
38 "Lib", "os.py"))
39del argv0_path, landmark
Fred Drakec1ee39a2000-03-09 15:54:52 +000040
Fred Drakec916cdc2001-08-02 20:03:12 +000041
Greg Wardd38e6f72000-04-10 01:17:49 +000042def get_python_inc(plat_specific=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000043 """Return the directory containing installed Python header files.
Fred Drakec1ee39a2000-03-09 15:54:52 +000044
45 If 'plat_specific' is false (the default), this is the path to the
46 non-platform-specific header files, i.e. Python.h and so on;
47 otherwise, this is the path to platform-specific header files
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +000048 (namely pyconfig.h).
Fred Drakec1ee39a2000-03-09 15:54:52 +000049
Greg Wardd38e6f72000-04-10 01:17:49 +000050 If 'prefix' is supplied, use it instead of sys.prefix or
51 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakeb94b8492001-12-06 20:51:35 +000052 """
Greg Wardd38e6f72000-04-10 01:17:49 +000053 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000054 prefix = plat_specific and EXEC_PREFIX or PREFIX
Greg Ward7d73b9e2000-03-09 03:16:05 +000055 if os.name == "posix":
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +000056 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +000057 base = os.path.dirname(os.path.abspath(sys.executable))
58 if plat_specific:
59 inc_dir = base
60 else:
61 inc_dir = os.path.join(base, "Include")
62 if not os.path.exists(inc_dir):
63 inc_dir = os.path.join(os.path.dirname(base), "Include")
64 return inc_dir
Greg Wardcf6bea32000-04-10 01:15:06 +000065 return os.path.join(prefix, "include", "python" + sys.version[:3])
Greg Ward7d73b9e2000-03-09 03:16:05 +000066 elif os.name == "nt":
Fred Drakec916cdc2001-08-02 20:03:12 +000067 return os.path.join(prefix, "include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000068 elif os.name == "mac":
Greg Wardcf6bea32000-04-10 01:15:06 +000069 return os.path.join(prefix, "Include")
Marc-André Lemburg2544f512002-01-31 18:56:00 +000070 elif os.name == "os2":
71 return os.path.join(prefix, "Include")
Greg Ward7d73b9e2000-03-09 03:16:05 +000072 else:
Fred Drake70b014d2001-07-18 18:39:56 +000073 raise DistutilsPlatformError(
74 "I don't know where Python installs its C header files "
75 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +000076
77
Greg Wardd38e6f72000-04-10 01:17:49 +000078def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
Greg Ward7d73b9e2000-03-09 03:16:05 +000079 """Return the directory containing the Python library (standard or
Fred Drakec1ee39a2000-03-09 15:54:52 +000080 site additions).
Greg Ward7d73b9e2000-03-09 03:16:05 +000081
Fred Drakec1ee39a2000-03-09 15:54:52 +000082 If 'plat_specific' is true, return the directory containing
83 platform-specific modules, i.e. any module from a non-pure-Python
84 module distribution; otherwise, return the platform-shared library
85 directory. If 'standard_lib' is true, return the directory
86 containing standard Python library modules; otherwise, return the
87 directory for site-specific modules.
88
Greg Wardd38e6f72000-04-10 01:17:49 +000089 If 'prefix' is supplied, use it instead of sys.prefix or
90 sys.exec_prefix -- i.e., ignore 'plat_specific'.
Fred Drakec1ee39a2000-03-09 15:54:52 +000091 """
Greg Wardd38e6f72000-04-10 01:17:49 +000092 if prefix is None:
Fred Drake70b014d2001-07-18 18:39:56 +000093 prefix = plat_specific and EXEC_PREFIX or PREFIX
Fred Drakec916cdc2001-08-02 20:03:12 +000094
Greg Ward7d73b9e2000-03-09 03:16:05 +000095 if os.name == "posix":
Greg Wardcf6bea32000-04-10 01:15:06 +000096 libpython = os.path.join(prefix,
Fred Drakec1ee39a2000-03-09 15:54:52 +000097 "lib", "python" + sys.version[:3])
Greg Ward7d73b9e2000-03-09 03:16:05 +000098 if standard_lib:
99 return libpython
100 else:
Fred Drakec1ee39a2000-03-09 15:54:52 +0000101 return os.path.join(libpython, "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000102
103 elif os.name == "nt":
104 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000105 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000106 else:
Greg Wardf17efb92001-08-23 20:53:27 +0000107 if sys.version < "2.2":
108 return prefix
109 else:
110 return os.path.join(PREFIX, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000111
112 elif os.name == "mac":
Greg Warddc9fe8a2000-08-02 01:49:40 +0000113 if plat_specific:
Greg Ward7d73b9e2000-03-09 03:16:05 +0000114 if standard_lib:
Jack Jansen212a2e12001-09-04 12:01:49 +0000115 return os.path.join(prefix, "Lib", "lib-dynload")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000116 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000117 return os.path.join(prefix, "Lib", "site-packages")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000118 else:
119 if standard_lib:
Fred Drakec916cdc2001-08-02 20:03:12 +0000120 return os.path.join(prefix, "Lib")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000121 else:
Jack Jansen212a2e12001-09-04 12:01:49 +0000122 return os.path.join(prefix, "Lib", "site-packages")
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000123
124 elif os.name == "os2":
125 if standard_lib:
126 return os.path.join(PREFIX, "Lib")
127 else:
128 return os.path.join(PREFIX, "Lib", "site-packages")
129
Greg Ward7d73b9e2000-03-09 03:16:05 +0000130 else:
Fred Drake70b014d2001-07-18 18:39:56 +0000131 raise DistutilsPlatformError(
132 "I don't know where Python installs its library "
133 "on platform '%s'" % os.name)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000134
Greg Ward7d73b9e2000-03-09 03:16:05 +0000135
Fred Drake70b014d2001-07-18 18:39:56 +0000136def customize_compiler(compiler):
Fred Drakec916cdc2001-08-02 20:03:12 +0000137 """Do any platform-specific customization of a CCompiler instance.
138
139 Mainly needed on Unix, so we can plug in the information that
140 varies across Unices and is stored in Python's Makefile.
Greg Wardbb7baa72000-06-25 02:09:14 +0000141 """
142 if compiler.compiler_type == "unix":
Greg Ward879f0f12000-09-15 01:15:08 +0000143 (cc, opt, ccshared, ldshared, so_ext) = \
144 get_config_vars('CC', 'OPT', 'CCSHARED', 'LDSHARED', 'SO')
Greg Wardbb7baa72000-06-25 02:09:14 +0000145
Greg Ward879f0f12000-09-15 01:15:08 +0000146 cc_cmd = cc + ' ' + opt
147 compiler.set_executables(
148 preprocessor=cc + " -E", # not always!
149 compiler=cc_cmd,
150 compiler_so=cc_cmd + ' ' + ccshared,
151 linker_so=ldshared,
152 linker_exe=cc)
153
154 compiler.shared_lib_extension = so_ext
Greg Wardbb7baa72000-06-25 02:09:14 +0000155
156
Greg Ward9ddaaa11999-01-06 14:46:06 +0000157def get_config_h_filename():
Martin v. Löwis4f1cd8b2001-07-26 13:41:06 +0000158 """Return full pathname of installed pyconfig.h file."""
Fred Drakec916cdc2001-08-02 20:03:12 +0000159 if python_build:
160 inc_dir = os.curdir
161 else:
162 inc_dir = get_python_inc(plat_specific=1)
Marc-André Lemburg7cf92fa2001-07-26 18:06:58 +0000163 if sys.version < '2.2':
164 config_h = 'config.h'
165 else:
166 # The name of the config.h file changed in 2.2
167 config_h = 'pyconfig.h'
168 return os.path.join(inc_dir, config_h)
Greg Ward7d73b9e2000-03-09 03:16:05 +0000169
Greg Ward1190ee31998-12-18 23:46:33 +0000170
Greg Ward9ddaaa11999-01-06 14:46:06 +0000171def get_makefile_filename():
Fred Drake522af3a1999-01-06 16:28:34 +0000172 """Return full pathname of installed Makefile from the Python build."""
Andrew M. Kuchlingc14fa302001-01-17 15:16:52 +0000173 if python_build:
Fred Drake16c8d702002-06-04 15:28:21 +0000174 return os.path.join(os.path.dirname(sys.executable), "Makefile")
Fred Drakec1ee39a2000-03-09 15:54:52 +0000175 lib_dir = get_python_lib(plat_specific=1, standard_lib=1)
176 return os.path.join(lib_dir, "config", "Makefile")
Greg Ward7d73b9e2000-03-09 03:16:05 +0000177
Greg Ward1190ee31998-12-18 23:46:33 +0000178
Greg Ward9ddaaa11999-01-06 14:46:06 +0000179def parse_config_h(fp, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000180 """Parse a config.h-style file.
181
182 A dictionary containing name/value pairs is returned. If an
183 optional dictionary is passed in as the second argument, it is
184 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000185 """
Greg Ward9ddaaa11999-01-06 14:46:06 +0000186 if g is None:
187 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000188 define_rx = re.compile("#define ([A-Z][A-Z0-9_]+) (.*)\n")
189 undef_rx = re.compile("/[*] #undef ([A-Z][A-Z0-9_]+) [*]/\n")
Greg Ward9ddaaa11999-01-06 14:46:06 +0000190 #
Greg Ward1190ee31998-12-18 23:46:33 +0000191 while 1:
192 line = fp.readline()
193 if not line:
194 break
195 m = define_rx.match(line)
196 if m:
197 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000198 try: v = string.atoi(v)
199 except ValueError: pass
200 g[n] = v
Greg Ward1190ee31998-12-18 23:46:33 +0000201 else:
202 m = undef_rx.match(line)
203 if m:
204 g[m.group(1)] = 0
Greg Ward9ddaaa11999-01-06 14:46:06 +0000205 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000206
Greg Wardd283ce72000-09-17 00:53:02 +0000207
208# Regexes needed for parsing Makefile (and similar syntaxes,
209# like old-style Setup files).
210_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
211_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
212_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
213
Greg Ward3fff8d22000-09-15 00:03:13 +0000214def parse_makefile(fn, g=None):
Fred Drakec1ee39a2000-03-09 15:54:52 +0000215 """Parse a Makefile-style file.
216
217 A dictionary containing name/value pairs is returned. If an
218 optional dictionary is passed in as the second argument, it is
219 used instead of a new dictionary.
Fred Drake522af3a1999-01-06 16:28:34 +0000220 """
Greg Ward3fff8d22000-09-15 00:03:13 +0000221 from distutils.text_file import TextFile
Greg Wardd283ce72000-09-17 00:53:02 +0000222 fp = TextFile(fn, strip_comments=1, skip_blanks=1, join_lines=1)
Greg Ward3fff8d22000-09-15 00:03:13 +0000223
Greg Ward9ddaaa11999-01-06 14:46:06 +0000224 if g is None:
225 g = {}
Greg Ward1190ee31998-12-18 23:46:33 +0000226 done = {}
227 notdone = {}
Greg Ward3fff8d22000-09-15 00:03:13 +0000228
Greg Ward1190ee31998-12-18 23:46:33 +0000229 while 1:
230 line = fp.readline()
Greg Wardd283ce72000-09-17 00:53:02 +0000231 if line is None: # eof
Greg Ward1190ee31998-12-18 23:46:33 +0000232 break
Greg Wardd283ce72000-09-17 00:53:02 +0000233 m = _variable_rx.match(line)
Greg Ward1190ee31998-12-18 23:46:33 +0000234 if m:
235 n, v = m.group(1, 2)
Greg Ward3c8e54b1998-12-22 12:42:04 +0000236 v = string.strip(v)
Greg Ward1190ee31998-12-18 23:46:33 +0000237 if "$" in v:
238 notdone[n] = v
239 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000240 try: v = string.atoi(v)
241 except ValueError: pass
Greg Ward1190ee31998-12-18 23:46:33 +0000242 done[n] = v
243
244 # do variable interpolation here
Greg Ward1190ee31998-12-18 23:46:33 +0000245 while notdone:
246 for name in notdone.keys():
247 value = notdone[name]
Greg Wardd283ce72000-09-17 00:53:02 +0000248 m = _findvar1_rx.search(value) or _findvar2_rx.search(value)
Greg Ward1190ee31998-12-18 23:46:33 +0000249 if m:
250 n = m.group(1)
251 if done.has_key(n):
252 after = value[m.end():]
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000253 value = value[:m.start()] + str(done[n]) + after
Greg Ward1190ee31998-12-18 23:46:33 +0000254 if "$" in after:
255 notdone[name] = value
256 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000257 try: value = string.atoi(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000258 except ValueError:
259 done[name] = string.strip(value)
260 else:
261 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000262 del notdone[name]
263 elif notdone.has_key(n):
264 # get it on a subsequent round
265 pass
266 else:
267 done[n] = ""
268 after = value[m.end():]
269 value = value[:m.start()] + after
270 if "$" in after:
271 notdone[name] = value
272 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000273 try: value = string.atoi(value)
Andrew M. Kuchlingb11bd032001-01-16 16:33:28 +0000274 except ValueError:
275 done[name] = string.strip(value)
276 else:
277 done[name] = value
Greg Ward1190ee31998-12-18 23:46:33 +0000278 del notdone[name]
279 else:
Greg Ward3c8e54b1998-12-22 12:42:04 +0000280 # bogus variable reference; just drop it since we can't deal
Greg Ward1190ee31998-12-18 23:46:33 +0000281 del notdone[name]
282
Greg Wardd283ce72000-09-17 00:53:02 +0000283 fp.close()
284
Greg Ward1190ee31998-12-18 23:46:33 +0000285 # save the results in the global dictionary
286 g.update(done)
Greg Ward9ddaaa11999-01-06 14:46:06 +0000287 return g
Greg Ward1190ee31998-12-18 23:46:33 +0000288
289
Greg Wardd283ce72000-09-17 00:53:02 +0000290def expand_makefile_vars(s, vars):
291 """Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
292 'string' according to 'vars' (a dictionary mapping variable names to
293 values). Variables not present in 'vars' are silently expanded to the
294 empty string. The variable values in 'vars' should not contain further
295 variable expansions; if 'vars' is the output of 'parse_makefile()',
296 you're fine. Returns a variable-expanded version of 's'.
297 """
298
299 # This algorithm does multiple expansion, so if vars['foo'] contains
300 # "${bar}", it will expand ${foo} to ${bar}, and then expand
301 # ${bar}... and so forth. This is fine as long as 'vars' comes from
302 # 'parse_makefile()', which takes care of such expansions eagerly,
303 # according to make's variable expansion semantics.
304
305 while 1:
306 m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
307 if m:
308 name = m.group(1)
309 (beg, end) = m.span()
310 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
311 else:
312 break
313 return s
314
315
Greg Ward879f0f12000-09-15 01:15:08 +0000316_config_vars = None
317
Greg Ward9ddaaa11999-01-06 14:46:06 +0000318def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000319 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000320 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000321 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000322 try:
323 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000324 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000325 except IOError, msg:
326 my_msg = "invalid Python installation: unable to open %s" % filename
327 if hasattr(msg, "strerror"):
328 my_msg = my_msg + " (%s)" % msg.strerror
329
Fred Drake70b014d2001-07-18 18:39:56 +0000330 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000331
332
Greg Ward4f880282000-06-27 01:59:06 +0000333 # On AIX, there are wrong paths to the linker scripts in the Makefile
334 # -- these paths are relative to the Python source, but when installed
335 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000336 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000337 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000338
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000339 elif sys.version < '2.1':
340 # The following two branches are for 1.5.2 compatibility.
341 if sys.platform == 'aix4': # what about AIX 3.x ?
342 # Linker script is in the config directory, not in Modules as the
343 # Makefile says.
344 python_lib = get_python_lib(standard_lib=1)
345 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
346 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000347
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000348 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
349
350 elif sys.platform == 'beos':
351 # Linker script is in the config directory. In the Makefile it is
352 # relative to the srcdir, which after installation no longer makes
353 # sense.
354 python_lib = get_python_lib(standard_lib=1)
355 linkerscript_name = os.path.basename(string.split(g['LDSHARED'])[0])
356 linkerscript = os.path.join(python_lib, 'config', linkerscript_name)
Fred Drakeb94b8492001-12-06 20:51:35 +0000357
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000358 # XXX this isn't the right place to do this: adding the Python
359 # library to the link, if needed, should be in the "build_ext"
360 # command. (It's also needed for non-MS compilers on Windows, and
361 # it's taken care of for them by the 'build_ext.get_libraries()'
362 # method.)
363 g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
364 (linkerscript, PREFIX, sys.version[0:3]))
Fred Drakeb94b8492001-12-06 20:51:35 +0000365
Greg Ward879f0f12000-09-15 01:15:08 +0000366 global _config_vars
367 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000368
Greg Ward9ddaaa11999-01-06 14:46:06 +0000369
Greg Ward4d74d731999-06-08 01:58:36 +0000370def _init_nt():
371 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000372 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000373 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000374 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
375 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000376
Greg Ward32162e81999-08-29 18:22:13 +0000377 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000378 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000379
Fred Drake69e2c6e2000-02-08 15:55:42 +0000380 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000381 g['EXE'] = ".exe"
Greg Ward879f0f12000-09-15 01:15:08 +0000382
383 global _config_vars
384 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000385
Fred Drake69e2c6e2000-02-08 15:55:42 +0000386
Greg Ward0eff87a2000-03-07 03:30:09 +0000387def _init_mac():
388 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000389 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000390 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000391 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
392 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000393
394 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000395 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000396
Jack Jansendd13a202001-05-17 12:52:01 +0000397 import MacOS
398 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000399 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000400 else:
401 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000402
403 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000404 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
405 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000406
Greg Ward879f0f12000-09-15 01:15:08 +0000407 global _config_vars
408 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000409
Fred Drake69e2c6e2000-02-08 15:55:42 +0000410
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000411def _init_os2():
412 """Initialize the module as appropriate for OS/2"""
413 g = {}
414 # set basic install directories
415 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
416 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
417
418 # XXX hmmm.. a normal install puts include files here
419 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
420
421 g['SO'] = '.pyd'
422 g['EXE'] = ".exe"
423
424 global _config_vars
425 _config_vars = g
426
427
Greg Ward879f0f12000-09-15 01:15:08 +0000428def get_config_vars(*args):
429 """With no arguments, return a dictionary of all configuration
430 variables relevant for the current platform. Generally this includes
431 everything needed to build extensions and install both pure modules and
432 extensions. On Unix, this means every variable defined in Python's
433 installed Makefile; on Windows and Mac OS it's a much smaller set.
434
435 With arguments, return a list of values that result from looking up
436 each argument in the configuration variable dictionary.
437 """
438 global _config_vars
439 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000440 func = globals().get("_init_" + os.name)
441 if func:
442 func()
443 else:
444 _config_vars = {}
445
446 # Normalized versions of prefix and exec_prefix are handy to have;
447 # in fact, these are the standard versions used most places in the
448 # Distutils.
449 _config_vars['prefix'] = PREFIX
450 _config_vars['exec_prefix'] = EXEC_PREFIX
451
452 if args:
453 vals = []
454 for name in args:
455 vals.append(_config_vars.get(name))
456 return vals
457 else:
458 return _config_vars
459
460def get_config_var(name):
461 """Return the value of a single variable using the dictionary
462 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000463 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000464 """
465 return get_config_vars().get(name)