Skip ARM64 tests automatically with warning, and improved cleanup

This commit is contained in:
Steve Dower
2022-08-31 21:08:15 +01:00
parent 9a4e8f671f
commit f277099850
2 changed files with 107 additions and 93 deletions
+30 -6
View File
@@ -1,6 +1,5 @@
from __future__ import annotations from __future__ import annotations
import atexit
import os import os
import platform as platform_module import platform as platform_module
import shutil import shutil
@@ -10,7 +9,7 @@ import textwrap
from dataclasses import dataclass from dataclasses import dataclass
from functools import lru_cache from functools import lru_cache
from pathlib import Path from pathlib import Path
from typing import Sequence from typing import Callable, Sequence
from zipfile import ZipFile from zipfile import ZipFile
from filelock import FileLock from filelock import FileLock
@@ -133,6 +132,7 @@ def setup_setuptools_cross_compile(
python_configuration: PythonConfiguration, python_configuration: PythonConfiguration,
python_libs_base: Path, python_libs_base: Path,
env: dict[str, str], env: dict[str, str],
cleanup_command_list: list[Callable[[], None]],
) -> None: ) -> None:
# We write to distutils_cfg for distutils-based builds to override some # We write to distutils_cfg for distutils-based builds to override some
# settings. Ideally, we'd pass them on the command line, but since we don't # settings. Ideally, we'd pass them on the command line, but since we don't
@@ -168,14 +168,14 @@ def setup_setuptools_cross_compile(
f"Unable to configure setuptools for cross-compiling because existing {distutils_cfg} file cannot be backed up. Error was {exc}" f"Unable to configure setuptools for cross-compiling because existing {distutils_cfg} file cannot be backed up. Error was {exc}"
) )
return return
atexit.register(lambda: distutils_bak.replace(distutils_cfg)) cleanup_command_list.append(lambda: distutils_bak.replace(distutils_cfg))
elif distutils_cfg.is_dir(): elif distutils_cfg.is_dir():
log.warning( log.warning(
f"Unable to configure setuptools for cross-compiling because {distutils_cfg} is a directory" f"Unable to configure setuptools for cross-compiling because {distutils_cfg} is a directory"
) )
return return
else: else:
atexit.register(lambda: distutils_cfg.unlink()) cleanup_command_list.append(lambda: distutils_cfg.unlink())
# Ensure our additional import libraries are made available, and explicitly # Ensure our additional import libraries are made available, and explicitly
# set the platform name # set the platform name
@@ -220,6 +220,7 @@ def setup_rust_cross_compile(
python_configuration: PythonConfiguration, python_configuration: PythonConfiguration,
python_libs_base: Path, python_libs_base: Path,
env: dict[str, str], env: dict[str, str],
cleanup_command_list: list[Callable[[], None]],
) -> None: ) -> None:
# Assume that MSVC will be used, because we already know that we are # Assume that MSVC will be used, because we already know that we are
# cross-compiling. MinGW users can set CARGO_BUILD_TARGET themselves # cross-compiling. MinGW users can set CARGO_BUILD_TARGET themselves
@@ -250,6 +251,7 @@ def setup_python(
dependency_constraint_flags: Sequence[PathOrStr], dependency_constraint_flags: Sequence[PathOrStr],
environment: ParsedEnvironment, environment: ParsedEnvironment,
build_frontend: BuildFrontend, build_frontend: BuildFrontend,
cleanup_command_list: list[Callable[[], None]],
) -> dict[str, str]: ) -> dict[str, str]:
tmp.mkdir() tmp.mkdir()
implementation_id = python_configuration.identifier.split("-")[0] implementation_id = python_configuration.identifier.split("-")[0]
@@ -371,8 +373,8 @@ def setup_python(
if python_libs_base: if python_libs_base:
# Set up the environment for various backends to enable cross-compilation # Set up the environment for various backends to enable cross-compilation
setup_setuptools_cross_compile(python_configuration, python_libs_base, env) setup_setuptools_cross_compile(python_configuration, python_libs_base, env, cleanup_command_list)
setup_rust_cross_compile(python_configuration, python_libs_base, env) setup_rust_cross_compile(python_configuration, python_libs_base, env, cleanup_command_list)
return env return env
@@ -415,6 +417,9 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.dependency_constraints.get_for_python_version(config.version), build_options.dependency_constraints.get_for_python_version(config.version),
] ]
# list of callables to do any urgent cleanup, for example,
# config files that may bleed into other builds
cleanup_command_list = []
# install Python # install Python
env = setup_python( env = setup_python(
identifier_tmp_dir / "build", identifier_tmp_dir / "build",
@@ -422,8 +427,10 @@ def build(options: Options, tmp_path: Path) -> None:
dependency_constraint_flags, dependency_constraint_flags,
build_options.environment, build_options.environment,
build_options.build_frontend, build_options.build_frontend,
cleanup_command_list,
) )
try:
compatible_wheel = find_compatible_wheel(built_wheels, config.identifier) compatible_wheel = find_compatible_wheel(built_wheels, config.identifier)
if compatible_wheel: if compatible_wheel:
log.step_end() log.step_end()
@@ -515,7 +522,24 @@ def build(options: Options, tmp_path: Path) -> None:
if repaired_wheel.name in {wheel.name for wheel in built_wheels}: if repaired_wheel.name in {wheel.name for wheel in built_wheels}:
raise AlreadyBuiltWheelError(repaired_wheel.name) raise AlreadyBuiltWheelError(repaired_wheel.name)
finally:
while cleanup_command_list:
cleanup_command_list.pop(0)()
if build_options.test_command and options.globals.test_selector(config.identifier): if build_options.test_command and options.globals.test_selector(config.identifier):
if config.arch == "ARM64" != platform_module.machine():
log.warning(
unwrap(
"""
While arm64 wheels can be built on other platforms, they cannot
be tested. An arm64 runner is required. To silence this warning,
set `CIBW_TEST_SKIP: *-win_arm64`.
"""
)
)
# skip this test
continue
log.step("Testing wheel...") log.step("Testing wheel...")
# set up a virtual environment to install and test from, to make sure # set up a virtual environment to install and test from, to make sure
# there are no dependencies that were pulled in at build time. # there are no dependencies that were pulled in at build time.
-10
View File
@@ -72,13 +72,6 @@ class TestSpam(TestCase):
''' '''
ADD_ENV: dict[str, str] = {}
if utils.platform == "windows":
if platform.machine() != "ARM64":
ADD_ENV["CIBW_TEST_SKIP"] = "*-win_arm64 " + ADD_ENV.get("CIBW_TEST_SKIP", "")
def test(tmp_path): def test(tmp_path):
project_dir = tmp_path / "project" project_dir = tmp_path / "project"
project_with_a_test.generate(project_dir) project_with_a_test.generate(project_dir)
@@ -92,7 +85,6 @@ def test(tmp_path):
# mac/linux. # mac/linux.
"CIBW_TEST_COMMAND": "false || pytest {project}/test", "CIBW_TEST_COMMAND": "false || pytest {project}/test",
"CIBW_TEST_COMMAND_WINDOWS": "COLOR 00 || pytest {project}/test", "CIBW_TEST_COMMAND_WINDOWS": "COLOR 00 || pytest {project}/test",
**ADD_ENV,
}, },
) )
@@ -114,7 +106,6 @@ def test_extras_require(tmp_path):
# mac/linux. # mac/linux.
"CIBW_TEST_COMMAND": "false || pytest {project}/test", "CIBW_TEST_COMMAND": "false || pytest {project}/test",
"CIBW_TEST_COMMAND_WINDOWS": "COLOR 00 || pytest {project}/test", "CIBW_TEST_COMMAND_WINDOWS": "COLOR 00 || pytest {project}/test",
**ADD_ENV,
}, },
) )
@@ -152,7 +143,6 @@ def test_failing_test(tmp_path):
# problems with this, so let's check that. # problems with this, so let's check that.
"CIBW_MANYLINUX_I686_IMAGE": "manylinux1", "CIBW_MANYLINUX_I686_IMAGE": "manylinux1",
"CIBW_MANYLINUX_X86_64_IMAGE": "manylinux1", "CIBW_MANYLINUX_X86_64_IMAGE": "manylinux1",
**ADD_ENV,
}, },
) )