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 authored and FFY00 committed Mar 18, 2022
1 parent 5509a02 commit a649f47
Showing 1 changed file with 13 additions and 6 deletions.
19 changes: 13 additions & 6 deletions src/build/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -298,14 +298,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.
# 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():
# But it does not (yet) set the "venv" scheme.
# If the Apple-custom "osx_framework_library" scheme is available but "venv"
# is not, we use "posix_prefix" instead which is venv-compatible there.
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 a649f47

Please sign in to comment.