cpython/Lib/distutils/sysconfig.py

169 lines
5.7 KiB
Python

"""Provide access to Python's configuration information. The specific
configuration variables available depend heavily on the platform and
configuration. The values may be retrieved using
get_config_var(name), and the list of variables is available via
get_config_vars().keys(). Additional convenience functions are also
available.
Written by: Fred L. Drake, Jr.
Email: <fdrake@acm.org>
**This module has been moved out of Distutils and will be removed from
Python in the next version (3.2)**
"""
__revision__ = "$Id$"
import io
import os
import re
from warnings import warn
from distutils.errors import DistutilsPlatformError
# importing sysconfig from Lib
# to avoid this module to shadow it
_sysconfig = __import__('sysconfig')
# names defined here to keep backward compatibility
# for APIs that were relocated
get_python_version = _sysconfig.get_python_version
get_config_h_filename = _sysconfig.get_config_h_filename
parse_config_h = _sysconfig.parse_config_h
get_config_vars = _sysconfig.get_config_vars
get_config_var = _sysconfig.get_config_var
from distutils.ccompiler import customize_compiler
_DEPRECATION_MSG = ("distutils.sysconfig.%s is deprecated. "
"Use the APIs provided by the sysconfig module instead")
def _get_project_base():
return _sysconfig._PROJECT_BASE
project_base = _get_project_base()
class _DeprecatedBool(int):
def __nonzero__(self):
warn(_DEPRECATION_MSG % 'get_python_version', DeprecationWarning)
return super(_DeprecatedBool, self).__nonzero__()
def _python_build():
return _DeprecatedBool(_sysconfig.is_python_build())
python_build = _python_build()
def get_python_inc(plat_specific=0, prefix=None):
"""This function is deprecated.
Return the directory containing installed Python header files.
If 'plat_specific' is false (the default), this is the path to the
non-platform-specific header files, i.e. Python.h and so on;
otherwise, this is the path to platform-specific header files
(namely pyconfig.h).
If 'prefix' is supplied, use it instead of sys.prefix or
sys.exec_prefix -- i.e., ignore 'plat_specific'.
"""
warn(_DEPRECATION_MSG % 'get_python_inc', DeprecationWarning)
get_path = _sysconfig.get_path
if prefix is not None:
vars = {'base': prefix}
return get_path('include', vars=vars)
if not plat_specific:
return get_path('include')
else:
return get_path('platinclude')
def get_python_lib(plat_specific=False, standard_lib=False, prefix=None):
"""This function is deprecated.
Return the directory containing the Python library (standard or
site additions).
If 'plat_specific' is true, return the directory containing
platform-specific modules, i.e. any module from a non-pure-Python
module distribution; otherwise, return the platform-shared library
directory. If 'standard_lib' is true, return the directory
containing standard Python library modules; otherwise, return the
directory for site-specific modules.
If 'prefix' is supplied, use it instead of sys.prefix or
sys.exec_prefix -- i.e., ignore 'plat_specific'.
"""
warn(_DEPRECATION_MSG % 'get_python_lib', DeprecationWarning)
vars = {}
get_path = _sysconfig.get_path
if prefix is not None:
if plat_specific:
vars['platbase'] = prefix
else:
vars['base'] = prefix
if standard_lib:
if plat_specific:
return get_path('platstdlib', vars=vars)
else:
return get_path('stdlib', vars=vars)
else:
if plat_specific:
return get_path('platlib', vars=vars)
else:
return get_path('purelib', vars=vars)
def get_makefile_filename():
"""This function is deprecated.
Return full pathname of installed Makefile from the Python build.
"""
warn(_DEPRECATION_MSG % 'get_makefile_filename', DeprecationWarning)
return _sysconfig._get_makefile_filename()
# Regexes needed for parsing Makefile (and similar syntaxes,
# like old-style Setup files).
_variable_rx = re.compile("([a-zA-Z][a-zA-Z0-9_]+)\s*=\s*(.*)")
_findvar1_rx = re.compile(r"\$\(([A-Za-z][A-Za-z0-9_]*)\)")
_findvar2_rx = re.compile(r"\${([A-Za-z][A-Za-z0-9_]*)}")
def parse_makefile(fn, g=None):
"""This function is deprecated.
Parse a Makefile-style file.
A dictionary containing name/value pairs is returned. If an
optional dictionary is passed in as the second argument, it is
used instead of a new dictionary.
"""
warn(_DEPRECATION_MSG % 'parse_makefile', DeprecationWarning)
return _sysconfig._parse_makefile(fn, g)
def expand_makefile_vars(s, vars):
"""This function is deprecated.
Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
'string' according to 'vars' (a dictionary mapping variable names to
values). Variables not present in 'vars' are silently expanded to the
empty string. The variable values in 'vars' should not contain further
variable expansions; if 'vars' is the output of 'parse_makefile()',
you're fine. Returns a variable-expanded version of 's'.
"""
warn('this function will be removed in then next version of Python',
DeprecationWarning)
# This algorithm does multiple expansion, so if vars['foo'] contains
# "${bar}", it will expand ${foo} to ${bar}, and then expand
# ${bar}... and so forth. This is fine as long as 'vars' comes from
# 'parse_makefile()', which takes care of such expansions eagerly,
# according to make's variable expansion semantics.
while True:
m = _findvar1_rx.search(s) or _findvar2_rx.search(s)
if m:
(beg, end) = m.span()
s = s[0:beg] + vars.get(m.group(1)) + s[end:]
else:
break
return s