@@ -953,6 +953,10 @@ def _find_llvm_basename_list(llvm_version, all_llvm_distributions, host_info):
953
953
return []
954
954
955
955
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
+ )
956
960
basenames = _find_llvm_basename_list (llvm_version , all_llvm_distributions , host_info )
957
961
if len (basenames ) > 1 :
958
962
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
979
983
980
984
return basenames [0 ], None
981
985
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" ]:
984
988
return None
985
989
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 ,
990
994
))
991
995
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 = {}
994
1003
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
1001
1006
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 )
1005
1012
for llvm_version in llvm_versions :
1006
1013
if requirements and not versions .check_all_requirements (llvm_version , requirements ):
1007
1014
continue
@@ -1013,19 +1020,28 @@ def _required_llvm_release_name(*, version_requirements, all_llvm_distributions,
1013
1020
def required_llvm_release_name_rctx (rctx , llvm_version ):
1014
1021
all_llvm_distributions = _get_all_llvm_distributions (rctx )
1015
1022
return _required_llvm_release_name (
1016
- version_requirements = llvm_version ,
1023
+ version_or_requirements = llvm_version ,
1017
1024
all_llvm_distributions = all_llvm_distributions ,
1018
1025
host_info = host_info (rctx ),
1019
1026
)
1020
1027
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 ]:
1024
1032
return True
1025
1033
return False
1026
1034
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
+
1027
1043
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."""
1029
1045
llvm_version = _get_llvm_version (rctx )
1030
1046
all_llvm_distributions = _get_all_llvm_distributions (rctx )
1031
1047
_ , sha256 , strip_prefix , _ = _key_attrs (rctx )
@@ -1034,7 +1050,7 @@ def _distribution_urls(rctx):
1034
1050
rctx_host_info = host_info (rctx )
1035
1051
if is_requirement (llvm_version ):
1036
1052
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 ),
1038
1054
all_llvm_distributions = all_llvm_distributions ,
1039
1055
host_info = rctx_host_info ,
1040
1056
)
@@ -1323,7 +1339,7 @@ def _requirements_test_writer_impl(ctx):
1323
1339
dist = dist ,
1324
1340
)
1325
1341
llvm_version , basename , error = _required_llvm_release_name (
1326
- version_requirements = requirement ,
1342
+ version_or_requirements = requirement ,
1327
1343
all_llvm_distributions = all_llvm_distributions ,
1328
1344
host_info = host_info ,
1329
1345
)
0 commit comments