mirror of
https://github.com/python/cpython.git
synced 2025-08-22 09:45:06 +00:00
[3.12] gh-105084: Tests: Use setuptools+wheel from sysconfig.get_config_var('WHEEL_PKG_DIR') if set (#105056) (#105424)
Includes part of the changes fromafa759fb80
, to make this apply. Co-Authored-By: Lysandros Nikolaou <lisandrosnik@gmail.com> (cherry picked from commitbd98b65e97
)
This commit is contained in:
parent
92929fd20e
commit
04b9168037
3 changed files with 67 additions and 33 deletions
|
@ -2270,6 +2270,62 @@ def requires_venv_with_pip():
|
||||||
return unittest.skipUnless(ctypes, 'venv: pip requires ctypes')
|
return unittest.skipUnless(ctypes, 'venv: pip requires ctypes')
|
||||||
|
|
||||||
|
|
||||||
|
@functools.cache
|
||||||
|
def _findwheel(pkgname):
|
||||||
|
"""Try to find a wheel with the package specified as pkgname.
|
||||||
|
|
||||||
|
If set, the wheels are searched for in WHEEL_PKG_DIR (see ensurepip).
|
||||||
|
Otherwise, they are searched for in the test directory.
|
||||||
|
"""
|
||||||
|
wheel_dir = sysconfig.get_config_var('WHEEL_PKG_DIR') or TEST_HOME_DIR
|
||||||
|
filenames = os.listdir(wheel_dir)
|
||||||
|
filenames = sorted(filenames, reverse=True) # approximate "newest" first
|
||||||
|
for filename in filenames:
|
||||||
|
# filename is like 'setuptools-67.6.1-py3-none-any.whl'
|
||||||
|
if not filename.endswith(".whl"):
|
||||||
|
continue
|
||||||
|
prefix = pkgname + '-'
|
||||||
|
if filename.startswith(prefix):
|
||||||
|
return os.path.join(wheel_dir, filename)
|
||||||
|
raise FileNotFoundError(f"No wheel for {pkgname} found in {wheel_dir}")
|
||||||
|
|
||||||
|
|
||||||
|
# Context manager that creates a virtual environment, install setuptools and wheel in it
|
||||||
|
# and returns the path to the venv directory and the path to the python executable
|
||||||
|
@contextlib.contextmanager
|
||||||
|
def setup_venv_with_pip_setuptools_wheel(venv_dir):
|
||||||
|
import subprocess
|
||||||
|
from .os_helper import temp_cwd
|
||||||
|
|
||||||
|
with temp_cwd() as temp_dir:
|
||||||
|
# Create virtual environment to get setuptools
|
||||||
|
cmd = [sys.executable, '-X', 'dev', '-m', 'venv', venv_dir]
|
||||||
|
if verbose:
|
||||||
|
print()
|
||||||
|
print('Run:', ' '.join(cmd))
|
||||||
|
subprocess.run(cmd, check=True)
|
||||||
|
|
||||||
|
venv = os.path.join(temp_dir, venv_dir)
|
||||||
|
|
||||||
|
# Get the Python executable of the venv
|
||||||
|
python_exe = os.path.basename(sys.executable)
|
||||||
|
if sys.platform == 'win32':
|
||||||
|
python = os.path.join(venv, 'Scripts', python_exe)
|
||||||
|
else:
|
||||||
|
python = os.path.join(venv, 'bin', python_exe)
|
||||||
|
|
||||||
|
cmd = [python, '-X', 'dev',
|
||||||
|
'-m', 'pip', 'install',
|
||||||
|
_findwheel('setuptools'),
|
||||||
|
_findwheel('wheel')]
|
||||||
|
if verbose:
|
||||||
|
print()
|
||||||
|
print('Run:', ' '.join(cmd))
|
||||||
|
subprocess.run(cmd, check=True)
|
||||||
|
|
||||||
|
yield python
|
||||||
|
|
||||||
|
|
||||||
# True if Python is built with the Py_DEBUG macro defined: if
|
# True if Python is built with the Py_DEBUG macro defined: if
|
||||||
# Python is built in debug mode (./configure --with-pydebug).
|
# Python is built in debug mode (./configure --with-pydebug).
|
||||||
Py_DEBUG = hasattr(sys, 'gettotalrefcount')
|
Py_DEBUG = hasattr(sys, 'gettotalrefcount')
|
||||||
|
|
|
@ -35,39 +35,20 @@ class TestCPPExt(unittest.TestCase):
|
||||||
# the test uses venv+pip: skip if it's not available
|
# the test uses venv+pip: skip if it's not available
|
||||||
@support.requires_venv_with_pip()
|
@support.requires_venv_with_pip()
|
||||||
def check_build(self, std_cpp03, extension_name):
|
def check_build(self, std_cpp03, extension_name):
|
||||||
# Build in a temporary directory
|
venv_dir = 'env'
|
||||||
with os_helper.temp_cwd():
|
with support.setup_venv_with_pip_setuptools_wheel(venv_dir) as python_exe:
|
||||||
self._check_build(std_cpp03, extension_name)
|
self._check_build(std_cpp03, extension_name, python_exe)
|
||||||
|
|
||||||
def _check_build(self, std_cpp03, extension_name):
|
def _check_build(self, std_cpp03, extension_name, python_exe):
|
||||||
pkg_dir = 'pkg'
|
pkg_dir = 'pkg'
|
||||||
os.mkdir(pkg_dir)
|
os.mkdir(pkg_dir)
|
||||||
shutil.copy(SETUP_TESTCPPEXT, os.path.join(pkg_dir, "setup.py"))
|
shutil.copy(SETUP_TESTCPPEXT, os.path.join(pkg_dir, "setup.py"))
|
||||||
|
|
||||||
venv_dir = 'env'
|
|
||||||
verbose = support.verbose
|
|
||||||
|
|
||||||
# Create virtual environment to get setuptools
|
|
||||||
cmd = [sys.executable, '-X', 'dev', '-m', 'venv', venv_dir]
|
|
||||||
if verbose:
|
|
||||||
print()
|
|
||||||
print('Run:', ' '.join(cmd))
|
|
||||||
subprocess.run(cmd, check=True)
|
|
||||||
|
|
||||||
# Get the Python executable of the venv
|
|
||||||
python_exe = 'python'
|
|
||||||
if sys.executable.endswith('.exe'):
|
|
||||||
python_exe += '.exe'
|
|
||||||
if MS_WINDOWS:
|
|
||||||
python = os.path.join(venv_dir, 'Scripts', python_exe)
|
|
||||||
else:
|
|
||||||
python = os.path.join(venv_dir, 'bin', python_exe)
|
|
||||||
|
|
||||||
def run_cmd(operation, cmd):
|
def run_cmd(operation, cmd):
|
||||||
env = os.environ.copy()
|
env = os.environ.copy()
|
||||||
env['CPYTHON_TEST_CPP_STD'] = 'c++03' if std_cpp03 else 'c++11'
|
env['CPYTHON_TEST_CPP_STD'] = 'c++03' if std_cpp03 else 'c++11'
|
||||||
env['CPYTHON_TEST_EXT_NAME'] = extension_name
|
env['CPYTHON_TEST_EXT_NAME'] = extension_name
|
||||||
if verbose:
|
if support.verbose:
|
||||||
print('Run:', ' '.join(cmd))
|
print('Run:', ' '.join(cmd))
|
||||||
subprocess.run(cmd, check=True, env=env)
|
subprocess.run(cmd, check=True, env=env)
|
||||||
else:
|
else:
|
||||||
|
@ -81,14 +62,8 @@ class TestCPPExt(unittest.TestCase):
|
||||||
self.fail(
|
self.fail(
|
||||||
f"{operation} failed with exit code {proc.returncode}")
|
f"{operation} failed with exit code {proc.returncode}")
|
||||||
|
|
||||||
cmd = [python, '-X', 'dev',
|
|
||||||
'-m', 'pip', 'install',
|
|
||||||
support.findfile('setuptools-67.6.1-py3-none-any.whl'),
|
|
||||||
support.findfile('wheel-0.40.0-py3-none-any.whl')]
|
|
||||||
run_cmd('Install build dependencies', cmd)
|
|
||||||
|
|
||||||
# Build and install the C++ extension
|
# Build and install the C++ extension
|
||||||
cmd = [python, '-X', 'dev',
|
cmd = [python_exe, '-X', 'dev',
|
||||||
'-m', 'pip', 'install', '--no-build-isolation',
|
'-m', 'pip', 'install', '--no-build-isolation',
|
||||||
os.path.abspath(pkg_dir)]
|
os.path.abspath(pkg_dir)]
|
||||||
run_cmd('Install', cmd)
|
run_cmd('Install', cmd)
|
||||||
|
@ -96,14 +71,14 @@ class TestCPPExt(unittest.TestCase):
|
||||||
# Do a reference run. Until we test that running python
|
# Do a reference run. Until we test that running python
|
||||||
# doesn't leak references (gh-94755), run it so one can manually check
|
# doesn't leak references (gh-94755), run it so one can manually check
|
||||||
# -X showrefcount results against this baseline.
|
# -X showrefcount results against this baseline.
|
||||||
cmd = [python,
|
cmd = [python_exe,
|
||||||
'-X', 'dev',
|
'-X', 'dev',
|
||||||
'-X', 'showrefcount',
|
'-X', 'showrefcount',
|
||||||
'-c', 'pass']
|
'-c', 'pass']
|
||||||
run_cmd('Reference run', cmd)
|
run_cmd('Reference run', cmd)
|
||||||
|
|
||||||
# Import the C++ extension
|
# Import the C++ extension
|
||||||
cmd = [python,
|
cmd = [python_exe,
|
||||||
'-X', 'dev',
|
'-X', 'dev',
|
||||||
'-X', 'showrefcount',
|
'-X', 'showrefcount',
|
||||||
'-c', f"import {extension_name}"]
|
'-c', f"import {extension_name}"]
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
When the Python build is configured ``--with-wheel-pkg-dir``, tests
|
||||||
|
requiring the ``setuptools`` and ``wheel`` wheels will search for the wheels
|
||||||
|
in ``WHEEL_PKG_DIR``.
|
Loading…
Add table
Add a link
Reference in a new issue