Skip ARM64 tests automatically with warning, and improved cleanup
This commit is contained in:
+30
-6
@@ -1,6 +1,5 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import atexit
|
||||
import os
|
||||
import platform as platform_module
|
||||
import shutil
|
||||
@@ -10,7 +9,7 @@ import textwrap
|
||||
from dataclasses import dataclass
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
from typing import Sequence
|
||||
from typing import Callable, Sequence
|
||||
from zipfile import ZipFile
|
||||
|
||||
from filelock import FileLock
|
||||
@@ -133,6 +132,7 @@ def setup_setuptools_cross_compile(
|
||||
python_configuration: PythonConfiguration,
|
||||
python_libs_base: Path,
|
||||
env: dict[str, str],
|
||||
cleanup_command_list: list[Callable[[], None]],
|
||||
) -> None:
|
||||
# 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
|
||||
@@ -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}"
|
||||
)
|
||||
return
|
||||
atexit.register(lambda: distutils_bak.replace(distutils_cfg))
|
||||
cleanup_command_list.append(lambda: distutils_bak.replace(distutils_cfg))
|
||||
elif distutils_cfg.is_dir():
|
||||
log.warning(
|
||||
f"Unable to configure setuptools for cross-compiling because {distutils_cfg} is a directory"
|
||||
)
|
||||
return
|
||||
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
|
||||
# set the platform name
|
||||
@@ -220,6 +220,7 @@ def setup_rust_cross_compile(
|
||||
python_configuration: PythonConfiguration,
|
||||
python_libs_base: Path,
|
||||
env: dict[str, str],
|
||||
cleanup_command_list: list[Callable[[], None]],
|
||||
) -> None:
|
||||
# Assume that MSVC will be used, because we already know that we are
|
||||
# cross-compiling. MinGW users can set CARGO_BUILD_TARGET themselves
|
||||
@@ -250,6 +251,7 @@ def setup_python(
|
||||
dependency_constraint_flags: Sequence[PathOrStr],
|
||||
environment: ParsedEnvironment,
|
||||
build_frontend: BuildFrontend,
|
||||
cleanup_command_list: list[Callable[[], None]],
|
||||
) -> dict[str, str]:
|
||||
tmp.mkdir()
|
||||
implementation_id = python_configuration.identifier.split("-")[0]
|
||||
@@ -371,8 +373,8 @@ def setup_python(
|
||||
|
||||
if python_libs_base:
|
||||
# Set up the environment for various backends to enable cross-compilation
|
||||
setup_setuptools_cross_compile(python_configuration, python_libs_base, env)
|
||||
setup_rust_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, cleanup_command_list)
|
||||
|
||||
return env
|
||||
|
||||
@@ -415,6 +417,9 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
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
|
||||
env = setup_python(
|
||||
identifier_tmp_dir / "build",
|
||||
@@ -422,8 +427,10 @@ def build(options: Options, tmp_path: Path) -> None:
|
||||
dependency_constraint_flags,
|
||||
build_options.environment,
|
||||
build_options.build_frontend,
|
||||
cleanup_command_list,
|
||||
)
|
||||
|
||||
try:
|
||||
compatible_wheel = find_compatible_wheel(built_wheels, config.identifier)
|
||||
if compatible_wheel:
|
||||
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}:
|
||||
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 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...")
|
||||
# set up a virtual environment to install and test from, to make sure
|
||||
# there are no dependencies that were pulled in at build time.
|
||||
|
||||
@@ -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):
|
||||
project_dir = tmp_path / "project"
|
||||
project_with_a_test.generate(project_dir)
|
||||
@@ -92,7 +85,6 @@ def test(tmp_path):
|
||||
# mac/linux.
|
||||
"CIBW_TEST_COMMAND": "false || 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.
|
||||
"CIBW_TEST_COMMAND": "false || 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.
|
||||
"CIBW_MANYLINUX_I686_IMAGE": "manylinux1",
|
||||
"CIBW_MANYLINUX_X86_64_IMAGE": "manylinux1",
|
||||
**ADD_ENV,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user