diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 58aa51a7..a56d6463 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -4,7 +4,8 @@ Changelog *unreleased* ~~~~~~~~~~~~ -No changes yet. +* Fix a bug that caused a 32-bit OS that runs on a 64-bit ARM CPU (e.g. ARM-v8, + aarch64), to report the wrong bitness. 20.1 - 2020-01-24 ~~~~~~~~~~~~~~~~~~~ diff --git a/packaging/tags.py b/packaging/tags.py index 60a69d8f..3c5e11a5 100644 --- a/packaging/tags.py +++ b/packaging/tags.py @@ -636,8 +636,11 @@ def _have_compatible_manylinux_abi(arch): def _linux_platforms(is_32bit=_32_BIT_INTERPRETER): # type: (bool) -> Iterator[str] linux = _normalize_string(distutils.util.get_platform()) - if linux == "linux_x86_64" and is_32bit: - linux = "linux_i686" + if is_32bit: + if linux == "linux_x86_64": + linux = "linux_i686" + elif linux == "linux_aarch64": + linux = "linux_armv7l" manylinux_support = [] _, arch = linux.split("_", 1) if _have_compatible_manylinux_abi(arch): diff --git a/tests/test_tags.py b/tests/test_tags.py index d7c1514a..82364898 100644 --- a/tests/test_tags.py +++ b/tests/test_tags.py @@ -37,11 +37,6 @@ def is_x86(): return re.match(r"(i\d86|x86_64)", platform.machine()) is not None -@pytest.fixture -def is_64bit_os(): - return platform.architecture()[0] == "64bit" - - @pytest.fixture def manylinux_module(monkeypatch): monkeypatch.setattr(tags, "_have_compatible_glibc", lambda *args: False) @@ -415,19 +410,22 @@ def test_glibc_version_string_none(self, monkeypatch): monkeypatch.setattr(tags, "_glibc_version_string", lambda: None) assert not tags._have_compatible_glibc(2, 4) - def test_linux_platforms_64bit_on_64bit_os(self, is_64bit_os, is_x86, monkeypatch): - if platform.system() != "Linux" or not is_64bit_os or not is_x86: - monkeypatch.setattr(distutils.util, "get_platform", lambda: "linux_x86_64") - monkeypatch.setattr(tags, "_is_manylinux_compatible", lambda *args: False) - linux_platform = list(tags._linux_platforms(is_32bit=False))[-1] - assert linux_platform == "linux_x86_64" - - def test_linux_platforms_32bit_on_64bit_os(self, is_64bit_os, is_x86, monkeypatch): - if platform.system() != "Linux" or not is_64bit_os or not is_x86: - monkeypatch.setattr(distutils.util, "get_platform", lambda: "linux_x86_64") - monkeypatch.setattr(tags, "_is_manylinux_compatible", lambda *args: False) - linux_platform = list(tags._linux_platforms(is_32bit=True))[-1] - assert linux_platform == "linux_i686" + @pytest.mark.parametrize( + "arch,is_32bit,expected", + [ + ("linux-x86_64", False, "linux_x86_64"), + ("linux-x86_64", True, "linux_i686"), + ("linux-aarch64", False, "linux_aarch64"), + ("linux-aarch64", True, "linux_armv7l"), + ], + ) + def test_linux_platforms_32_64bit_on_64bit_os( + self, arch, is_32bit, expected, monkeypatch + ): + monkeypatch.setattr(distutils.util, "get_platform", lambda: arch) + monkeypatch.setattr(tags, "_is_manylinux_compatible", lambda *args: False) + linux_platform = list(tags._linux_platforms(is_32bit=is_32bit))[-1] + assert linux_platform == expected def test_linux_platforms_manylinux_unsupported(self, monkeypatch): monkeypatch.setattr(distutils.util, "get_platform", lambda: "linux_x86_64")