diff --git a/proto/prost/private/prost.bzl b/proto/prost/private/prost.bzl index b513b154ed..1db20021a6 100644 --- a/proto/prost/private/prost.bzl +++ b/proto/prost/private/prost.bzl @@ -160,7 +160,7 @@ def _compile_rust(ctx, attr, crate_name, src, deps, edition): ctx = ctx, attr = attr, toolchain = toolchain, - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate_name, type = "rlib", root = src, diff --git a/proto/protobuf/proto.bzl b/proto/protobuf/proto.bzl index 2fcc1db50a..6ff45cc2a8 100644 --- a/proto/protobuf/proto.bzl +++ b/proto/protobuf/proto.bzl @@ -20,7 +20,6 @@ load( _generate_proto = "rust_generate_proto", _generated_file_stem = "generated_file_stem", ) -load("//rust:defs.bzl", "rust_common") # buildifier: disable=bzl-visibility load("//rust/private:rustc.bzl", "rustc_compile_action") @@ -214,7 +213,7 @@ def _rust_proto_compile(protos, descriptor_sets, imports, crate_name, ctx, is_gr ctx = ctx, attr = ctx.attr, toolchain = toolchain, - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate_name, type = "rlib", root = lib_rs, diff --git a/rust/private/rust.bzl b/rust/private/rust.bzl index d736fc6972..2914f4cc3d 100644 --- a/rust/private/rust.bzl +++ b/rust/private/rust.bzl @@ -14,15 +14,17 @@ """Rust rule implementations""" +load("@bazel_skylib//lib:paths.bzl", "paths") load("//rust/private:common.bzl", "rust_common") load("//rust/private:providers.bzl", "BuildInfo") load("//rust/private:rustc.bzl", "rustc_compile_action") load( "//rust/private:utils.bzl", + "can_build_metadata", "compute_crate_name", "crate_root_src", - "create_crate_info_dict", "dedent", + "determine_lib_name", "determine_output_hash", "expand_dict_value_locations", "find_toolchain", @@ -31,6 +33,7 @@ load( "transform_deps", "transform_sources", ) + # TODO(marco): Separate each rule into its own file. def _assert_no_deprecated_attributes(_ctx): @@ -140,10 +143,12 @@ def _rust_library_common(ctx, crate_type): toolchain = find_toolchain(ctx) + crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name) + crate_root = getattr(ctx.file, "crate_root", None) if not crate_root: crate_root = crate_root_src(ctx.attr.name, ctx.files.srcs, crate_type) - _, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root) + srcs, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root) # Determine unique hash for this rlib. # Note that we don't include a hash for `cdylib` and `staticlib` since they are meant to be consumed externally @@ -155,13 +160,48 @@ def _rust_library_common(ctx, crate_type): else: output_hash = determine_output_hash(crate_root, ctx.label) + rust_lib_name = determine_lib_name( + crate_name, + crate_type, + toolchain, + output_hash, + ) + rust_lib = ctx.actions.declare_file(rust_lib_name) + rust_metadata = None + if can_build_metadata(toolchain, ctx, crate_type) and not ctx.attr.disable_pipelining: + rust_metadata = ctx.actions.declare_file( + paths.replace_extension(rust_lib_name, ".rmeta"), + sibling = rust_lib, + ) + + deps = transform_deps(ctx.attr.deps) + proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx)) + return rustc_compile_action( ctx = ctx, attr = ctx.attr, toolchain = toolchain, output_hash = output_hash, - crate_type = crate_type, - create_crate_info_callback = create_crate_info_dict, + crate_info_dict = dict( + name = crate_name, + type = crate_type, + root = crate_root, + srcs = depset(srcs), + deps = depset(deps), + proc_macro_deps = depset(proc_macro_deps), + aliases = ctx.attr.aliases, + output = rust_lib, + metadata = rust_metadata, + edition = get_edition(ctx.attr, toolchain, ctx.label), + rustc_env = ctx.attr.rustc_env, + rustc_env_files = ctx.files.rustc_env_files, + is_test = False, + data = depset(ctx.files.data), + compile_data = depset(ctx.files.compile_data), + compile_data_targets = depset(ctx.attr.compile_data), + owner = ctx.label, + _rustc_env_attr = ctx.attr.rustc_env, + ), ) def _rust_binary_impl(ctx): @@ -191,7 +231,7 @@ def _rust_binary_impl(ctx): ctx = ctx, attr = ctx.attr, toolchain = toolchain, - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate_name, type = ctx.attr.crate_type, root = crate_root, @@ -266,7 +306,7 @@ def _rust_test_impl(ctx): )) # Build the test binary using the dependency's srcs. - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate.name, type = crate_type, root = crate.root, @@ -310,7 +350,7 @@ def _rust_test_impl(ctx): ) # Target is a standalone crate. Build the test binary as its own crate. - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name), type = crate_type, root = crate_root, @@ -333,7 +373,7 @@ def _rust_test_impl(ctx): ctx = ctx, attr = ctx.attr, toolchain = toolchain, - crate_info = crate_info, + crate_info_dict = crate_info_dict, rust_flags = ["--test"] if ctx.attr.use_libtest_harness else ["--cfg", "test"], skip_expanding_rustc_env = True, ) diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl index 6ae6f30ca1..c972e4783e 100644 --- a/rust/private/rustc.bzl +++ b/rust/private/rustc.bzl @@ -1085,13 +1085,9 @@ def rustc_compile_action( attr, toolchain, rust_flags = [], - crate_type = None, - crate_info = None, output_hash = None, force_all_deps_direct = False, - # TODO: Remove create_crate_info_callback and skip_expanding_rustc_env attributes - # after all CrateInfo structs are constructed in rustc_compile_action - create_crate_info_callback = None, + crate_info_dict = None, skip_expanding_rustc_env = False): """Create and run a rustc compile action based on the current rule's attributes @@ -1099,13 +1095,11 @@ def rustc_compile_action( ctx (ctx): The rule's context object attr (struct): Attributes to use for the rust compile action toolchain (rust_toolchain): The current `rust_toolchain` - crate_type: TODO - crate_info (CrateInfo): The CrateInfo provider for the current target. output_hash (str, optional): The hashed path of the crate root. Defaults to None. rust_flags (list, optional): Additional flags to pass to rustc. Defaults to []. force_all_deps_direct (bool, optional): Whether to pass the transitive rlibs with --extern to the commandline as opposed to -L. - create_crate_info_callback: A callback to construct a mutable dict for constructor CrateInfo + crate_info_dict: A mutable dict used to create CrateInfo provider skip_expanding_rustc_env (bool, optional): Whether to expand CrateInfo.rustc_env Returns: @@ -1114,19 +1108,11 @@ def rustc_compile_action( - (DepInfo): The transitive dependencies of this crate. - (DefaultInfo): The output file for this crate, and its runfiles. """ - # TODO: Remove create_crate_info_callback after all rustc_compile_action callers migrate to - # removing CrateInfo construction before `rust_compile_action + crate_info = rust_common.create_crate_info(**crate_info_dict) - crate_info_dict = None - if create_crate_info_callback != None: - if ctx == None or toolchain == None or crate_type == None or crate_info != None: - fail("FAIL", ctx, toolchain, crate_type) - crate_info_dict = create_crate_info_callback(ctx, toolchain, crate_type) - - if crate_info_dict != None: - crate_info = rust_common.create_crate_info(**crate_info_dict) - - build_metadata = getattr(crate_info, "metadata", None) + build_metadata = None + if "metadata" in crate_info_dict: + build_metadata = crate_info_dict["metadata"] cc_toolchain, feature_configuration = find_cc_toolchain(ctx) @@ -1144,9 +1130,9 @@ def rustc_compile_action( experimental_use_cc_common_link = toolchain._experimental_use_cc_common_link dep_info, build_info, linkstamps = collect_deps( - deps = crate_info.deps, - proc_macro_deps = crate_info.proc_macro_deps, - aliases = crate_info.aliases, + deps = crate_info_dict["deps"], + proc_macro_deps = crate_info_dict["proc_macro_deps"], + aliases = crate_info_dict["aliases"], are_linkstamps_supported = _are_linkstamps_supported( feature_configuration = feature_configuration, has_grep_includes = hasattr(ctx.attr, "_use_grep_includes"), diff --git a/rust/private/utils.bzl b/rust/private/utils.bzl index ddee229bed..7b0fe23e9b 100644 --- a/rust/private/utils.bzl +++ b/rust/private/utils.bzl @@ -727,7 +727,7 @@ def _shortest_src_with_basename(srcs, basename): shortest = f return shortest -def _determine_lib_name(name, crate_type, toolchain, lib_hash = None): +def determine_lib_name(name, crate_type, toolchain, lib_hash = None): """See https://github.com/bazelbuild/rules_rust/issues/405 Args: @@ -849,68 +849,3 @@ def _symlink_for_non_generated_source(ctx, src_file, package_root): return src_symlink else: return src_file - -def create_crate_info_dict(ctx, toolchain, crate_type): - """Creates a mutable dict() representing CrateInfo provider - - create_crate_info_dict is a *temporary* solution until create_crate_info is completely moved into - rustc_compile_action function. - - The function is currently used as a callback to support constructing CrateInfo in rustc_compile_action - to ensure `CrateInfo.rustc_env` is fully loaded with all the env vars passed to rustc. - - Args: - ctx (struct): The current rule's context - toolchain (toolchain): The rust toolchain - crate_type (String): one of lib|rlib|dylib|staticlib|cdylib|proc-macro - - Returns: - File: The created symlink if a non-generated file, or the file itself. - """ - crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name) - crate_root = getattr(ctx.file, "crate_root", None) - if not crate_root: - crate_root = crate_root_src(ctx.attr.name, ctx.files.srcs, crate_type) - srcs, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root) - - if crate_type in ["cdylib", "staticlib"]: - output_hash = None - else: - output_hash = determine_output_hash(crate_root, ctx.label) - - deps = transform_deps(ctx.attr.deps) - proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx)) - rust_lib_name = _determine_lib_name( - crate_name, - crate_type, - toolchain, - output_hash, - ) - rust_lib = ctx.actions.declare_file(rust_lib_name) - rust_metadata = None - if can_build_metadata(toolchain, ctx, crate_type) and not ctx.attr.disable_pipelining: - rust_metadata = ctx.actions.declare_file( - paths.replace_extension(rust_lib_name, ".rmeta"), - sibling = rust_lib, - ) - - return dict( - name = crate_name, - type = crate_type, - root = crate_root, - srcs = depset(srcs), - deps = depset(deps), - proc_macro_deps = depset(proc_macro_deps), - aliases = ctx.attr.aliases, - output = rust_lib, - metadata = rust_metadata, - edition = get_edition(ctx.attr, toolchain, ctx.label), - rustc_env = ctx.attr.rustc_env, - rustc_env_files = ctx.files.rustc_env_files, - is_test = False, - data = depset(ctx.files.data), - compile_data = depset(ctx.files.compile_data), - compile_data_targets = depset(ctx.attr.compile_data), - owner = ctx.label, - _rustc_env_attr = ctx.attr.rustc_env, - ) 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 335ec12865..7a3bca6012 100644 --- a/test/unit/consistent_crate_name/with_modified_crate_name.bzl +++ b/test/unit/consistent_crate_name/with_modified_crate_name.bzl @@ -1,7 +1,5 @@ """A custom rule that threats all its dependencies as direct dependencies.""" -load("//rust:defs.bzl", "rust_common") - # buildifier: disable=bzl-visibility load("//rust/private:providers.bzl", "BuildInfo", "CrateInfo", "DepInfo", "DepVariantInfo") @@ -35,7 +33,7 @@ def _with_modified_crate_name_impl(ctx): ctx = ctx, attr = ctx.attr, toolchain = toolchain, - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate_name, type = crate_type, root = crate_root, diff --git a/test/unit/force_all_deps_direct/generator.bzl b/test/unit/force_all_deps_direct/generator.bzl index f56d09c2c8..959687c6b6 100644 --- a/test/unit/force_all_deps_direct/generator.bzl +++ b/test/unit/force_all_deps_direct/generator.bzl @@ -1,8 +1,5 @@ """A custom rule that threats all its dependencies as direct dependencies.""" -# buildifier: disable=bzl-visibility -load("//rust/private:common.bzl", "rust_common") - # buildifier: disable=bzl-visibility load("//rust/private:providers.bzl", "BuildInfo", "CrateInfo", "DepInfo", "DepVariantInfo") @@ -52,7 +49,7 @@ EOF ctx = ctx, attr = ctx.attr, toolchain = toolchain, - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate_name, type = crate_type, root = rs_file, diff --git a/test/unit/pipelined_compilation/wrap.bzl b/test/unit/pipelined_compilation/wrap.bzl index b00f761a9a..7ceef1c021 100644 --- a/test/unit/pipelined_compilation/wrap.bzl +++ b/test/unit/pipelined_compilation/wrap.bzl @@ -1,8 +1,5 @@ """A custom rule that wraps a crate called to_wrap.""" -# buildifier: disable=bzl-visibility -load("//rust/private:common.bzl", "rust_common") - # buildifier: disable=bzl-visibility load("//rust/private:providers.bzl", "BuildInfo", "CrateInfo", "DepInfo", "DepVariantInfo") @@ -61,7 +58,7 @@ EOF ctx = ctx, attr = ctx.attr, toolchain = toolchain, - crate_info = rust_common.create_crate_info( + crate_info_dict = dict( name = crate_name, type = crate_type, root = rs_file,