@@ -990,6 +990,10 @@ def _find_llvm_basename_list(llvm_version, all_llvm_distributions, host_info):
990
990
return []
991
991
992
992
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
+ )
993
997
basenames = _find_llvm_basename_list (llvm_version , all_llvm_distributions , host_info )
994
998
if len (basenames ) > 1 :
995
999
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
1016
1020
1017
1021
return basenames [0 ], None
1018
1022
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" ]:
1021
1025
return None
1022
1026
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 ,
1027
1031
))
1028
1032
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 = {}
1031
1040
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
1038
1043
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 )
1042
1049
for llvm_version in llvm_versions :
1043
1050
if requirements and not versions .check_all_requirements (llvm_version , requirements ):
1044
1051
continue
@@ -1050,19 +1057,28 @@ def _required_llvm_release_name(*, version_requirements, all_llvm_distributions,
1050
1057
def required_llvm_release_name_rctx (rctx , llvm_version ):
1051
1058
all_llvm_distributions = _get_all_llvm_distributions (rctx )
1052
1059
return _required_llvm_release_name (
1053
- version_requirements = llvm_version ,
1060
+ version_or_requirements = llvm_version ,
1054
1061
all_llvm_distributions = all_llvm_distributions ,
1055
1062
host_info = host_info (rctx ),
1056
1063
)
1057
1064
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 ]:
1061
1069
return True
1062
1070
return False
1063
1071
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
+
1064
1080
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."""
1066
1082
llvm_version = _get_llvm_version (rctx )
1067
1083
all_llvm_distributions = _get_all_llvm_distributions (rctx )
1068
1084
_ , sha256 , strip_prefix , _ = _key_attrs (rctx )
@@ -1071,7 +1087,7 @@ def _distribution_urls(rctx):
1071
1087
rctx_host_info = host_info (rctx )
1072
1088
if is_requirement (llvm_version ):
1073
1089
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 ),
1075
1091
all_llvm_distributions = all_llvm_distributions ,
1076
1092
host_info = rctx_host_info ,
1077
1093
)
@@ -1365,7 +1381,7 @@ def _requirements_test_writer_impl(ctx):
1365
1381
dist = dist ,
1366
1382
)
1367
1383
llvm_version , basename , error = _required_llvm_release_name (
1368
- version_requirements = requirement ,
1384
+ version_or_requirements = requirement ,
1369
1385
all_llvm_distributions = all_llvm_distributions ,
1370
1386
host_info = host_info ,
1371
1387
)
0 commit comments