blob: 847b87240bc867ee209ed6fee9624bd5747709dc [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:
Greg Wardd283ce72000-09-17 00:53:02 +0000308 (beg, end) = m.span()
309 s = s[0:beg] + vars.get(m.group(1)) + s[end:]
310 else:
311 break
312 return s
313
314
Greg Ward879f0f12000-09-15 01:15:08 +0000315_config_vars = None
316
Greg Ward9ddaaa11999-01-06 14:46:06 +0000317def _init_posix():
Fred Drake522af3a1999-01-06 16:28:34 +0000318 """Initialize the module as appropriate for POSIX systems."""
Greg Ward879f0f12000-09-15 01:15:08 +0000319 g = {}
Greg Warda0ca3f22000-02-02 00:05:14 +0000320 # load the installed Makefile:
Greg Warda570c052000-05-23 23:14:00 +0000321 try:
322 filename = get_makefile_filename()
Greg Ward3fff8d22000-09-15 00:03:13 +0000323 parse_makefile(filename, g)
Greg Warda570c052000-05-23 23:14:00 +0000324 except IOError, msg:
325 my_msg = "invalid Python installation: unable to open %s" % filename
326 if hasattr(msg, "strerror"):
327 my_msg = my_msg + " (%s)" % msg.strerror
328
Fred Drake70b014d2001-07-18 18:39:56 +0000329 raise DistutilsPlatformError(my_msg)
Fred Drakec916cdc2001-08-02 20:03:12 +0000330
331
Greg Ward4f880282000-06-27 01:59:06 +0000332 # On AIX, there are wrong paths to the linker scripts in the Makefile
333 # -- these paths are relative to the Python source, but when installed
334 # the scripts are in another directory.
Neil Schemenauer1a020862001-02-16 03:31:13 +0000335 if python_build:
Andrew M. Kuchling63357732001-02-28 19:40:27 +0000336 g['LDSHARED'] = g['BLDSHARED']
Fred Drakeb94b8492001-12-06 20:51:35 +0000337
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000338 elif sys.version < '2.1':
339 # The following two branches are for 1.5.2 compatibility.
340 if sys.platform == 'aix4': # what about AIX 3.x ?
341 # Linker script is in the config directory, not in Modules as the
342 # Makefile says.
343 python_lib = get_python_lib(standard_lib=1)
344 ld_so_aix = os.path.join(python_lib, 'config', 'ld_so_aix')
345 python_exp = os.path.join(python_lib, 'config', 'python.exp')
Greg Ward879f0f12000-09-15 01:15:08 +0000346
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000347 g['LDSHARED'] = "%s %s -bI:%s" % (ld_so_aix, g['CC'], python_exp)
348
349 elif sys.platform == 'beos':
350 # Linker script is in the config directory. In the Makefile it is
351 # relative to the srcdir, which after installation no longer makes
352 # sense.
353 python_lib = get_python_lib(standard_lib=1)
354 linkerscript_name = os.path.basename(string.split(g['LDSHARED'])[0])
355 linkerscript = os.path.join(python_lib, 'config', linkerscript_name)
Fred Drakeb94b8492001-12-06 20:51:35 +0000356
Andrew M. Kuchling045af6f2001-09-05 12:02:59 +0000357 # XXX this isn't the right place to do this: adding the Python
358 # library to the link, if needed, should be in the "build_ext"
359 # command. (It's also needed for non-MS compilers on Windows, and
360 # it's taken care of for them by the 'build_ext.get_libraries()'
361 # method.)
362 g['LDSHARED'] = ("%s -L%s/lib -lpython%s" %
363 (linkerscript, PREFIX, sys.version[0:3]))
Fred Drakeb94b8492001-12-06 20:51:35 +0000364
Greg Ward879f0f12000-09-15 01:15:08 +0000365 global _config_vars
366 _config_vars = g
Greg Ward66e966f2000-09-01 01:23:26 +0000367
Greg Ward9ddaaa11999-01-06 14:46:06 +0000368
Greg Ward4d74d731999-06-08 01:58:36 +0000369def _init_nt():
370 """Initialize the module as appropriate for NT"""
Greg Ward879f0f12000-09-15 01:15:08 +0000371 g = {}
Greg Ward4d74d731999-06-08 01:58:36 +0000372 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000373 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
374 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward4d74d731999-06-08 01:58:36 +0000375
Greg Ward32162e81999-08-29 18:22:13 +0000376 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000377 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward32162e81999-08-29 18:22:13 +0000378
Fred Drake69e2c6e2000-02-08 15:55:42 +0000379 g['SO'] = '.pyd'
Greg Ward82d71ca2000-06-03 00:44:30 +0000380 g['EXE'] = ".exe"
Greg Ward879f0f12000-09-15 01:15:08 +0000381
382 global _config_vars
383 _config_vars = g
Greg Ward82d71ca2000-06-03 00:44:30 +0000384
Fred Drake69e2c6e2000-02-08 15:55:42 +0000385
Greg Ward0eff87a2000-03-07 03:30:09 +0000386def _init_mac():
387 """Initialize the module as appropriate for Macintosh systems"""
Greg Ward879f0f12000-09-15 01:15:08 +0000388 g = {}
Greg Ward0eff87a2000-03-07 03:30:09 +0000389 # set basic install directories
Fred Drakec1ee39a2000-03-09 15:54:52 +0000390 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
391 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
Greg Ward0eff87a2000-03-07 03:30:09 +0000392
393 # XXX hmmm.. a normal install puts include files here
Fred Drakec1ee39a2000-03-09 15:54:52 +0000394 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
Greg Ward0eff87a2000-03-07 03:30:09 +0000395
Jack Jansendd13a202001-05-17 12:52:01 +0000396 import MacOS
397 if not hasattr(MacOS, 'runtimemodel'):
Guido van Rossum99f9baa2001-05-17 15:03:14 +0000398 g['SO'] = '.ppc.slb'
Jack Jansendd13a202001-05-17 12:52:01 +0000399 else:
400 g['SO'] = '.%s.slb' % MacOS.runtimemodel
Greg Ward7d73b9e2000-03-09 03:16:05 +0000401
402 # XXX are these used anywhere?
Greg Wardcf6bea32000-04-10 01:15:06 +0000403 g['install_lib'] = os.path.join(EXEC_PREFIX, "Lib")
404 g['install_platlib'] = os.path.join(EXEC_PREFIX, "Mac", "Lib")
Greg Ward0eff87a2000-03-07 03:30:09 +0000405
Greg Ward879f0f12000-09-15 01:15:08 +0000406 global _config_vars
407 _config_vars = g
Greg Ward9ddaaa11999-01-06 14:46:06 +0000408
Fred Drake69e2c6e2000-02-08 15:55:42 +0000409
Marc-André Lemburg2544f512002-01-31 18:56:00 +0000410def _init_os2():
411 """Initialize the module as appropriate for OS/2"""
412 g = {}
413 # set basic install directories
414 g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
415 g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)
416
417 # XXX hmmm.. a normal install puts include files here
418 g['INCLUDEPY'] = get_python_inc(plat_specific=0)
419
420 g['SO'] = '.pyd'
421 g['EXE'] = ".exe"
422
423 global _config_vars
424 _config_vars = g
425
426
Greg Ward879f0f12000-09-15 01:15:08 +0000427def get_config_vars(*args):
428 """With no arguments, return a dictionary of all configuration
429 variables relevant for the current platform. Generally this includes
430 everything needed to build extensions and install both pure modules and
431 extensions. On Unix, this means every variable defined in Python's
432 installed Makefile; on Windows and Mac OS it's a much smaller set.
433
434 With arguments, return a list of values that result from looking up
435 each argument in the configuration variable dictionary.
436 """
437 global _config_vars
438 if _config_vars is None:
Greg Ward879f0f12000-09-15 01:15:08 +0000439 func = globals().get("_init_" + os.name)
440 if func:
441 func()
442 else:
443 _config_vars = {}
444
445 # Normalized versions of prefix and exec_prefix are handy to have;
446 # in fact, these are the standard versions used most places in the
447 # Distutils.
448 _config_vars['prefix'] = PREFIX
449 _config_vars['exec_prefix'] = EXEC_PREFIX
450
451 if args:
452 vals = []
453 for name in args:
454 vals.append(_config_vars.get(name))
455 return vals
456 else:
457 return _config_vars
458
459def get_config_var(name):
460 """Return the value of a single variable using the dictionary
461 returned by 'get_config_vars()'. Equivalent to
Fred Drakec916cdc2001-08-02 20:03:12 +0000462 get_config_vars().get(name)
Greg Ward879f0f12000-09-15 01:15:08 +0000463 """
464 return get_config_vars().get(name)