# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. from __future__ import absolute_import, print_function, unicode_literals import re from .attributes import keymatch # platform family is extracted from build platform by taking the alphabetic prefix # and then translating win -> windows _platform_re = re.compile(r"^[a-z]*") _renames = {"win": "windows"} _archive_formats = { "linux": ".tar.bz2", "macosx": ".tar.gz", "windows": ".zip", } _executable_extension = { "linux": "", "macosx": "", "windows": ".exe", } _architectures = { r"linux\b.*": "x86", r"linux64\b.*": "x86_64", r"macosx64\b.*": "macos-x86_64-aarch64", r"win32\b.*": "x86", r"win64\b(?!-aarch64).*": "x86_64", r"win64-aarch64\b.*": "aarch64", } def platform_family(build_platform): """Given a build platform, return the platform family (linux, macosx, etc.)""" family = _platform_re.match(build_platform).group(0) return _renames.get(family, family) def archive_format(build_platform): """Given a build platform, return the archive format used on the platform.""" return _archive_formats[platform_family(build_platform)] def executable_extension(build_platform): """Given a build platform, return the executable extension used on the platform.""" return _executable_extension[platform_family(build_platform)] def architecture(build_platform): matches = keymatch(_architectures, build_platform) if len(matches) == 1: return matches[0] raise Exception( "Could not determine architecture of platform `{}`.".format(build_platform) )