| # Copyright 2017 The Chromium Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import collections |
| import platform |
| import subprocess |
| import sys |
| |
| _MANYLINUX_ENV = { |
| 'LDSHARED': '/opt/rh/devtoolset-10/root/usr/bin/gcc -pthread -shared' |
| } |
| |
| |
| class Platform( |
| collections.namedtuple( |
| 'Platform', |
| ( |
| # The name of the platform. |
| 'name', |
| |
| # The value to pass to e.g. `./configure --host ...` |
| 'cross_triple', |
| |
| # The Python wheel ABI. |
| 'wheel_abi', |
| |
| # Tuple of Python wheel platforms. Must have at least one. |
| # |
| # This is used for local wheel naming. Wheels are named universally |
| # within CIPD packages. Changing this will not impact CIPD package |
| # contents, but will affect the locally generated intermediate wheel |
| # names. |
| 'wheel_plat', |
| |
| # The "dockcross" base image (can be None). |
| 'dockcross_base', |
| |
| # The tag to pull for the dockcross_base image |
| # (None if not using dockcross). |
| 'dockcross_tag', |
| |
| # The name of the dockerbuild docker image we have built |
| # for this platform. The same image may be shared between |
| # several Platform tuples. May be None if this platform |
| # does not use Docker. |
| 'dockerbuild_image', |
| |
| # The OpenSSL "Configure" script build target. |
| 'openssl_target', |
| |
| # Do Python wheels get packaged on PyPi for this platform? |
| 'packaged', |
| |
| # The name of the CIPD platform to use. |
| 'cipd_platform', |
| |
| # Extra environment variables to set when building wheels on this |
| # platform. |
| 'env', |
| |
| # Whether wheels are built for this platform by default. |
| 'default', |
| ))): |
| |
| @property |
| def dockcross_base_image(self): |
| if not self.dockcross_base: |
| return None |
| return 'dockcross/%s' % (self.dockcross_base,) |
| |
| @property |
| def dockcross_image_tag(self): |
| return 'infra-dockerbuild-%s' % (self.name,) |
| |
| @property |
| def universal(self): |
| return 'any' in self.wheel_plat |
| |
| |
| ALL = { |
| p.name: p for p in ( |
| Platform( |
| name='linux-armv6-py3.8', |
| cross_triple='armv6-unknown-linux-gnueabihf', |
| wheel_abi='cp38', |
| wheel_plat=('linux_armv6l', 'linux_armv7l', 'linux_armv8l', |
| 'linux_armv9l'), |
| dockcross_base='linux-armv6-lts', |
| dockcross_tag='20230222-162287d', |
| dockerbuild_image='linux-armv6-py3', |
| openssl_target='linux-armv4', |
| packaged=False, |
| cipd_platform='linux-armv6l', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='linux-armv6-py3.11', |
| cross_triple='armv6-unknown-linux-gnueabihf', |
| wheel_abi='cp311', |
| wheel_plat=('linux_armv6l', 'linux_armv7l', 'linux_armv8l', |
| 'linux_armv9l'), |
| dockcross_base='linux-armv6-lts', |
| dockcross_tag='20230222-162287d', |
| dockerbuild_image='linux-armv6-py3', |
| openssl_target='linux-armv4', |
| packaged=False, |
| cipd_platform='linux-armv6l', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='linux-arm64-py3.8', |
| cross_triple='aarch64-unknown-linux-gnu', |
| wheel_abi='cp38', |
| wheel_plat=('linux_arm64', 'linux_aarch64'), |
| dockcross_base='linux-arm64-lts', |
| dockcross_tag='20230222-162287d', |
| dockerbuild_image='linux-arm64-py3', |
| openssl_target='linux-aarch64', |
| packaged=False, |
| cipd_platform='linux-arm64', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='linux-arm64-py3.11', |
| cross_triple='aarch64-unknown-linux-gnu', |
| wheel_abi='cp311', |
| wheel_plat=('linux_arm64', 'linux_aarch64'), |
| dockcross_base='linux-arm64-lts', |
| dockcross_tag='20230222-162287d', |
| dockerbuild_image='linux-arm64-py3', |
| openssl_target='linux-aarch64', |
| packaged=False, |
| cipd_platform='linux-arm64', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='linux-riscv64-py3.8', |
| cross_triple='riscv64-linux-gnu', |
| wheel_abi='cp38', |
| wheel_plat=('linux_riscv64'), |
| dockcross_base='linux-riscv64', |
| dockcross_tag='20240104-6eda627', |
| dockerbuild_image='linux-riscv64-py3', |
| openssl_target='linux-riscv64', |
| packaged=False, |
| cipd_platform='linux-riscv64', |
| env={}, |
| default=False, |
| ), |
| Platform( |
| name='linux-riscv64-py3.11', |
| cross_triple='riscv64-linux-gnu', |
| wheel_abi='cp311', |
| wheel_plat=('linux_riscv64'), |
| dockcross_base='linux-riscv64', |
| dockcross_tag='20240104-6eda627', |
| dockerbuild_image='linux-riscv64-py3', |
| openssl_target='linux-riscv64', |
| packaged=False, |
| cipd_platform='linux-riscv64', |
| env={}, |
| default=False, |
| ), |
| Platform( |
| name='manylinux-x64-py3.8', |
| cross_triple='x86_64-linux-gnu', |
| wheel_abi='cp38', |
| wheel_plat=('manylinux2014_x86_64',), |
| dockcross_base='manylinux2014-x64', |
| dockcross_tag='20230222-162287d', |
| dockerbuild_image='manylinux-x64-py3', |
| openssl_target='linux-x86_64', |
| packaged=True, |
| cipd_platform='linux-amd64', |
| env=_MANYLINUX_ENV, |
| default=True, |
| ), |
| Platform( |
| name='manylinux-x64-py3.11', |
| cross_triple='x86_64-linux-gnu', |
| wheel_abi='cp311', |
| wheel_plat=('manylinux2014_x86_64',), |
| dockcross_base='manylinux2014-x64', |
| dockcross_tag='20230222-162287d', |
| dockerbuild_image='manylinux-x64-py3', |
| openssl_target='linux-x86_64', |
| packaged=False, # Most wheels not available on pypi.org |
| cipd_platform='linux-amd64', |
| env=_MANYLINUX_ENV, |
| default=True, |
| ), |
| Platform( |
| name='mac-x64-py3.8', |
| cross_triple='', |
| wheel_abi='cp38', |
| wheel_plat=('macosx_10_11_x86_64',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='darwin64-x86_64-cc', |
| packaged=True, |
| cipd_platform='mac-amd64', |
| env={ |
| # Necessary for some wheels to build. See for instance: |
| # https://github.com/giampaolo/psutil/issues/1832 |
| 'ARCHFLAGS': '-arch x86_64', |
| 'MACOSX_DEPLOYMENT_TARGET': '10.11' |
| }, |
| default=True, |
| ), |
| Platform( |
| name='mac-x64-py3.11', |
| cross_triple='', |
| wheel_abi='cp311', |
| wheel_plat=('macosx_10_11_x86_64', 'macosx_11_0_universal2'), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='darwin64-x86_64-cc', |
| packaged=True, |
| cipd_platform='mac-amd64', |
| env={ |
| # Necessary for some wheels to build. See for instance: |
| # https://github.com/giampaolo/psutil/issues/1832 |
| 'ARCHFLAGS': '-arch x86_64', |
| 'MACOSX_DEPLOYMENT_TARGET': '10.11' |
| }, |
| default=True, |
| ), |
| Platform( |
| name='mac-arm64-py3.8', |
| cross_triple='', |
| wheel_abi='cp38', |
| wheel_plat=('macosx_11_0_arm64',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='darwin64-arm64-cc', |
| # TODO: See whether this can be enabled now that Python 3.8.10 |
| # supports mac-arm64. |
| packaged=False, |
| cipd_platform='mac-arm64', |
| env={ |
| # Necessary for some wheels to build. See for instance: |
| # https://github.com/giampaolo/psutil/issues/1832 |
| 'ARCHFLAGS': '-arch arm64', |
| 'MACOSX_DEPLOYMENT_TARGET': '11.0' |
| }, |
| default=True, |
| ), |
| Platform( |
| name='mac-arm64-py3.11', |
| cross_triple='', |
| wheel_abi='cp311', |
| wheel_plat=('macosx_11_0_arm64', 'macosx_11_0_universal2'), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='darwin64-arm64-cc', |
| packaged=True, |
| cipd_platform='mac-arm64', |
| env={ |
| # Necessary for some wheels to build. See for instance: |
| # https://github.com/giampaolo/psutil/issues/1832 |
| 'ARCHFLAGS': '-arch arm64', |
| 'MACOSX_DEPLOYMENT_TARGET': '11.0' |
| }, |
| default=True, |
| ), |
| Platform( |
| name='windows-x86-py3.8', |
| cross_triple='', |
| wheel_abi='cp38', |
| wheel_plat=('win32',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='Cygwin-x86', |
| packaged=True, |
| cipd_platform='windows-386', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='windows-x86-py3.11', |
| cross_triple='', |
| wheel_abi='cp311', |
| wheel_plat=('win32',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='Cygwin-x86', |
| packaged=True, |
| cipd_platform='windows-386', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='windows-x64-py3.8', |
| cross_triple='', |
| wheel_abi='cp38', |
| wheel_plat=('win_amd64',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='Cygwin-x86_64', |
| packaged=True, |
| cipd_platform='windows-amd64', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='windows-x64-py3.11', |
| cross_triple='', |
| wheel_abi='cp311', |
| wheel_plat=('win_amd64',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target='Cygwin-x86_64', |
| packaged=True, |
| cipd_platform='windows-amd64', |
| env={}, |
| default=True, |
| ), |
| Platform( |
| name='universal', |
| cross_triple='', |
| wheel_abi='none', |
| wheel_plat=('any',), |
| dockcross_base=None, |
| dockcross_tag=None, |
| dockerbuild_image=None, |
| openssl_target=None, |
| packaged=True, |
| cipd_platform=None, |
| env={}, |
| default=True, |
| ), |
| ) |
| } |
| |
| |
| # Detect whether we're on an ARM64 Mac running emulated x86_64 Python. |
| # In this situation, we still consider ARM64 the native platform. |
| def _CheckTranslated(): |
| if sys.platform != 'darwin': |
| return False |
| |
| try: |
| output = subprocess.check_output( |
| ["/usr/sbin/sysctl", "-n", "sysctl.proc_translated"], text=True, |
| stderr=subprocess.STDOUT) |
| return output[0] == '1' |
| except subprocess.CalledProcessError: |
| # The call will fail on x86_64 Macs. |
| return False |
| |
| |
| NAMES = sorted(ALL.keys()) |
| PACKAGED = [p for p in ALL.values() if p.packaged] |
| ALL_LINUX = [p.name for p in ALL.values() if 'linux' in p.name] |
| UNIVERSAL = [p.name for p in ALL.values() if 'universal' in p.name] |
| ALL_PY311 = [p.name for p in ALL.values() if p.name.endswith('-py3.11')] |
| ALL_MAC_X64 = [p.name for p in ALL.values() if p.name.startswith('mac-x64-')] |
| ALL_MAC_ARM64 = [ |
| p.name for p in ALL.values() if p.name.startswith('mac-arm64-') |
| ] |
| ALL_MAC = [p.name for p in ALL.values() if p.name.startswith('mac-')] |
| _IS_TRANSLATED = _CheckTranslated() |
| |
| |
| def NativeMachine(): |
| machine = platform.machine() |
| if sys.platform == 'darwin' and machine == 'x86_64' and _IS_TRANSLATED: |
| machine = 'arm64' |
| return machine |
| |
| |
| def NativePlatforms(): |
| # Every supported OS can build universal wheels. |
| plats = [ALL[u] for u in UNIVERSAL] |
| |
| # Identify our native platforms. |
| if sys.platform == 'darwin': |
| mac_plats = {'x86_64': ALL_MAC_X64, 'arm64': ALL_MAC_ARM64} |
| return plats + [ALL[p] for p in mac_plats[NativeMachine()]] |
| elif sys.platform == 'win32': |
| return plats + [ |
| ALL['windows-x86-py3.8'], ALL['windows-x86-py3.11'], |
| ALL['windows-x64-py3.8'], ALL['windows-x64-py3.11'] |
| ] |
| elif sys.platform.startswith('linux'): |
| # Linux platforms are built with docker, so Linux doesn't support any |
| # non-universal platforms natively. |
| return plats |
| raise ValueError('Cannot identify native image for %r-%r.' % |
| (sys.platform, NativeMachine())) |