Skip to content

Commit

Permalink
env._find_executable_and_scripts(): Prefer the venv installation sche…
Browse files Browse the repository at this point in the history
…me if it exists

Python distributors with custom default installation scheme can set a
scheme that can't be used to expand the paths in a venv.
This can happen if build itself is not installed in a venv.
The distributors are encouraged to set a "venv" scheme to be used for this.
See https://bugs.python.org/issue45413
and pypa/virtualenv#2208

Since Python that ships with the macOS developer tools does not have the "venv"
scheme yet, we keep the special case below. Once it gains the "venv" scheme,
it will be preferred.

Fixes #433
  • Loading branch information
hroncok committed Jan 31, 2022
1 parent 96f9188 commit 0b56f28
Showing 1 changed file with 12 additions and 5 deletions.
17 changes: 12 additions & 5 deletions src/build/env.py
Expand Up @@ -293,14 +293,21 @@ def _find_executable_and_scripts(path: str) -> Tuple[str, str, str]:
"""
config_vars = sysconfig.get_config_vars().copy() # globally cached, copy before altering it
config_vars['base'] = path
# Python distributors with custom default installation scheme can set a
# scheme that can't be used to expand the paths in a venv.
# This can happen if build itself is not installed in a venv.
# The distributors are encouraged to set a "venv" scheme to be used for this.
# See https://bugs.python.org/issue45413
# and https://github.com/pypa/virtualenv/issues/2208
#
# The Python that ships with the macOS developer tools varies the
# default scheme depending on whether the ``sys.prefix`` is part of a framework.
# The framework "osx_framework_library" scheme
# can't be used to expand the paths in a venv, which
# can happen if build itself is not installed in a venv.
# But it does not (yet) set the "venv" scheme.
# If the Apple-custom "osx_framework_library" scheme is available
# we enforce "posix_prefix", the venv scheme, for isolated envs.
if 'osx_framework_library' in sysconfig.get_scheme_names():
# we enforce "posix_prefix", instead.
if 'venv' in sysconfig.get_scheme_names():
paths = sysconfig.get_paths(scheme='venv', vars=config_vars)
elif 'osx_framework_library' in sysconfig.get_scheme_names():
paths = sysconfig.get_paths(scheme='posix_prefix', vars=config_vars)
else:
paths = sysconfig.get_paths(vars=config_vars)
Expand Down

0 comments on commit 0b56f28

Please sign in to comment.