blob: 2c63efe26fa85523854ac50686970175bd0aaab1 [file] [log] [blame]
# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
A starlark implementation of the wheel platform tag parsing to get the target platform.
"""
# The order of the dictionaries is to keep definitions with their aliases next to each
# other
_CPU_ALIASES = {
"x86_32": "x86_32",
"i386": "x86_32",
"i686": "x86_32",
"x86": "x86_32",
"x86_64": "x86_64",
"amd64": "x86_64",
"aarch64": "aarch64",
"arm64": "aarch64",
"ppc": "ppc",
"ppc64le": "ppc",
"s390x": "s390x",
} # buildifier: disable=unsorted-dict-items
_OS_PREFIXES = {
"linux": "linux",
"manylinux": "linux",
"musllinux": "linux",
"macos": "osx",
"win": "windows",
} # buildifier: disable=unsorted-dict-items
def whl_target_platforms(tag):
"""Parse the wheel platform tag and return (os, cpu) tuples.
Args:
tag (str): The platform_tag part of the wheel name. See
./parse_whl_name.bzl for more details.
Returns:
A list of structs, with attributes:
* os: str, one of the _OS_PREFIXES values
* cpu: str, one of the _CPU_PREFIXES values
"""
cpus = _cpu_from_tag(tag)
for prefix, os in _OS_PREFIXES.items():
if tag.startswith(prefix):
return [
struct(os = os, cpu = cpu)
for cpu in cpus
]
fail("unknown tag os: {}".format(tag))
def _cpu_from_tag(tag):
candidate = [
cpu
for input, cpu in _CPU_ALIASES.items()
if tag.endswith(input)
]
if candidate:
return candidate
if tag == "win32":
return ["x86_32"]
elif tag.endswith("universal2") and tag.startswith("macosx"):
return ["x86_64", "aarch64"]
else:
fail("Unrecognized tag: '{}': cannot determine CPU".format(tag))