Skip to content

Commit 46f5608

Browse files
committed
Small improvements. Pre-filter eligible versions and ensure actual correct version order.
1 parent f7239c2 commit 46f5608

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
@@ -990,6 +990,10 @@ def _find_llvm_basename_list(llvm_version, all_llvm_distributions, host_info):
990990
return []
991991

992992
def _find_llvm_basename_or_error(llvm_version, all_llvm_distributions, host_info):
993+
all_llvm_distributions = _filter_llvm_distributions(
994+
llvm_version = llvm_version,
995+
all_llvm_distributions = all_llvm_distributions,
996+
)
993997
basenames = _find_llvm_basename_list(llvm_version, all_llvm_distributions, host_info)
994998
if len(basenames) > 1:
995999
return None, "ERROR: Multiple configurations found for version {llvm_version} on {os}/{dist_name}/{dist_version} with arch {arch}: [{basenames}].".format(
@@ -1016,29 +1020,32 @@ def _find_llvm_basename_or_error(llvm_version, all_llvm_distributions, host_info
10161020

10171021
return basenames[0], None
10181022

1019-
def _parse_version_requirements(version_requirements):
1020-
if version_requirements in ["latest", "first"]:
1023+
def _parse_version_or_requirements(version_or_requirements):
1024+
if version_or_requirements in ["latest", "first"]:
10211025
return None
10221026
for prefix in ["latest:", "first:"]:
1023-
if version_requirements.startswith(prefix):
1024-
return versions.parse_requirements(version_requirements.removeprefix(prefix))
1025-
fail("ERROR: Invalid version requirements: '{version_requirements}'.".format(
1026-
version_requirements = version_requirements,
1027+
if version_or_requirements.startswith(prefix):
1028+
return versions.parse_requirements(version_or_requirements.removeprefix(prefix))
1029+
fail("ERROR: Invalid version requirements: '{version_or_requirements}'.".format(
1030+
version_or_requirements = version_or_requirements,
10271031
))
10281032

1029-
def _get_llvm_versions(*, version_requirements, all_llvm_distributions):
1030-
llvm_versions = {}
1033+
def _get_version_from_distribution(distribution):
1034+
# We assume here that the `distribution` is a basename of the form `LLVM-<version>-...` or
1035+
# `clang+llvm-<version>-...`.
1036+
return distribution.split("-")[1]
1037+
1038+
def _get_llvm_versions(*, version_or_requirements, all_llvm_distributions):
1039+
llvm_version_dict = {}
10311040
for distribution in all_llvm_distributions.keys():
1032-
version = distribution.split("-")[1]
1033-
llvm_versions[version] = None
1034-
if version_requirements.startswith("latest"):
1035-
return reversed(llvm_versions.keys())
1036-
else:
1037-
return llvm_versions.keys()
1041+
version = _get_version_from_distribution(distribution)
1042+
llvm_version_dict[_parse_version(version)] = version
10381043

1039-
def _required_llvm_release_name(*, version_requirements, all_llvm_distributions, host_info):
1040-
llvm_versions = _get_llvm_versions(version_requirements = version_requirements, all_llvm_distributions = all_llvm_distributions)
1041-
requirements = _parse_version_requirements(version_requirements)
1044+
return [v for k, v in sorted(llvm_version_dict.items(), reverse = version_or_requirements.startswith("latest"))]
1045+
1046+
def _required_llvm_release_name(*, version_or_requirements, all_llvm_distributions, host_info):
1047+
llvm_versions = _get_llvm_versions(version_or_requirements = version_or_requirements, all_llvm_distributions = all_llvm_distributions)
1048+
requirements = _parse_version_or_requirements(version_or_requirements)
10421049
for llvm_version in llvm_versions:
10431050
if requirements and not versions.check_all_requirements(llvm_version, requirements):
10441051
continue
@@ -1050,19 +1057,28 @@ def _required_llvm_release_name(*, version_requirements, all_llvm_distributions,
10501057
def required_llvm_release_name_rctx(rctx, llvm_version):
10511058
all_llvm_distributions = _get_all_llvm_distributions(rctx)
10521059
return _required_llvm_release_name(
1053-
version_requirements = llvm_version,
1060+
version_or_requirements = llvm_version,
10541061
all_llvm_distributions = all_llvm_distributions,
10551062
host_info = host_info(rctx),
10561063
)
10571064

1058-
def is_requirement(str):
1059-
for prefix in ["first", "latest"]:
1060-
if str == prefix or str.startswith(prefix + ":"):
1065+
def is_requirement(version_or_requirement):
1066+
"""Return whether `version_or_requirement` is likely a requirement (True) or should be a version."""
1067+
for prefix in ["first:", "latest:"]:
1068+
if version_or_requirement.startswith(prefix) or version_or_requirement == prefix[:-1]:
10611069
return True
10621070
return False
10631071

1072+
def _filter_llvm_distributions(*, llvm_version, all_llvm_distributions):
1073+
"""Return (distribution: sha) entries from `all_llvm_distributions` that match `llvm_version`."""
1074+
result = {}
1075+
for k, v in all_llvm_distributions.items():
1076+
if _get_version_from_distribution(k) == llvm_version:
1077+
result[k] = v
1078+
return result
1079+
10641080
def _distribution_urls(rctx):
1065-
"""Return LLVM `urls`, `shha256` and `strip_prefix` for the given context."""
1081+
"""Return LLVM `urls`, `sha256` and `strip_prefix` for the given context."""
10661082
llvm_version = _get_llvm_version(rctx)
10671083
all_llvm_distributions = _get_all_llvm_distributions(rctx)
10681084
_, sha256, strip_prefix, _ = _key_attrs(rctx)
@@ -1071,7 +1087,7 @@ def _distribution_urls(rctx):
10711087
rctx_host_info = host_info(rctx)
10721088
if is_requirement(llvm_version):
10731089
llvm_version, basename, error = _required_llvm_release_name(
1074-
version_requirements = _parse_version_requirements(llvm_version),
1090+
version_or_requirements = _parse_version_or_requirements(llvm_version),
10751091
all_llvm_distributions = all_llvm_distributions,
10761092
host_info = rctx_host_info,
10771093
)
@@ -1365,7 +1381,7 @@ def _requirements_test_writer_impl(ctx):
13651381
dist = dist,
13661382
)
13671383
llvm_version, basename, error = _required_llvm_release_name(
1368-
version_requirements = requirement,
1384+
version_or_requirements = requirement,
13691385
all_llvm_distributions = all_llvm_distributions,
13701386
host_info = host_info,
13711387
)

0 commit comments

Comments
 (0)