feat: add support for py3-none-{platform} wheels (#1151)
* feature: add support for `py3-none-{platform}` wheels
This extends the mechanism introduced in #1091 for `abi3` wheels.
Most of the mentions to `abi3` have been removed and replaced by a more generic `compatible_wheel`.
This allows to build a wheel `foo-0.1-py3-none-win_amd64.whl` only once and still test with every configured python.
* Add integration test for py3-none abi wheels
* Fix expected_wheels for py3-none abi
* Limit test to three pythons and check for certain log messages
* chore: add some comments to explain filter process
Co-authored-by: Joe Rickerby <joerick@mac.com>
Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
This commit is contained in:
co-authored by
Joe Rickerby
Henry Schreiner
parent
075792473a
commit
9a537512c1
+24
-13
@@ -53,7 +53,7 @@ __all__ = [
|
||||
"MANYLINUX_ARCHS",
|
||||
"call",
|
||||
"shell",
|
||||
"find_compatible_abi3_wheel",
|
||||
"find_compatible_wheel",
|
||||
"format_safe",
|
||||
"prepare_command",
|
||||
"get_build_verbosity_extra_flags",
|
||||
@@ -575,36 +575,47 @@ def virtualenv(
|
||||
T = TypeVar("T", bound=PurePath)
|
||||
|
||||
|
||||
def find_compatible_abi3_wheel(wheels: Sequence[T], identifier: str) -> Optional[T]:
|
||||
def find_compatible_wheel(wheels: Sequence[T], identifier: str) -> Optional[T]:
|
||||
"""
|
||||
Finds an ABI3 wheel in `wheels` compatible with the Python interpreter
|
||||
specified by `identifier`.
|
||||
Finds a wheel with an abi3 or a none ABI tag in `wheels` compatible with the Python interpreter
|
||||
specified by `identifier` that is previously built.
|
||||
"""
|
||||
|
||||
interpreter, platform = identifier.split("-")
|
||||
if not interpreter.startswith("cp3"):
|
||||
return None
|
||||
for wheel in wheels:
|
||||
_, _, _, tags = parse_wheel_filename(wheel.name)
|
||||
for tag in tags:
|
||||
if tag.abi != "abi3":
|
||||
if tag.abi == "abi3":
|
||||
# ABI3 wheels must start with cp3 for impl and tag
|
||||
if not (interpreter.startswith("cp3") and tag.interpreter.startswith("cp3")):
|
||||
continue
|
||||
elif tag.abi == "none":
|
||||
# CPythonless wheels must include py3 tag
|
||||
if tag.interpreter[:3] != "py3":
|
||||
continue
|
||||
else:
|
||||
# Other types of wheels are not detected, this is looking for previously built wheels.
|
||||
continue
|
||||
if not tag.interpreter.startswith("cp3"):
|
||||
continue
|
||||
if int(tag.interpreter[3:]) > int(interpreter[3:]):
|
||||
|
||||
if tag.interpreter != "py3" and int(tag.interpreter[3:]) > int(interpreter[3:]):
|
||||
# If a minor version number is given, it has to be lower than the current one.
|
||||
continue
|
||||
|
||||
if platform.startswith(("manylinux", "musllinux", "macosx")):
|
||||
# Linux, macOS
|
||||
# Linux, macOS require the beginning and ending match (macos/manylinux version doesn't need to)
|
||||
os_, arch = platform.split("_", 1)
|
||||
if not tag.platform.startswith(os_):
|
||||
continue
|
||||
if not tag.platform.endswith("_" + arch):
|
||||
if not tag.platform.endswith(f"_{arch}"):
|
||||
continue
|
||||
else:
|
||||
# Windows
|
||||
# Windows should exactly match
|
||||
if not tag.platform == platform:
|
||||
continue
|
||||
|
||||
# If all the filters above pass, then the wheel is a previously built compatible wheel.
|
||||
return wheel
|
||||
|
||||
return None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user