| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #-----------------------------------------------------------------------------
- # Copyright (c) 2005-2023, PyInstaller Development Team.
- #
- # Distributed under the terms of the GNU General Public License (version 2
- # or later) with exception for distributing the bootloader.
- #
- # The full license is in the file COPYING.txt, distributed with this software.
- #
- # SPDX-License-Identifier: (GPL-2.0-or-later WITH Bootloader-exception)
- #-----------------------------------------------------------------------------
- """
- Code to be shared by PyInstaller and the bootloader/wscript file.
- This code must not assume that either PyInstaller or any of its dependencies installed. I.e., the only imports allowed
- in here are standard library ones. Within reason, it is preferable that this file should still run under Python 2.7 as
- many compiler docker images still have only Python 2 installed.
- """
- import re
- def _pyi_machine(machine, system):
- # type: (str, str) -> str
- """
- Choose an intentionally simplified architecture identifier to be used in the bootloader's directory name.
- Args:
- machine:
- The output of ``platform.machine()`` or any known architecture alias or shorthand that may be used by a
- C compiler.
- system:
- The output of ``platform.system()`` on the target machine.
- Returns:
- Either a string tag or, on platforms that don't need an architecture tag, ``None``.
- Ideally, we would just use ``platform.machine()`` directly, but that makes cross-compiling the bootloader almost
- impossible, because you need to know at compile time exactly what ``platform.machine()`` will be at run time, based
- only on the machine name alias or shorthand reported by the C compiler at the build time. Rather, use a loose
- differentiation, and trust that anyone mixing armv6l with armv6h knows what they are doing.
- """
- # See the corresponding tests in tests/unit/test_compat.py for examples.
- if system == "Windows":
- if machine.lower().startswith("arm"):
- return "arm"
- else:
- return "intel"
- if system == "SunOS":
- if machine.lower() in ("x86_64", "x86", "i86pc"):
- return "intel"
- else:
- return "sparc"
- # Fold Android back into Linux. Currently, Termux environment is the only way to run PyInstaller on Android.
- # Starting with python 3.13, `platform.system()` reports 'Android' (see PEP-738); earlier versions reported 'Linux'.
- # The compiler-based target platform identification in `waf`, however, identifies target platform as Linux on all
- # python versions.
- if system == "Android":
- system = "Linux"
- if system != "Linux":
- # No architecture specifier for anything par Linux.
- # - macOS is on two 64 bit architectures, but they are merged into one "universal2" bootloader.
- # - BSD supports a wide range of architectures, but according to PyPI's download statistics, every one of our
- # BSD users are on x86_64. This may change in the distant future.
- return
- if machine.startswith(("arm", "aarch")):
- # ARM has a huge number of similar and aliased sub-versions, such as armv5, armv6l armv8h, aarch64.
- return "arm"
- if machine in ("thumb"):
- # Reported by waf/gcc when Thumb instruction set is enabled on 32-bit ARM. The platform.machine() returns "arm"
- # regardless of the instruction set.
- return "arm"
- if machine in ("x86_64", "x64", "x86"):
- return "intel"
- if re.fullmatch("i[1-6]86", machine):
- return "intel"
- if machine.startswith(("ppc", "powerpc")):
- # PowerPC comes in 64 vs 32 bit and little vs big endian variants.
- return "ppc"
- if machine in ("mips64", "mips"):
- return "mips"
- if machine.startswith("riscv"):
- return "riscv"
- if machine.startswith(("sw_", "sunway")):
- return "sunway"
- if machine.startswith("loongarch"):
- return "loongarch"
- # Machines with no known aliases :)
- if machine in ("s390x",):
- return machine
- # Unknown architectures are allowed by default, but will all be placed under one directory. In theory, trying to
- # have multiple unknown architectures in one copy of PyInstaller will not work, but that should be sufficiently
- # unlikely to ever happen.
- return "unknown"
|