Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,10 @@ Changelog
*unreleased*
~~~~~~~~~~~~

No unreleased changes.
Behavior adaptations:

* Prefer native ``linux_*`` platform tags over ``manylinux`` and ``musllinux``
tags on Linux. (:issue:`160`)

26.2 - 2026-04-24
~~~~~~~~~~~~~~~~~
Expand Down
4 changes: 2 additions & 2 deletions src/packaging/tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -773,10 +773,10 @@ def _linux_platforms(is_32bit: bool = _32_BIT_INTERPRETER) -> Iterator[str]:
linux = "linux_armv8l"
_, arch = linux.split("_", 1)
archs = {"armv8l": ["armv8l", "armv7l"]}.get(arch, [arch])
yield from _manylinux.platform_tags(archs)
yield from _musllinux.platform_tags(archs)
for arch in archs:
yield f"linux_{arch}"
yield from _manylinux.platform_tags(archs)
yield from _musllinux.platform_tags(archs)


def _emscripten_platforms() -> Iterator[str]:
Expand Down
36 changes: 19 additions & 17 deletions tests/test_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -613,9 +613,7 @@ def test_linux_platforms_32_64bit_on_64bit_os(
monkeypatch.setattr(sysconfig, "get_platform", lambda: arch)
monkeypatch.setattr(os, "confstr", lambda _: "glibc 2.20", raising=False)
monkeypatch.setattr(tags._manylinux, "_is_compatible", lambda *args: False) # type: ignore[attr-defined]
linux_platform = list(tags._linux_platforms(is_32bit=is_32bit))[
-len(expected) :
]
linux_platform = list(tags._linux_platforms(is_32bit=is_32bit))[: len(expected)]
assert linux_platform == expected

def test_linux_platforms_manylinux_unsupported(
Expand All @@ -638,9 +636,9 @@ def test_linux_platforms_manylinux1(self, monkeypatch: pytest.MonkeyPatch) -> No
monkeypatch.setattr(os, "confstr", lambda _: "glibc 2.20", raising=False)
platforms = list(tags._linux_platforms(is_32bit=False))
assert platforms == [
"linux_x86_64",
"manylinux_2_5_x86_64",
"manylinux1_x86_64",
"linux_x86_64",
]

def test_linux_platforms_manylinux2010(
Expand All @@ -651,6 +649,7 @@ def test_linux_platforms_manylinux2010(
monkeypatch.setattr(os, "confstr", lambda _: "glibc 2.12", raising=False)
platforms = list(tags._linux_platforms(is_32bit=False))
expected = [
"linux_x86_64",
"manylinux_2_12_x86_64",
"manylinux2010_x86_64",
"manylinux_2_11_x86_64",
Expand All @@ -661,7 +660,6 @@ def test_linux_platforms_manylinux2010(
"manylinux_2_6_x86_64",
"manylinux_2_5_x86_64",
"manylinux1_x86_64",
"linux_x86_64",
]
assert platforms == expected

Expand All @@ -674,6 +672,7 @@ def test_linux_platforms_manylinux2014(
platforms = list(tags._linux_platforms(is_32bit=False))
arch = platform.machine()
expected = [
"linux_" + arch,
"manylinux_2_17_" + arch,
"manylinux2014_" + arch,
"manylinux_2_16_" + arch,
Expand All @@ -690,7 +689,6 @@ def test_linux_platforms_manylinux2014(
"manylinux_2_6_" + arch,
"manylinux_2_5_" + arch,
"manylinux1_" + arch,
"linux_" + arch,
]
assert platforms == expected

Expand Down Expand Up @@ -719,10 +717,9 @@ def test_linux_platforms_manylinux2014_armhf_abi(
)
platforms = list(tags._linux_platforms(is_32bit=True))
archs = {"armv8l": ["armv8l", "armv7l"]}.get(cross_arch, [cross_arch])
expected = []
expected = [f"linux_{arch}" for arch in archs]
for arch in archs:
expected.extend([f"manylinux_2_17_{arch}", f"manylinux2014_{arch}"])
expected.extend(f"linux_{arch}" for arch in archs)
assert platforms == expected

def test_linux_platforms_manylinux2014_i386_abi(
Expand All @@ -741,6 +738,7 @@ def test_linux_platforms_manylinux2014_i386_abi(
)
platforms = list(tags._linux_platforms(is_32bit=True))
expected = [
"linux_i686",
"manylinux_2_17_i686",
"manylinux2014_i686",
"manylinux_2_16_i686",
Expand All @@ -757,7 +755,6 @@ def test_linux_platforms_manylinux2014_i386_abi(
"manylinux_2_6_i686",
"manylinux_2_5_i686",
"manylinux1_i686",
"linux_i686",
]
assert platforms == expected

Expand All @@ -779,9 +776,14 @@ def test_linux_platforms_manylinux_glibc3(
)
platforms = list(tags._linux_platforms(is_32bit=False))
expected = (
["manylinux_3_2_aarch64", "manylinux_3_1_aarch64", "manylinux_3_0_aarch64"]
[
"linux_aarch64",
"manylinux_3_2_aarch64",
"manylinux_3_1_aarch64",
"manylinux_3_0_aarch64",
]
+ [f"manylinux_2_{i}_aarch64" for i in range(50, 16, -1)]
+ ["manylinux2014_aarch64", "linux_aarch64"]
+ ["manylinux2014_aarch64"]
)
assert platforms == expected

Expand Down Expand Up @@ -818,13 +820,12 @@ def test_linux_platforms_musllinux(
platforms = list(tags._linux_platforms(is_32bit=cross32))
target_arch = cross32_arch if cross32 else native_arch
archs = {"armv8l": ["armv8l", "armv7l"]}.get(target_arch, [target_arch])
expected: list[str] = []
expected = [f"linux_{arch}" for arch in archs]
for arch in archs:
expected.extend(
f"musllinux_{musl_version[0]}_{minor}_{arch}"
for minor in range(musl_version[1], -1, -1)
)
expected.extend(f"linux_{arch}" for arch in archs)
assert platforms == expected

assert recorder.calls == [pretend.call(fake_executable)]
Expand Down Expand Up @@ -1656,12 +1657,12 @@ def test_skip_manylinux_2014(
manylinux_module, "manylinux2014_compatible", False, raising=False
)
expected = [
"linux_ppc64",
"manylinux_2_20_ppc64",
"manylinux_2_19_ppc64",
"manylinux_2_18_ppc64",
# "manylinux2014_ppc64", # this one is skipped
# "manylinux_2_17_ppc64", # this one is also skipped
"linux_ppc64",
]
platforms = list(tags._linux_platforms())
assert platforms == expected
Expand Down Expand Up @@ -1719,8 +1720,9 @@ def manylinux_compatible(tag_major: int, tag_minor: int, tag_arch: str) -> bool:
raising=False,
)
platforms = list(tags._linux_platforms(is_32bit=False))
expected = [f"manylinux_2_22_{machine}"] if tf else []
expected.append(f"linux_{machine}")
expected = [f"linux_{machine}"]
if tf:
expected.append(f"manylinux_2_22_{machine}")
assert platforms == expected

def test_linux_use_manylinux_compatible_none(
Expand All @@ -1745,13 +1747,13 @@ def manylinux_compatible(
)
platforms = list(tags._linux_platforms(is_32bit=False))
expected = [
"linux_x86_64",
"manylinux_2_30_x86_64",
"manylinux_2_29_x86_64",
"manylinux_2_28_x86_64",
"manylinux_2_27_x86_64",
"manylinux_2_26_x86_64",
"manylinux_2_25_x86_64",
"linux_x86_64",
]
assert platforms == expected

Expand Down
Loading