Skip to content

Commit

Permalink
Remove crate_info attr
Browse files Browse the repository at this point in the history
  • Loading branch information
Vinh Tran committed Oct 9, 2023
1 parent e43d2f2 commit 51d7052
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 86 deletions.
71 changes: 57 additions & 14 deletions rust/private/rust.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -14,26 +14,25 @@

"""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",
"get_edition",
"get_import_macro_deps",
"transform_deps",
"transform_sources",
"determine_lib_name",
"can_build_metadata",
)
load("@bazel_skylib//lib:paths.bzl", "paths")

# TODO(marco): Separate each rule into its own file.

Expand Down Expand Up @@ -146,11 +145,10 @@ def _rust_library_common(ctx, crate_type):

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
Expand All @@ -176,14 +174,34 @@ def _rust_library_common(ctx, crate_type):
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,
rust_metadata = rust_metadata,
output_file = rust_lib,
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):
Expand All @@ -196,16 +214,41 @@ def _rust_binary_impl(ctx):
list: A list of providers. See `rustc_compile_action`
"""
toolchain = find_toolchain(ctx)
crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
_assert_correct_dep_mapping(ctx)

output = ctx.actions.declare_file(ctx.label.name + toolchain.binary_ext)

deps = transform_deps(ctx.attr.deps)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))

crate_root = getattr(ctx.file, "crate_root", None)
if not crate_root:
crate_root = crate_root_src(ctx.attr.name, ctx.files.srcs, ctx.attr.crate_type)
srcs, crate_root = transform_sources(ctx, ctx.files.srcs, crate_root)

return rustc_compile_action(
ctx = ctx,
attr = ctx.attr,
toolchain = toolchain,
crate_type = ctx.attr.crate_type,
output_file = output,
crate_info_dict = dict(
name = crate_name,
type = ctx.attr.crate_type,
root = crate_root,
srcs = depset(srcs),
deps = depset(deps),
proc_macro_deps = depset(proc_macro_deps),
aliases = ctx.attr.aliases,
output = output,
edition = get_edition(ctx.attr, toolchain, ctx.label),
_rustc_env_attr = ctx.attr.rustc_env,
rustc_env = ctx.attr.rustc_env,
rustc_env_files = ctx.files.rustc_env_files,
is_test = False,
compile_data = depset(ctx.files.compile_data),
compile_data_targets = depset(ctx.attr.compile_data),
owner = ctx.label,
),
)

def _rust_test_impl(ctx):
Expand Down Expand Up @@ -263,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,
Expand Down Expand Up @@ -307,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,
Expand All @@ -330,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,
)
Expand Down
33 changes: 8 additions & 25 deletions rust/private/rustc.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ load(
"is_exec_configuration",
"make_static_lib_symlink",
"relativize",
"create_crate_info_dict",
)

BuildInfo = _BuildInfo
Expand Down Expand Up @@ -1086,12 +1085,8 @@ def rustc_compile_action(
attr,
toolchain,
rust_flags = [],
crate_type = None,
crate_info = None,
output_hash = None,
force_all_deps_direct = False,
rust_metadata = None,
output_file = None,
crate_info_dict = None,
skip_expanding_rustc_env = False):
"""Create and run a rustc compile action based on the current rule's attributes
Expand All @@ -1115,26 +1110,14 @@ 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)

# if crate_info == None:
# print(crate_info_dict)

if crate_info == None:
if crate_info_dict:
crate_info = rust_common.create_crate_info(**crate_info_dict)
else:
crate_info_dict = create_crate_info_dict(
ctx = ctx,
toolchain = toolchain,
crate_type = crate_type,
rust_metadata = rust_metadata,
output_file = output_file,
)
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)

Expand All @@ -1152,9 +1135,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"),
Expand Down
47 changes: 0 additions & 47 deletions rust/private/utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -849,50 +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, rust_metadata, output_file, crate_info_dict = None):
"""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)

deps = transform_deps(ctx.attr.deps)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))

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 = output_file,
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,
)

0 comments on commit 51d7052

Please sign in to comment.