@@ -11,6 +11,7 @@ load("//rs/private:downloader.bzl", "download_metadata_for_git_crates", "downloa
1111load ("//rs/private:git_repository.bzl" , "git_repository" )
1212load ("//rs/private:repository_utils.bzl" , "render_select" )
1313load ("//rs/private:resolver.bzl" , "resolve" )
14+ load ("//rs/private:select_utils.bzl" , "compute_select" )
1415load ("//rs/private:semver.bzl" , "select_matching_version" )
1516load ("//rs/private:toml2json.bzl" , "run_toml2json" )
1617
@@ -31,6 +32,31 @@ def _platform(triple, use_experimental_platforms):
3132def _select (items ):
3233 return {k : sorted (v ) for k , v in items .items ()}
3334
35+ def _shared_and_per_platform (platform_items , use_experimental_platforms ):
36+ if not platform_items :
37+ return [], {}
38+
39+ by_platform = {}
40+ for triple , items in platform_items .items ():
41+ platform = _platform (triple , use_experimental_platforms )
42+ existing = by_platform .get (platform )
43+ if existing == None :
44+ by_platform [platform ] = set (items )
45+ else :
46+ existing .update (items )
47+
48+ deps , per_platform = compute_select ([], by_platform )
49+ return sorted (deps ), per_platform
50+
51+ def _render_string_list (items ):
52+ return ",\n " .join (['"%s"' % item for item in sorted (items )])
53+
54+ def _render_string_list_dict (items_by_key ):
55+ rendered = []
56+ for key , items in sorted (items_by_key .items ()):
57+ rendered .append ('"%s": [%s]' % (key , ", " .join (['"%s"' % item for item in sorted (items )])))
58+ return ",\n " .join (rendered )
59+
3460def _cfg_match_info_for_target (target , platform_cfg_attrs , cfg_match_cache ):
3561 match_info = cfg_match_cache .get (target )
3662 if match_info :
@@ -845,10 +871,20 @@ filegroup(
845871 ),
846872 )
847873
874+ resolved_platforms = []
875+ for triple in platform_triples :
876+ platform = _platform (triple , use_experimental_platforms )
877+ if platform not in resolved_platforms :
878+ resolved_platforms .append (platform )
879+
848880 defs_bzl_contents = \
849881 """load(":data.bzl", "DEP_DATA")
850882load("@rules_rs//rs/private:all_crate_deps.bzl", _all_crate_deps = "all_crate_deps")
851883
884+ _PLATFORMS = [
885+ {platforms}
886+ ]
887+
852888def aliases(package_name = None):
853889 dep_data = DEP_DATA.get(package_name or native.package_name())
854890 if not dep_data:
@@ -869,6 +905,7 @@ def all_crate_deps(
869905
870906 return _all_crate_deps(
871907 dep_data,
908+ platforms = _PLATFORMS,
872909 normal = normal,
873910 normal_dev = normal_dev,
874911 build = build,
@@ -880,7 +917,8 @@ RESOLVED_PLATFORMS = select({{
880917 "//conditions:default": ["@platforms//:incompatible"],
881918}})
882919""" .format (
883- target_compatible_with = ",\n " .join (['"%s": []' % _platform (triple , use_experimental_platforms ) for triple in platform_triples ]),
920+ platforms = _render_string_list (resolved_platforms ),
921+ target_compatible_with = ",\n " .join (['"%s": []' % platform for platform in resolved_platforms ]),
884922 this_repo = repr ("@" + hub_name + "//:" ),
885923 )
886924
@@ -939,9 +977,9 @@ RESOLVED_PLATFORMS = select({{
939977
940978 bazel_package = paths .join (workspace_package , package_dir )
941979
942- deps , conditional_deps = render_select ([], deps , use_experimental_platforms )
943- build_deps , conditional_build_deps = render_select ([], build_deps , use_experimental_platforms )
944- dev_deps , conditional_dev_deps = render_select ([], dev_deps , use_experimental_platforms )
980+ deps , deps_by_platform = _shared_and_per_platform ( deps , use_experimental_platforms )
981+ build_deps , build_deps_by_platform = _shared_and_per_platform ( build_deps , use_experimental_platforms )
982+ dev_deps , dev_deps_by_platform = _shared_and_per_platform ( dev_deps , use_experimental_platforms )
945983
946984 workspace_dep_stanzas .append ("""
947985 {bazel_package}: {{
@@ -950,13 +988,22 @@ RESOLVED_PLATFORMS = select({{
950988 }},
951989 "deps": [
952990 {deps}
953- ]{conditional_deps},
991+ ],
992+ "deps_by_platform": {{
993+ {deps_by_platform}
994+ }},
954995 "build_deps": [
955996 {build_deps}
956- ]{conditional_build_deps},
997+ ],
998+ "build_deps_by_platform": {{
999+ {build_deps_by_platform}
1000+ }},
9571001 "dev_deps": [
9581002 {dev_deps}
959- ]{conditional_dev_deps},
1003+ ],
1004+ "dev_deps_by_platform": {{
1005+ {dev_deps_by_platform}
1006+ }},
9601007 "binaries": {{
9611008 {binaries}
9621009 }},
@@ -966,12 +1013,12 @@ RESOLVED_PLATFORMS = select({{
9661013 }},""" .format (
9671014 bazel_package = repr (bazel_package ),
9681015 aliases = ",\n " .join (['"%s": "%s"' % kv for kv in sorted (aliases .items ())]),
969- deps = ", \n " . join ([ '"%s"' % d for d in sorted ( deps )] ),
970- conditional_deps = " + " + conditional_deps if conditional_deps else "" ,
971- build_deps = ", \n " . join ([ '"%s"' % d for d in sorted ( build_deps )] ),
972- conditional_build_deps = " + " + conditional_build_deps if conditional_build_deps else "" ,
973- dev_deps = ", \n " . join ([ '"%s"' % d for d in sorted ( dev_deps )] ),
974- conditional_dev_deps = " + " + conditional_dev_deps if conditional_dev_deps else "" ,
1016+ deps = _render_string_list ( deps ),
1017+ deps_by_platform = _render_string_list_dict ( deps_by_platform ) ,
1018+ build_deps = _render_string_list ( build_deps ),
1019+ build_deps_by_platform = _render_string_list_dict ( build_deps_by_platform ) ,
1020+ dev_deps = _render_string_list ( dev_deps ),
1021+ dev_deps_by_platform = _render_string_list_dict ( dev_deps_by_platform ) ,
9751022 binaries = ",\n " .join (['"%s": "%s"' % kv for kv in sorted (binaries .items ())]),
9761023 shared_libraries = ",\n " .join (['"%s": "%s"' % kv for kv in sorted (shared_libraries .items ())]),
9771024 ))
0 commit comments