aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVinh Tran <vinhdaitran@google.com>2023-10-17 12:52:37 -0400
committerGitHub <noreply@github.com>2023-10-17 18:52:37 +0200
commit3a78d01631ea8c2f7b747f6f0e7b4d29c735371d (patch)
treed4093f37c78e12ea367c90a85a6e4a59193efcb5
parentb4135d6a4a1dc330e132742e5cbf8f06b76d92a7 (diff)
downloadbazelbuild-rules_rust-3a78d01631ea8c2f7b747f6f0e7b4d29c735371d.tar.gz
Refactor rustc_compile_action to construct CrateInfo internally (#2188)
In #2161, I anticipated to make [create_crate_info_dict](https://github.com/bazelbuild/rules_rust/pull/2161/files#diff-b75adb75969318e09670c45b8eea5aaf147fdc1d2cf229a72a17bd39edf49163R853) reusable across all rules and aspects. The logic to construct `crate_info` is significantly different among the rules and aspects. As I tried to to expand the arguments to make `create_crate_info_dict` universally reusable, the arguments grow which make it not worth anymore. This PR changes the refactoring approach. Before (result from #2161) ``` def _rust_library_common() return rustc_compile_action( # the callback allows us to slowly refactor one rule or aspect at a time. create_crate_info_callback = create_crate_info_dict, ) def rustc_compile_action(create_crate_info_callback) if create_crate_info_callback: crate_info_dict = create_crate_info_callback() ``` After (result from this PR) ``` def _rust_library_common() # create crate_info_dict return rustc_compile_action( crate_info_dict = crate_info_dict, ) def rustc_compile_action(crate_info_dict) # crate_info_dict always exists ``` Instead of creating `crate_info_dict` at the beginning of `rustc_compile_action`, this PR lifted the creation logic to the rules and aspects completely so that they can add any custom logic without caring about the `rustc_compile_action`'s implementation. --------- Co-authored-by: scentini <rosica@google.com>
-rw-r--r--proto/prost/private/prost.bzl2
-rw-r--r--proto/protobuf/proto.bzl3
-rw-r--r--rust/private/rust.bzl56
-rw-r--r--rust/private/rustc.bzl32
-rw-r--r--rust/private/utils.bzl67
-rw-r--r--test/unit/consistent_crate_name/with_modified_crate_name.bzl4
-rw-r--r--test/unit/force_all_deps_direct/generator.bzl5
-rw-r--r--test/unit/pipelined_compilation/wrap.bzl5
8 files changed, 63 insertions, 111 deletions
diff --git a/proto/prost/private/prost.bzl b/proto/prost/private/prost.bzl
index b513b154..1db20021 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 2fcc1db5..6ff45cc2 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 d736fc69..2914f4cc 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 6ae6f30c..c972e478 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 ddee229b..7b0fe23e 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 335ec128..7a3bca60 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 f56d09c2..959687c6 100644
--- a/test/unit/force_all_deps_direct/generator.bzl
+++ b/test/unit/force_all_deps_direct/generator.bzl
@@ -1,9 +1,6 @@
"""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")
# buildifier: disable=bzl-visibility
@@ -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 b00f761a..7ceef1c0 100644
--- a/test/unit/pipelined_compilation/wrap.bzl
+++ b/test/unit/pipelined_compilation/wrap.bzl
@@ -1,9 +1,6 @@
"""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")
# buildifier: disable=bzl-visibility
@@ -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,