Skip to content

Commit 656233d

Browse files
committed
Small improvements. Pre-filter eligible versions and ensure actual correct version order.
1 parent b79143c commit 656233d

File tree

1 file changed

+40
-24
lines changed

1 file changed

+40
-24
lines changed

toolchain/internal/llvm_distributions.bzl

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -953,6 +953,10 @@ def _find_llvm_basename_list(llvm_version, all_llvm_distributions, host_info):
953953
return []
954954

955955
def _find_llvm_basename_or_error(llvm_version, all_llvm_distributions, host_info):
956+
all_llvm_distributions = _filter_llvm_distributions(
957+
llvm_version = llvm_version,
958+
all_llvm_distributions = all_llvm_distributions,
959+
)
956960
basenames = _find_llvm_basename_list(llvm_version, all_llvm_distributions, host_info)
957961
if len(basenames) > 1:
958962
return None, "ERROR: Multiple configurations found for version {llvm_version} on {os}/{dist_name}/{dist_version} with arch {arch}: [{basenames}].".format(
@@ -979,29 +983,32 @@ def _find_llvm_basename_or_error(llvm_version, all_llvm_distributions, host_info
979983

980984
return basenames[0], None
981985

982-
def _parse_version_requirements(version_requirements):
983-
if version_requirements in ["latest", "first"]:
986+
def _parse_version_or_requirements(version_or_requirements):
987+
if version_or_requirements in ["latest", "first"]:
984988
return None
985989
for prefix in ["latest:", "first:"]:
986-
if version_requirements.startswith(prefix):
987-
return versions.parse_requirements(version_requirements.removeprefix(prefix))
988-
fail("ERROR: Invalid version requirements: '{version_requirements}'.".format(
989-
version_requirements = version_requirements,
990+
if version_or_requirements.startswith(prefix):
991+
return versions.parse_requirements(version_or_requirements.removeprefix(prefix))
992+
fail("ERROR: Invalid version requirements: '{version_or_requirements}'.".format(
993+
version_or_requirements = version_or_requirements,
990994
))
991995

992-
def _get_llvm_versions(*, version_requirements, all_llvm_distributions):
993-
llvm_versions = {}
996+
def _get_version_from_distribution(distribution):
997+
# We assume here that the `distribution` is a basename of the form `LLVM-<version>-...` or
998+
# `clang+llvm-<version>-...`.
999+
return distribution.split("-")[1]
1000+
1001+
def _get_llvm_versions(*, version_or_requirements, all_llvm_distributions):
1002+
llvm_version_dict = {}
9941003
for distribution in all_llvm_distributions.keys():
995-
version = distribution.split("-")[1]
996-
llvm_versions[version] = None
997-
if version_requirements.startswith("latest"):
998-
return reversed(llvm_versions.keys())
999-
else:
1000-
return llvm_versions.keys()
1004+
version = _get_version_from_distribution(distribution)
1005+
llvm_version_dict[_parse_version(version)] = version
10011006

1002-
def _required_llvm_release_name(*, version_requirements, all_llvm_distributions, host_info):
1003-
llvm_versions = _get_llvm_versions(version_requirements = version_requirements, all_llvm_distributions = all_llvm_distributions)
1004-
requirements = _parse_version_requirements(version_requirements)
1007+
return [v for k, v in sorted(llvm_version_dict.items(), reverse = version_or_requirements.startswith("latest"))]
1008+
1009+
def _required_llvm_release_name(*, version_or_requirements, all_llvm_distributions, host_info):
1010+
llvm_versions = _get_llvm_versions(version_or_requirements = version_or_requirements, all_llvm_distributions = all_llvm_distributions)
1011+
requirements = _parse_version_or_requirements(version_or_requirements)
10051012
for llvm_version in llvm_versions:
10061013
if requirements and not versions.check_all_requirements(llvm_version, requirements):
10071014
continue
@@ -1013,19 +1020,28 @@ def _required_llvm_release_name(*, version_requirements, all_llvm_distributions,
10131020
def required_llvm_release_name_rctx(rctx, llvm_version):
10141021
all_llvm_distributions = _get_all_llvm_distributions(rctx)
10151022
return _required_llvm_release_name(
1016-
version_requirements = llvm_version,
1023+
version_or_requirements = llvm_version,
10171024
all_llvm_distributions = all_llvm_distributions,
10181025
host_info = host_info(rctx),
10191026
)
10201027

1021-
def is_requirement(str):
1022-
for prefix in ["first", "latest"]:
1023-
if str == prefix or str.startswith(prefix + ":"):
1028+
def is_requirement(version_or_requirement):
1029+
"""Return whether `version_or_requirement` is likely a requirement (True) or should be a version."""
1030+
for prefix in ["first:", "latest:"]:
1031+
if version_or_requirement.startswith(prefix) or version_or_requirement == prefix[:-1]:
10241032
return True
10251033
return False
10261034

1035+
def _filter_llvm_distributions(*, llvm_version, all_llvm_distributions):
1036+
"""Return (distribution: sha) entries from `all_llvm_distributions` that match `llvm_version`."""
1037+
result = {}
1038+
for k, v in all_llvm_distributions.items():
1039+
if _get_version_from_distribution(k) == llvm_version:
1040+
result[k] = v
1041+
return result
1042+
10271043
def _distribution_urls(rctx):
1028-
"""Return LLVM `urls`, `shha256` and `strip_prefix` for the given context."""
1044+
"""Return LLVM `urls`, `sha256` and `strip_prefix` for the given context."""
10291045
llvm_version = _get_llvm_version(rctx)
10301046
all_llvm_distributions = _get_all_llvm_distributions(rctx)
10311047
_, sha256, strip_prefix, _ = _key_attrs(rctx)
@@ -1034,7 +1050,7 @@ def _distribution_urls(rctx):
10341050
rctx_host_info = host_info(rctx)
10351051
if is_requirement(llvm_version):
10361052
llvm_version, basename, error = _required_llvm_release_name(
1037-
version_requirements = _parse_version_requirements(llvm_version),
1053+
version_or_requirements = _parse_version_or_requirements(llvm_version),
10381054
all_llvm_distributions = all_llvm_distributions,
10391055
host_info = rctx_host_info,
10401056
)
@@ -1323,7 +1339,7 @@ def _requirements_test_writer_impl(ctx):
13231339
dist = dist,
13241340
)
13251341
llvm_version, basename, error = _required_llvm_release_name(
1326-
version_requirements = requirement,
1342+
version_or_requirements = requirement,
13271343
all_llvm_distributions = all_llvm_distributions,
13281344
host_info = host_info,
13291345
)

0 commit comments

Comments
 (0)