Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
9de38bb
Mark distutils.sysconfig as deprecated
frenzymadness Oct 15, 2020
2f73368
Import global paths from sysconfig module
frenzymadness Oct 15, 2020
43d810e
Move some similar functions from distutils.sysconfig -> sysconfig
frenzymadness Oct 15, 2020
2ca4dfd
Move the rest of global variables
frenzymadness Oct 15, 2020
09f2617
Move the rest of functions to sysconfig
frenzymadness Oct 15, 2020
24e0584
Import regexes used in tests
frenzymadness Oct 16, 2020
b9ee651
Implement compatibility option for parse_makefile
frenzymadness Oct 16, 2020
12f92cf
Do not use assignment in teardown to not lose reference to global dict
frenzymadness Oct 19, 2020
7b9b0c1
Ignore DeprecationWarning in pip code in ensurepip module
frenzymadness Oct 20, 2020
6f5aa4f
Improve setUp/tearDown of UnixCCompilerTestCase
frenzymadness Oct 20, 2020
fca8adc
Improve or create setUp/tearDown methods for tests where sysconfig._C…
frenzymadness Oct 21, 2020
318428d
Rename `distutils_compat` to `keep_unresolved` and reverse the logic
frenzymadness Oct 23, 2020
6136978
Merge all import from sysconfig to one statement
frenzymadness Oct 23, 2020
e635dbd
Allow import of sysconfig when re module is not available
frenzymadness Oct 23, 2020
d8a8cf0
Add a TODO comment about PEP 632
frenzymadness Oct 23, 2020
e317db5
Mark distutils.sysconfig as deprecated in docs
frenzymadness Oct 23, 2020
17206f0
Copy docs for get_python_inc and get_python_lib from distutils.syscon…
frenzymadness Oct 23, 2020
04ef7af
Move customize_compiler back to distutils.sysconfig as it'll be remov…
frenzymadness Oct 24, 2020
6015255
Fix import of not-yet-initialized _CONFIG_VARS
frenzymadness Nov 3, 2020
abc310b
Switch global vars from regex objects to raw strings and import re on…
frenzymadness Nov 5, 2020
17aa9c4
Move get_python_lib and get_python_inc back to distutils.sysconfig
frenzymadness Nov 13, 2020
be181b6
News entry
frenzymadness Feb 15, 2021
e253a3d
Restore build_flags accidentally removed during a rebase
frenzymadness Apr 16, 2021
cd8e387
Update Doc/distutils/apiref.rst
frenzymadness Apr 18, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Move the rest of functions to sysconfig
  • Loading branch information
frenzymadness committed Apr 16, 2021
commit 09f2617f843843b834faa8df07c2f919230666dc
216 changes: 8 additions & 208 deletions Lib/distutils/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,16 +26,22 @@
from sysconfig import _PROJECT_BASE as project_base
from sysconfig import _PYTHON_BUILD as python_build
from sysconfig import _CONFIG_VARS as _config_vars
from sysconfig import _init_posix as sysconfig_init_posix
from sysconfig import parse_config_h as sysconfig_parse_config_h
from sysconfig import _parse_makefile as sysconfig_parse_makefile

from sysconfig import _init_non_posix
from sysconfig import _is_python_source_dir
from sysconfig import _sys_home

from sysconfig import build_flags
from sysconfig import customize_compiler
from sysconfig import expand_makefile_vars
from sysconfig import is_python_build
from sysconfig import get_config_h_filename
from sysconfig import get_config_var
from sysconfig import get_config_vars
from sysconfig import get_makefile_filename
from sysconfig import get_python_inc
from sysconfig import get_python_version
from sysconfig import get_python_lib
Expand All @@ -59,211 +65,5 @@ def parse_makefile(fn, g=None):
return sysconfig_parse_makefile(fn, vars=g)

_python_build = partial(is_python_build, check_home=True)


def customize_compiler(compiler):
"""Do any platform-specific customization of a CCompiler instance.

Mainly needed on Unix, so we can plug in the information that
varies across Unices and is stored in Python's Makefile.
"""
if compiler.compiler_type == "unix":
if sys.platform == "darwin":
# Perform first-time customization of compiler-related
# config vars on OS X now that we know we need a compiler.
# This is primarily to support Pythons from binary
# installers. The kind and paths to build tools on
# the user system may vary significantly from the system
# that Python itself was built on. Also the user OS
# version and build tools may not support the same set
# of CPU architectures for universal builds.
global _config_vars
# Use get_config_var() to ensure _config_vars is initialized.
if not get_config_var('CUSTOMIZED_OSX_COMPILER'):
import _osx_support
_osx_support.customize_compiler(_config_vars)
_config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'

(cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \
get_config_vars('CC', 'CXX', 'CFLAGS',
'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')

if 'CC' in os.environ:
newcc = os.environ['CC']
if (sys.platform == 'darwin'
and 'LDSHARED' not in os.environ
and ldshared.startswith(cc)):
# On OS X, if CC is overridden, use that as the default
# command for LDSHARED as well
ldshared = newcc + ldshared[len(cc):]
cc = newcc
if 'CXX' in os.environ:
cxx = os.environ['CXX']
if 'LDSHARED' in os.environ:
ldshared = os.environ['LDSHARED']
if 'CPP' in os.environ:
cpp = os.environ['CPP']
else:
cpp = cc + " -E" # not always
if 'LDFLAGS' in os.environ:
ldshared = ldshared + ' ' + os.environ['LDFLAGS']
if 'CFLAGS' in os.environ:
cflags = cflags + ' ' + os.environ['CFLAGS']
ldshared = ldshared + ' ' + os.environ['CFLAGS']
if 'CPPFLAGS' in os.environ:
cpp = cpp + ' ' + os.environ['CPPFLAGS']
cflags = cflags + ' ' + os.environ['CPPFLAGS']
ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
if 'AR' in os.environ:
ar = os.environ['AR']
if 'ARFLAGS' in os.environ:
archiver = ar + ' ' + os.environ['ARFLAGS']
else:
archiver = ar + ' ' + ar_flags

cc_cmd = cc + ' ' + cflags
compiler.set_executables(
preprocessor=cpp,
compiler=cc_cmd,
compiler_so=cc_cmd + ' ' + ccshared,
compiler_cxx=cxx,
linker_so=ldshared,
linker_exe=cc,
archiver=archiver)

compiler.shared_lib_extension = shlib_suffix


def get_config_h_filename():
"""Return full pathname of installed pyconfig.h file."""
if python_build:
if os.name == "nt":
inc_dir = os.path.join(_sys_home or project_base, "PC")
else:
inc_dir = _sys_home or project_base
else:
inc_dir = get_python_inc(plat_specific=1)

return os.path.join(inc_dir, 'pyconfig.h')


def get_makefile_filename():
"""Return full pathname of installed Makefile from the Python build."""
if python_build:
return os.path.join(_sys_home or project_base, "Makefile")
lib_dir = get_python_lib(plat_specific=0, standard_lib=1)
config_file = 'config-{}{}'.format(get_python_version(), build_flags)
if hasattr(sys.implementation, '_multiarch'):
config_file += '-%s' % sys.implementation._multiarch
return os.path.join(lib_dir, config_file, 'Makefile')


def _init_posix():
"""Initialize the module as appropriate for POSIX systems."""
# _sysconfigdata is generated at build time, see the sysconfig module
name = os.environ.get('_PYTHON_SYSCONFIGDATA_NAME',
'_sysconfigdata_{abi}_{platform}_{multiarch}'.format(
abi=sys.abiflags,
platform=sys.platform,
multiarch=getattr(sys.implementation, '_multiarch', ''),
))
_temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
build_time_vars = _temp.build_time_vars
global _config_vars
_config_vars = {}
_config_vars.update(build_time_vars)


def _init_nt():
"""Initialize the module as appropriate for NT"""
g = {}
# set basic install directories
g['LIBDEST'] = get_python_lib(plat_specific=0, standard_lib=1)
g['BINLIBDEST'] = get_python_lib(plat_specific=1, standard_lib=1)

# XXX hmmm.. a normal install puts include files here
g['INCLUDEPY'] = get_python_inc(plat_specific=0)

g['EXT_SUFFIX'] = _imp.extension_suffixes()[0]
g['EXE'] = ".exe"
g['VERSION'] = get_python_version().replace(".", "")
g['BINDIR'] = os.path.dirname(os.path.abspath(sys.executable))

global _config_vars
_config_vars = g


def get_config_vars(*args):
"""With no arguments, return a dictionary of all configuration
variables relevant for the current platform. Generally this includes
everything needed to build extensions and install both pure modules and
extensions. On Unix, this means every variable defined in Python's
installed Makefile; on Windows it's a much smaller set.

With arguments, return a list of values that result from looking up
each argument in the configuration variable dictionary.
"""
global _config_vars
if _config_vars is None:
func = globals().get("_init_" + os.name)
if func:
func()
else:
_config_vars = {}

# Normalized versions of prefix and exec_prefix are handy to have;
# in fact, these are the standard versions used most places in the
# Distutils.
_config_vars['prefix'] = PREFIX
_config_vars['exec_prefix'] = EXEC_PREFIX

# For backward compatibility, see issue19555
SO = _config_vars.get('EXT_SUFFIX')
if SO is not None:
_config_vars['SO'] = SO

# Always convert srcdir to an absolute path
srcdir = _config_vars.get('srcdir', project_base)
if os.name == 'posix':
if python_build:
# If srcdir is a relative path (typically '.' or '..')
# then it should be interpreted relative to the directory
# containing Makefile.
base = os.path.dirname(get_makefile_filename())
srcdir = os.path.join(base, srcdir)
else:
# srcdir is not meaningful since the installation is
# spread about the filesystem. We choose the
# directory containing the Makefile since we know it
# exists.
srcdir = os.path.dirname(get_makefile_filename())
_config_vars['srcdir'] = os.path.abspath(os.path.normpath(srcdir))

# Convert srcdir into an absolute path if it appears necessary.
# Normally it is relative to the build directory. However, during
# testing, for example, we might be running a non-installed python
# from a different directory.
if python_build and os.name == "posix":
base = project_base
if (not os.path.isabs(_config_vars['srcdir']) and
base != os.getcwd()):
# srcdir is relative and we are not in the same directory
# as the executable. Assume executable is in the build
# directory and make srcdir absolute.
srcdir = os.path.join(base, _config_vars['srcdir'])
_config_vars['srcdir'] = os.path.normpath(srcdir)

# OS X platforms require special customization to handle
# multi-architecture, multi-os-version installers
if sys.platform == 'darwin':
import _osx_support
_osx_support.customize_config_vars(_config_vars)

if args:
vals = []
for name in args:
vals.append(_config_vars.get(name))
return vals
else:
return _config_vars

_init_posix = partial(sysconfig_init_posix, _config_vars)
_init_nt = partial(_init_non_posix, _config_vars)
73 changes: 73 additions & 0 deletions Lib/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,79 @@ def expand_makefile_vars(s, vars):
return s


def customize_compiler(compiler):
"""Do any platform-specific customization of a CCompiler instance.

Mainly needed on Unix, so we can plug in the information that
varies across Unices and is stored in Python's Makefile.
"""
if compiler.compiler_type == "unix":
if sys.platform == "darwin":
# Perform first-time customization of compiler-related
# config vars on OS X now that we know we need a compiler.
# This is primarily to support Pythons from binary
# installers. The kind and paths to build tools on
# the user system may vary significantly from the system
# that Python itself was built on. Also the user OS
# version and build tools may not support the same set
# of CPU architectures for universal builds.
global _CONFIG_VARS
# Use get_config_var() to ensure _CONFIG_VARS is initialized.
if not get_config_var('CUSTOMIZED_OSX_COMPILER'):
import _osx_support
_osx_support.customize_compiler(_CONFIG_VARS)
_CONFIG_VARS['CUSTOMIZED_OSX_COMPILER'] = 'True'

(cc, cxx, cflags, ccshared, ldshared, shlib_suffix, ar, ar_flags) = \
get_config_vars('CC', 'CXX', 'CFLAGS',
'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')

if 'CC' in os.environ:
newcc = os.environ['CC']
if (sys.platform == 'darwin'
and 'LDSHARED' not in os.environ
and ldshared.startswith(cc)):
# On OS X, if CC is overridden, use that as the default
# command for LDSHARED as well
ldshared = newcc + ldshared[len(cc):]
cc = newcc
if 'CXX' in os.environ:
cxx = os.environ['CXX']
if 'LDSHARED' in os.environ:
ldshared = os.environ['LDSHARED']
if 'CPP' in os.environ:
cpp = os.environ['CPP']
else:
cpp = cc + " -E" # not always
if 'LDFLAGS' in os.environ:
ldshared = ldshared + ' ' + os.environ['LDFLAGS']
if 'CFLAGS' in os.environ:
cflags = cflags + ' ' + os.environ['CFLAGS']
ldshared = ldshared + ' ' + os.environ['CFLAGS']
if 'CPPFLAGS' in os.environ:
cpp = cpp + ' ' + os.environ['CPPFLAGS']
cflags = cflags + ' ' + os.environ['CPPFLAGS']
ldshared = ldshared + ' ' + os.environ['CPPFLAGS']
if 'AR' in os.environ:
ar = os.environ['AR']
if 'ARFLAGS' in os.environ:
archiver = ar + ' ' + os.environ['ARFLAGS']
else:
archiver = ar + ' ' + ar_flags

cc_cmd = cc + ' ' + cflags
compiler.set_executables(
preprocessor=cpp,
compiler=cc_cmd,
compiler_so=cc_cmd + ' ' + ccshared,
compiler_cxx=cxx,
linker_so=ldshared,
linker_exe=cc,
archiver=archiver)

compiler.shared_lib_extension = shlib_suffix


def _print_dict(title, data):
for index, (key, value) in enumerate(sorted(data.items())):
if index == 0:
Expand Down