diff --git a/MODULE.bazel b/MODULE.bazel index 38cd31629a..d7b21bb5d7 100644 --- a/MODULE.bazel +++ b/MODULE.bazel @@ -16,6 +16,7 @@ bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_license", version = "1.0.0") bazel_dep(name = "rules_shell", version = "0.3.0") bazel_dep(name = "apple_support", version = "1.17.1", repo_name = "build_bazel_apple_support") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") internal_deps = use_extension("//rust/private:internal_extensions.bzl", "i") use_repo( diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel index be2c0fe3d8..4f63d598bc 100644 --- a/docs/BUILD.bazel +++ b/docs/BUILD.bazel @@ -11,6 +11,7 @@ bzl_library( "@bazel_tools//tools:bzl_srcs", ], deps = [ + "@aspect_bazel_lib//lib:resource_sets", "@bazel_skylib//lib:paths", "@bazel_skylib//lib:selects", "@bazel_skylib//lib:structs", diff --git a/docs/MODULE.bazel b/docs/MODULE.bazel index fb593ed975..ff3dcc3d4e 100644 --- a/docs/MODULE.bazel +++ b/docs/MODULE.bazel @@ -46,3 +46,4 @@ bazel_dep(name = "stardoc", version = "0.7.2") bazel_dep(name = "protobuf", version = "29.0", repo_name = "com_google_protobuf") bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_shell", version = "0.3.0") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") diff --git a/extensions/bindgen/MODULE.bazel b/extensions/bindgen/MODULE.bazel index d29700b79b..04fbc256d2 100644 --- a/extensions/bindgen/MODULE.bazel +++ b/extensions/bindgen/MODULE.bazel @@ -11,6 +11,7 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "llvm-project", version = "17.0.3.bcr.2") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") rust_ext = use_extension("//:extensions.bzl", "rust_ext") use_repo( diff --git a/extensions/prost/MODULE.bazel b/extensions/prost/MODULE.bazel index 49692fcc4e..29f3b64435 100644 --- a/extensions/prost/MODULE.bazel +++ b/extensions/prost/MODULE.bazel @@ -12,6 +12,7 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_proto", version = "7.1.0") bazel_dep(name = "protobuf", version = "28.3", repo_name = "com_google_protobuf") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") rust_ext = use_extension("//:extensions.bzl", "rust_ext") use_repo( diff --git a/extensions/prost/private/prost.bzl b/extensions/prost/private/prost.bzl index c5917107b5..4b36b8a282 100644 --- a/extensions/prost/private/prost.bzl +++ b/extensions/prost/private/prost.bzl @@ -1,5 +1,6 @@ """Rules for building protos in Rust with Prost and Tonic.""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("@rules_proto//proto:defs.bzl", "ProtoInfo", "proto_common") load("@rules_proto//proto:proto_common.bzl", proto_toolchains = "toolchains") @@ -365,7 +366,7 @@ rust_prost_aspect = aspect( executable = True, default = Label("//private:protoc_wrapper"), ), - } | RUSTC_ATTRS, + } | RUSTC_ATTRS | resource_set_attr, fragments = ["cpp"], toolchains = [ TOOLCHAIN_TYPE, @@ -406,7 +407,7 @@ def _rust_prost_library_impl(ctx): rust_prost_library = rule( doc = "A rule for generating a Rust library using Prost.", implementation = _rust_prost_library_impl, - attrs = { + attrs = resource_set_attr | { "proto": attr.label( doc = "A `proto_library` target for which to generate Rust gencode.", providers = [ProtoInfo], diff --git a/extensions/protobuf/MODULE.bazel b/extensions/protobuf/MODULE.bazel index bbf1ccad04..b45b58121f 100644 --- a/extensions/protobuf/MODULE.bazel +++ b/extensions/protobuf/MODULE.bazel @@ -12,6 +12,7 @@ bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "rules_proto", version = "7.1.0") bazel_dep(name = "protobuf", version = "28.3", repo_name = "com_google_protobuf") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") bazel_dep(name = "bazel_ci_rules", version = "1.0.0", dev_dependency = True) diff --git a/extensions/protobuf/proto.bzl b/extensions/protobuf/proto.bzl index 08bbb4453c..386b6b289c 100644 --- a/extensions/protobuf/proto.bzl +++ b/extensions/protobuf/proto.bzl @@ -14,6 +14,7 @@ """Rust Protobuf Rules""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@rules_proto//proto:defs.bzl", "ProtoInfo") # buildifier: disable=bzl-visibility @@ -280,7 +281,7 @@ def _rust_proto_library_impl(ctx): rust_proto_library = rule( implementation = _rust_proto_library_impl, - attrs = { + attrs = resource_set_attr | { "crate_name": attr.string( doc = """\ Crate name to use for this target. diff --git a/extensions/wasm_bindgen/MODULE.bazel b/extensions/wasm_bindgen/MODULE.bazel index fdb666dfac..f78cd72cb6 100644 --- a/extensions/wasm_bindgen/MODULE.bazel +++ b/extensions/wasm_bindgen/MODULE.bazel @@ -11,6 +11,7 @@ bazel_dep(name = "bazel_skylib", version = "1.7.1") bazel_dep(name = "platforms", version = "0.0.11") bazel_dep(name = "rules_cc", version = "0.1.1") bazel_dep(name = "aspect_rules_js", version = "2.1.2") +bazel_dep(name = "aspect_bazel_lib", version = "2.19.4") rust_ext = use_extension("//:extensions.bzl", "rust_ext") use_repo( diff --git a/extensions/wasm_bindgen/private/wasm_bindgen_test.bzl b/extensions/wasm_bindgen/private/wasm_bindgen_test.bzl index 6617c64451..3212a3a0e7 100644 --- a/extensions/wasm_bindgen/private/wasm_bindgen_test.bzl +++ b/extensions/wasm_bindgen/private/wasm_bindgen_test.bzl @@ -1,5 +1,6 @@ """Bazel test rules for [wasm-bindgen](https://crates.io/crates/wasm-bindgen)""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@rules_rust//rust:defs.bzl", "rust_common") # buildifier: disable=bzl-visibility @@ -329,7 +330,7 @@ rust_wasm_bindgen_test = rule( executable = True, default = Label("//private:wasm_bindgen_test_wrapper"), ), - } | RUSTC_ATTRS, + } | RUSTC_ATTRS | resource_set_attr, fragments = ["cpp"], toolchains = [ str(Label("//:toolchain_type")), diff --git a/rust/private/BUILD.bazel b/rust/private/BUILD.bazel index 71a4105dde..da9cc2b5de 100644 --- a/rust/private/BUILD.bazel +++ b/rust/private/BUILD.bazel @@ -27,6 +27,7 @@ bzl_library( ":bazel_tools_bzl_lib", ":rules_cc_bzl_lib", "//rust/platform:bzl_lib", + "@aspect_bazel_lib//lib:resource_sets", "@bazel_skylib//lib:paths", "@bazel_skylib//rules:common_settings", ], diff --git a/rust/private/rust.bzl b/rust/private/rust.bzl index 74d458eef9..35f5e3c7a6 100644 --- a/rust/private/rust.bzl +++ b/rust/private/rust.bzl @@ -14,6 +14,7 @@ """Rust rule implementations""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@bazel_skylib//lib:paths.bzl", "paths") load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") load("//rust/private:common.bzl", "COMMON_PROVIDERS", "rust_common") @@ -817,7 +818,7 @@ _rust_test_attrs = { rust_library = rule( implementation = _rust_library_impl, provides = COMMON_PROVIDERS, - attrs = _common_attrs | { + attrs = _common_attrs | resource_set_attr | { "disable_pipelining": attr.bool( default = False, doc = dedent("""\ @@ -915,7 +916,7 @@ _rust_static_library_transition = transition( rust_static_library = rule( implementation = _rust_static_library_impl, - attrs = _common_attrs | { + attrs = _common_attrs | resource_set_attr | { "platform": attr.label( doc = "Optional platform to transition the static library to.", default = None, @@ -964,7 +965,7 @@ _rust_shared_library_transition = transition( rust_shared_library = rule( implementation = _rust_shared_library_impl, - attrs = _common_attrs | _experimental_use_cc_common_link_attrs | { + attrs = _common_attrs | _experimental_use_cc_common_link_attrs | resource_set_attr | { "platform": attr.label( doc = "Optional platform to transition the shared library to.", default = None, @@ -1017,7 +1018,7 @@ rust_proc_macro = rule( # need to declare `_allowlist_function_transition`, see # https://docs.bazel.build/versions/main/skylark/config.html#user-defined-transitions. attrs = dict( - _common_attrs.items(), + (_common_attrs | resource_set_attr).items(), _allowlist_function_transition = attr.label( default = Label("//tools/allowlists/function_transition_allowlist"), ), @@ -1105,7 +1106,7 @@ _rust_binary_transition = transition( rust_binary = rule( implementation = _rust_binary_impl, provides = COMMON_PROVIDERS, - attrs = _common_attrs | _rust_binary_attrs | { + attrs = _common_attrs | _rust_binary_attrs | resource_set_attr | { "platform": attr.label( doc = "Optional platform to transition the binary to.", default = None, @@ -1294,7 +1295,7 @@ _rust_test_transition = transition( rust_test = rule( implementation = _rust_test_impl, provides = COMMON_PROVIDERS, - attrs = _common_attrs | _rust_test_attrs | { + attrs = _common_attrs | _rust_test_attrs | resource_set_attr | { "platform": attr.label( doc = "Optional platform to transition the test to.", default = None, diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index d78c28902c..ece9c5acc0 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -14,6 +14,7 @@ """Functionality for constructing actions that invoke the Rust compiler""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set") load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo") load( "@bazel_tools//tools/build_defs/cc:action_names.bzl", @@ -1357,6 +1358,10 @@ def rustc_compile_action( action_outputs.append(dsym_folder) if ctx.executable._process_wrapper: + rustc_resource_set = resource_set(ctx.attr) + if rustc_resource_set == None: + rustc_resource_set = get_rustc_resource_set(toolchain) + # Run as normal ctx.actions.run( executable = ctx.executable._process_wrapper, @@ -1371,8 +1376,8 @@ def rustc_compile_action( formatted_version, len(crate_info.srcs.to_list()), ), + resource_set = rustc_resource_set, toolchain = "@rules_rust//rust:toolchain_type", - resource_set = get_rustc_resource_set(toolchain), ) if args_metadata: ctx.actions.run( @@ -1388,6 +1393,7 @@ def rustc_compile_action( formatted_version, len(crate_info.srcs.to_list()), ), + resource_set = resource_set(ctx.attr), toolchain = "@rules_rust//rust:toolchain_type", ) elif hasattr(ctx.executable, "_bootstrap_process_wrapper"): diff --git a/rust/repositories.bzl b/rust/repositories.bzl index a5df38421e..ff9d3f5371 100644 --- a/rust/repositories.bzl +++ b/rust/repositories.bzl @@ -127,6 +127,14 @@ def rules_rust_dependencies(): url = "https://github.com/bazelbuild/apple_support/releases/download/1.17.1/apple_support.1.17.1.tar.gz", ) + maybe( + http_archive, + name = "aspect_bazel_lib", + sha256 = "9a44f457810ce64ec36a244cc7c807607541ab88f2535e07e0bf2976ef4b73fe", + strip_prefix = "bazel-lib-2.19.4", + url = "https://github.com/bazel-contrib/bazel-lib/releases/download/v2.19.4/bazel-lib-v2.19.4.tar.gz", + ) + # process_wrapper needs a low-dependency way to process json. maybe( http_archive, diff --git a/test/unit/consistent_crate_name/with_modified_crate_name.bzl b/test/unit/consistent_crate_name/with_modified_crate_name.bzl index d214e42ae2..622c4901c2 100644 --- a/test/unit/consistent_crate_name/with_modified_crate_name.bzl +++ b/test/unit/consistent_crate_name/with_modified_crate_name.bzl @@ -1,5 +1,6 @@ """A custom rule that threats all its dependencies as direct dependencies.""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") # buildifier: disable=bzl-visibility @@ -56,7 +57,7 @@ def _with_modified_crate_name_impl(ctx): with_modified_crate_name = rule( implementation = _with_modified_crate_name_impl, - attrs = { + attrs = resource_set_attr | { "deps": attr.label_list(), "src": attr.label( allow_single_file = [".rs"], diff --git a/test/unit/force_all_deps_direct/generator.bzl b/test/unit/force_all_deps_direct/generator.bzl index 74a3862247..2d12b60bd7 100644 --- a/test/unit/force_all_deps_direct/generator.bzl +++ b/test/unit/force_all_deps_direct/generator.bzl @@ -1,5 +1,6 @@ """A custom rule that threats all its dependencies as direct dependencies.""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") # buildifier: disable=bzl-visibility @@ -73,7 +74,7 @@ def _generator_impl(ctx): generator = rule( implementation = _generator_impl, - attrs = { + attrs = resource_set_attr | { "deps": attr.label_list( doc = "List of other libraries to be linked to this library target.", providers = [CrateInfo], diff --git a/test/unit/pipelined_compilation/wrap.bzl b/test/unit/pipelined_compilation/wrap.bzl index eef7eafffe..cc0bdef17f 100644 --- a/test/unit/pipelined_compilation/wrap.bzl +++ b/test/unit/pipelined_compilation/wrap.bzl @@ -1,5 +1,6 @@ """A custom rule that wraps a crate called to_wrap.""" +load("@aspect_bazel_lib//lib:resource_sets.bzl", "resource_set_attr") load("@rules_cc//cc/common:cc_info.bzl", "CcInfo") # buildifier: disable=bzl-visibility @@ -82,7 +83,7 @@ def _wrap_impl(ctx): wrap = rule( implementation = _wrap_impl, - attrs = { + attrs = resource_set_attr | { "crate_name": attr.string(), "generate_metadata": attr.bool(default = False), "target": attr.label(),