@@ -709,14 +709,16 @@ def download_llvm(rctx):
709
709
updated_attrs ["sha256" ].update ([(key , res .sha256 )])
710
710
return updated_attrs
711
711
712
- def _urls (rctx ):
713
- (key , urls ) = exec_os_arch_dict_value (rctx , "urls" , debug = False )
714
- if not urls :
715
- print ("LLVM archive URLs missing and no default fallback provided; will try 'distribution' attribute" ) # buildifier: disable=print
716
-
712
+ def _key_attrs (rctx ):
713
+ key , urls = exec_os_arch_dict_value (rctx , "urls" , debug = False )
717
714
sha256 = rctx .attr .sha256 .get (key , default = "" )
718
715
strip_prefix = rctx .attr .strip_prefix .get (key , default = "" )
716
+ return urls , sha256 , strip_prefix , key
719
717
718
+ def _urls (rctx ):
719
+ urls , sha256 , strip_prefix , key = _key_attrs (rctx )
720
+ if not urls :
721
+ print ("LLVM archive URLs missing and no default fallback provided; will try 'distribution' attribute" ) # buildifier: disable=print
720
722
return urls , sha256 , strip_prefix , key
721
723
722
724
def _get_llvm_version (rctx ):
@@ -736,6 +738,11 @@ def _get_llvm_version(rctx):
736
738
)
737
739
return llvm_version
738
740
741
+ def _get_all_llvm_distributions (rctx ):
742
+ if rctx .attr .extra_llvm_distributions :
743
+ return _llvm_distributions | rctx .attr .extra_llvm_distributions
744
+ return _llvm_distributions
745
+
739
746
_UBUNTU_NAMES = [
740
747
"arch" ,
741
748
"linuxmint" ,
@@ -827,16 +834,16 @@ def _dist_to_os_names(dist, default_os_names = []):
827
834
] + _UBUNTU_VERSIONS
828
835
return default_os_names
829
836
830
- def _find_llvm_basenames_by_stem (prefixes , * , is_prefix = False , return_first_match = False ):
837
+ def _find_llvm_basenames_by_stem (prefixes , * , all_llvm_distributions , is_prefix = False , return_first_match = False ):
831
838
basenames = []
832
839
for prefix in prefixes :
833
840
for suffix in [".tar.gz" , ".tar.xz" ]:
834
841
basename = prefix + suffix
835
- if basename in _llvm_distributions :
842
+ if basename in all_llvm_distributions :
836
843
return [basename ]
837
844
if not is_prefix :
838
845
continue
839
- for llvm_dist in _llvm_distributions :
846
+ for llvm_dist in all_llvm_distributions :
840
847
if not llvm_dist .startswith (prefix ):
841
848
continue
842
849
for suffix in [".tar.gz" , ".tar.xz" ]:
@@ -846,8 +853,8 @@ def _find_llvm_basenames_by_stem(prefixes, *, is_prefix = False, return_first_ma
846
853
basenames .append (llvm_dist )
847
854
return basenames
848
855
849
- def _find_llvm_basename_list (llvm_version , host_info ):
850
- """Lookup (llvm_version, arch, os ) in the list of basenames in `_llvm_distributions .`"""
856
+ def _find_llvm_basename_list (llvm_version , all_llvm_distributions , host_info ):
857
+ """Lookup (llvm_version, host_info ) in the list of basenames in `all_llvm_distributions .`"""
851
858
arch = host_info .arch
852
859
os = host_info .os
853
860
dist = host_info .dist
@@ -866,7 +873,7 @@ def _find_llvm_basename_list(llvm_version, host_info):
866
873
"windows" : "Windows" ,
867
874
}.get (os , os ),
868
875
),
869
- ])
876
+ ], all_llvm_distributions = all_llvm_distributions )
870
877
if basenames :
871
878
return basenames
872
879
@@ -881,15 +888,15 @@ def _find_llvm_basename_list(llvm_version, host_info):
881
888
os = select_os ,
882
889
)
883
890
for select_os in ["apple-darwin" , "apple-macos" , "darwin-apple" ]
884
- ], is_prefix = True )
891
+ ], all_llvm_distributions = all_llvm_distributions , is_prefix = True )
885
892
elif os == "windows" :
886
893
return _find_llvm_basenames_by_stem ([
887
894
"clang+llvm-{llvm_version}-{arch}-{os}" .format (
888
895
llvm_version = llvm_version ,
889
896
arch = arch ,
890
897
os = "pc-windows-msvc" ,
891
898
),
892
- ])
899
+ ], all_llvm_distributions = all_llvm_distributions )
893
900
elif dist .name == "raspbian" :
894
901
return _find_llvm_basenames_by_stem ([
895
902
"clang+llvm-{llvm_version}-{arch}-{os}" .format (
@@ -898,7 +905,7 @@ def _find_llvm_basename_list(llvm_version, host_info):
898
905
os = select_os ,
899
906
)
900
907
for select_os in _dist_to_os_names (dist )
901
- ])
908
+ ], all_llvm_distributions = all_llvm_distributions )
902
909
elif os == "linux" :
903
910
if arch in ["aarch64" , "armv7a" , "mips" , "mipsel" , "sparc64" , "sparcv9" ]:
904
911
arch_alias_list = {
@@ -914,7 +921,7 @@ def _find_llvm_basename_list(llvm_version, host_info):
914
921
)
915
922
for arch_alias in arch_alias_list
916
923
for os_name in ["linux-gnu" , "unknown-linux-gnu" ] + _dist_to_os_names (dist )
917
- ])
924
+ ], all_llvm_distributions = all_llvm_distributions )
918
925
919
926
arch_alias_list = {
920
927
"x86_32" : ["x86_32" , "i386" ],
@@ -932,7 +939,7 @@ def _find_llvm_basename_list(llvm_version, host_info):
932
939
dist_name = dist_name ,
933
940
dist_version = dist .version ,
934
941
),
935
- ])
942
+ ], all_llvm_distributions = all_llvm_distributions )
936
943
if basenames :
937
944
return basenames
938
945
if dist .name not in ["freebsd" ]:
@@ -941,11 +948,11 @@ def _find_llvm_basename_list(llvm_version, host_info):
941
948
arch = arch_alias ,
942
949
dist_name = dist_name ,
943
950
))
944
- return _find_llvm_basenames_by_stem (prefixes , is_prefix = True , return_first_match = True )
951
+ return _find_llvm_basenames_by_stem (prefixes , all_llvm_distributions = all_llvm_distributions , is_prefix = True , return_first_match = True )
945
952
return []
946
953
947
- def _find_llvm_basename_or_error (llvm_version , host_info ):
948
- basenames = _find_llvm_basename_list (llvm_version , host_info )
954
+ def _find_llvm_basename_or_error (llvm_version , all_llvm_distributions , host_info ):
955
+ basenames = _find_llvm_basename_list (llvm_version , all_llvm_distributions , host_info )
949
956
if len (basenames ) > 1 :
950
957
return None , "ERROR: Multiple configurations found for version {llvm_version} on {os}/{dist_name}/{dist_version} with arch {arch}: [{basenames}]." .format (
951
958
llvm_version = llvm_version ,
@@ -966,21 +973,36 @@ def _find_llvm_basename_or_error(llvm_version, host_info):
966
973
967
974
# Use the following for debugging:
968
975
# print("Found LLVM: " + basenames[0]) # buildifier: disable=print
976
+ if basenames [0 ] not in all_llvm_distributions :
977
+ return None , "ERROR: Unknown LLVM release: %s\n Please ensure file name is correct." % basenames [0 ]
978
+
969
979
return basenames [0 ], None
970
980
971
981
def _distribution_urls (rctx ):
972
982
"""Return LLVM `urls`, `shha256` and `strip_prefix` for the given context."""
973
983
llvm_version = _get_llvm_version (rctx )
984
+ all_llvm_distributions = _get_all_llvm_distributions (rctx )
985
+ _ , sha256 , strip_prefix , _ = _key_attrs (rctx )
974
986
975
987
if rctx .attr .distribution == "auto" :
976
- basename , error = _find_llvm_basename_or_error (llvm_version , host_info (rctx ))
988
+ basename , error = _find_llvm_basename_or_error (llvm_version , all_llvm_distributions , host_info (rctx ))
977
989
if error :
978
990
fail (error )
991
+ if sha256 and sha256 != all_llvm_distributions [basename ]:
992
+ fail ("ERROR: Attribute sha256 provided a different SHA than the stored one." )
993
+ sha256 = all_llvm_distributions [basename ]
979
994
else :
980
995
basename = rctx .attr .distribution
996
+ if sha256 :
997
+ if basename in all_llvm_distributions and sha256 != all_llvm_distributions [basename ]:
998
+ fail ("ERROR: Attribute sha256 provided a different SHA than the stored one." )
999
+ elif basename in all_llvm_distributions :
1000
+ sha256 = all_llvm_distributions [basename ]
1001
+ else :
1002
+ fail ("ERROR: Unknown LLVM release: %s\n Please ensure file name is correct." % basename )
981
1003
982
- if basename not in _llvm_distributions :
983
- fail ( "ERROR: Unknown LLVM release: %s \n Please ensure file name is correct." % basename )
1004
+ if basename . startswith ( "http" ) :
1005
+ return [ basename ], sha256 , strip_prefix
984
1006
985
1007
urls = []
986
1008
url_suffix = "{0}/{1}" .format (llvm_version , basename ).replace ("+" , "%2B" )
@@ -992,8 +1014,6 @@ def _distribution_urls(rctx):
992
1014
url_base = _llvm_distributions_base_url .get (llvm_version , _llvm_distributions_base_url_default )
993
1015
urls .append (url_base + url_suffix )
994
1016
995
- sha256 = _llvm_distributions [basename ]
996
-
997
1017
strip_prefix = ""
998
1018
for suffix in [".exe" , ".tar.gz" , ".tar.xz" , ".tar.zst" ]:
999
1019
if basename .endswith (suffix ):
@@ -1023,6 +1043,7 @@ def _write_distributions_impl(ctx):
1023
1043
verify that predicted distributions have been configured. Otherwise the
1024
1044
algorithm could not know the hash value.
1025
1045
"""
1046
+ all_llvm_distributions = _llvm_distributions
1026
1047
arch_list = [
1027
1048
"aarch64" ,
1028
1049
"armv7a" ,
@@ -1087,7 +1108,7 @@ def _write_distributions_impl(ctx):
1087
1108
MIN_VERSION = _parse_version ("6.0.0" )
1088
1109
MAX_VERSION = _parse_version ("20.1.3" )
1089
1110
version_list = []
1090
- for name in _llvm_distributions .keys ():
1111
+ for name in all_llvm_distributions .keys ():
1091
1112
for prefix in ["LLVM-" , "clang+llvm-" ]:
1092
1113
if name .startswith (prefix ):
1093
1114
version = _parse_version (name .split ("-" , 2 )[1 ])
@@ -1110,7 +1131,7 @@ def _write_distributions_impl(ctx):
1110
1131
# So at the end all version that were not found remain, hence the name.
1111
1132
not_found = {
1112
1133
k : v
1113
- for k , v in _llvm_distributions .items ()
1134
+ for k , v in all_llvm_distributions .items ()
1114
1135
if _parse_version (k .split ("-" )[1 ]) >= MIN_VERSION
1115
1136
}
1116
1137
@@ -1132,10 +1153,11 @@ def _write_distributions_impl(ctx):
1132
1153
os = os ,
1133
1154
dist = dist ,
1134
1155
)
1135
- basenames = _find_llvm_basename_list (_version_string (version ), host_info )
1156
+ basenames = _find_llvm_basename_list (_version_string (version ), all_llvm_distributions , host_info )
1136
1157
if version <= MAX_VERSION :
1137
1158
predicted , error = _find_llvm_basename_or_error (
1138
1159
_version_string (version ),
1160
+ all_llvm_distributions ,
1139
1161
host_info ,
1140
1162
)
1141
1163
if error :
@@ -1145,7 +1167,7 @@ def _write_distributions_impl(ctx):
1145
1167
else :
1146
1168
if predicted .endswith (".exe" ):
1147
1169
error = "ERROR: Windows .exe is not supported: " + predicted
1148
- elif predicted not in _llvm_distributions :
1170
+ elif predicted not in all_llvm_distributions :
1149
1171
error = "ERROR: Unavailable prediction: " + predicted
1150
1172
elif len (basenames ) == 0 :
1151
1173
error = "ERROR: No version selected"
@@ -1178,7 +1200,7 @@ def _write_distributions_impl(ctx):
1178
1200
dupes .extend ([" : " + basename for basename in basenames ])
1179
1201
continue
1180
1202
basename = basenames [0 ]
1181
- if basename in _llvm_distributions :
1203
+ if basename in all_llvm_distributions :
1182
1204
if basename in not_found :
1183
1205
not_found .pop (basename )
1184
1206
else :
0 commit comments