Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bpo-41282: (PEP 632) Load install schemes from sysconfig #24549

Merged
merged 2 commits into from
Apr 14, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
73 changes: 41 additions & 32 deletions Lib/distutils/command/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@
Implements the Distutils 'install' command."""

import sys
import sysconfig
import os
import re

from distutils import log
from distutils.core import Command
Expand All @@ -20,33 +22,45 @@

HAS_USER_SITE = (USER_SITE is not None)

WINDOWS_SCHEME = {
'purelib': '$base/Lib/site-packages',
'platlib': '$base/Lib/site-packages',
'headers': '$base/Include/$dist_name',
'scripts': '$base/Scripts',
'data' : '$base',
}

INSTALL_SCHEMES = {
'unix_prefix': {
'purelib': '$base/lib/python$py_version_short/site-packages',
'platlib': '$platbase/$platlibdir/python$py_version_short/site-packages',
'headers': '$base/include/python$py_version_short$abiflags/$dist_name',
'scripts': '$base/bin',
'data' : '$base',
},
'unix_home': {
'purelib': '$base/lib/python',
'platlib': '$base/$platlibdir/python',
'headers': '$base/include/python/$dist_name',
'scripts': '$base/bin',
'data' : '$base',
},
'nt': WINDOWS_SCHEME,
}

# user site schemes
# The keys to an installation scheme; if any new types of files are to be
# installed, be sure to add an entry to every installation scheme above,
# and to SCHEME_KEYS here.
frenzymadness marked this conversation as resolved.
Show resolved Hide resolved
SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data')

# The following code provides backward-compatible INSTALL_SCHEMES
# while making the sysconfig module the single point of truth.
# This makes it easier for OS distributions where they need to
# alter locations for packages installations on single place.
# This module is depracated anyway (PEP 632) so if anything
# doesn't work for you, take a look at sysconfig.
frenzymadness marked this conversation as resolved.
Show resolved Hide resolved
INSTALL_SCHEMES = {"unix_prefix": {}, "unix_home": {}, "nt": {}}

# Copy from sysconfig._INSTALL_SCHEMES
for key in SCHEME_KEYS:
sys_key = key
if key == "headers":
sys_key = "include"
INSTALL_SCHEMES["unix_prefix"][key] = sysconfig._INSTALL_SCHEMES["posix_prefix"][sys_key]
INSTALL_SCHEMES["unix_home"][key] = sysconfig._INSTALL_SCHEMES["posix_home"][sys_key]
INSTALL_SCHEMES["nt"][key] = sysconfig._INSTALL_SCHEMES["nt"][sys_key]

# Transformation to different template format
for main_key in INSTALL_SCHEMES:
for key, value in INSTALL_SCHEMES[main_key].items():
# Change all ocurences of {variable} to $variable
value = re.sub(r"\{(.+?)\}", r"$\g<1>", value)
value = value.replace("$installed_base", "$base")
value = value.replace("$py_version_nodot_plat", "$py_version_nodot")
if key == "headers":
value += "/$dist_name"
if sys.version_info >= (3, 9) and key == "platlib":
# platlibdir is available since 3.9: bpo-1294959
value = value.replace("/lib/", "/$platlibdir/")
encukou marked this conversation as resolved.
Show resolved Hide resolved
INSTALL_SCHEMES[main_key][key] = value

# The following part of INSTALL_SCHEMES has different definition
# that the one in sysconfig but because both depends on site module
# the outcomes should be the same.
frenzymadness marked this conversation as resolved.
Show resolved Hide resolved
if HAS_USER_SITE:
INSTALL_SCHEMES['nt_user'] = {
'purelib': '$usersite',
Expand All @@ -65,11 +79,6 @@
'data' : '$userbase',
}

# The keys to an installation scheme; if any new types of files are to be
# installed, be sure to add an entry to every installation scheme above,
# and to SCHEME_KEYS here.
SCHEME_KEYS = ('purelib', 'platlib', 'headers', 'scripts', 'data')


class install(Command):

Expand Down
6 changes: 0 additions & 6 deletions Lib/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -176,12 +176,6 @@ def is_python_build(check_home=False):

_PYTHON_BUILD = is_python_build(True)

if _PYTHON_BUILD:
for scheme in ('posix_prefix', 'posix_home'):
_INSTALL_SCHEMES[scheme]['include'] = '{srcdir}/Include'
_INSTALL_SCHEMES[scheme]['platinclude'] = '{projectbase}/.'


def _subst_vars(s, local_vars):
try:
return s.format(**local_vars)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Install schemes in :mod:`distutils.command.install` are now loaded from
:mod:`sysconfig`.