Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 29 additions & 34 deletions rust/private/rust.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ load(
"generate_output_diagnostics",
"get_edition",
"get_import_macro_deps",
"partition_deps",
"transform_deps",
"transform_sources",
)
Expand All @@ -53,31 +54,6 @@ def _assert_no_deprecated_attributes(_ctx):
"""
pass

def _assert_correct_dep_mapping(ctx):
"""Forces a failure if proc_macro_deps and deps are mixed inappropriately

Args:
ctx (ctx): The current rule's context object
"""
for dep in ctx.attr.deps:
if rust_common.crate_info in dep:
if dep[rust_common.crate_info].type == "proc-macro":
fail(
"{} listed {} in its deps, but it is a proc-macro. It should instead be in the bazel property proc_macro_deps.".format(
ctx.label,
dep.label,
),
)
for dep in ctx.attr.proc_macro_deps:
type = dep[rust_common.crate_info].type
if type != "proc-macro":
fail(
"{} listed {} in its proc_macro_deps, but it is not proc-macro, it is a {}. It should probably instead be listed in deps.".format(
ctx.label,
dep.label,
type,
),
)

def _rust_library_impl(ctx):
"""The implementation of the `rust_library` rule.
Expand Down Expand Up @@ -148,7 +124,7 @@ def _rust_library_common(ctx, crate_type):
list: A list of providers. See `rustc_compile_action`
"""
_assert_no_deprecated_attributes(ctx)
_assert_correct_dep_mapping(ctx)
deps, proc_macro_deps = partition_deps(ctx)

toolchain = find_toolchain(ctx)

Expand Down Expand Up @@ -195,8 +171,8 @@ def _rust_library_common(ctx, crate_type):
not ctx.attr.disable_pipelining
)

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

return rustc_compile_action(
ctx = ctx,
Expand Down Expand Up @@ -238,16 +214,16 @@ def _rust_binary_impl(ctx):
"""
toolchain = find_toolchain(ctx)
crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
_assert_correct_dep_mapping(ctx)
deps, proc_macro_deps = partition_deps(ctx)

if ctx.attr.binary_name:
output_filename = ctx.attr.binary_name
else:
output_filename = ctx.label.name
output = ctx.actions.declare_file(output_filename + toolchain.binary_ext)

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

crate_root = getattr(ctx.file, "crate_root", None)
if not crate_root:
Expand Down Expand Up @@ -327,13 +303,13 @@ def _rust_test_impl(ctx):
list: The list of providers. See `rustc_compile_action`
"""
_assert_no_deprecated_attributes(ctx)
_assert_correct_dep_mapping(ctx)
deps, proc_macro_deps = partition_deps(ctx)

toolchain = find_toolchain(ctx)

crate_type = "bin"
deps = transform_deps(ctx.attr.deps)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
deps = transform_deps(deps)
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))

if ctx.attr.crate and ctx.attr.srcs:
fail("rust_test.crate and rust_test.srcs are mutually exclusive. Update {} to use only one of these attributes".format(
Expand Down Expand Up @@ -1072,6 +1048,21 @@ rust_shared_library = rule(
"""),
)

def _exec_transition_impl(_settings, attr):
return {
"//command_line_option:is exec configuration": not attr.internal_doctest_transition_override,
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

wasn't sure if there was a cleaner way to do this, hacking around a failure in the doctest

Executing tests from //test/unit/rustdoc:rustdoc_proc_macro_doctest
-----------------------------------------------------------------------------
error[E0463]: can't find crate for `std`
  |
  = note: the `aarch64-apple-darwin` target may not be installed
  = help: consider downloading the target with `rustup target add aarch64-apple-darwin`

error: aborting due to 1 previous error

For more information about this error, try `rustc --explain E0463`.

"//command_line_option:stamp": False,
}

_exec_transition = transition(
inputs = [],
outputs = [
"//command_line_option:is exec configuration",
"//command_line_option:stamp",
],
implementation = _exec_transition_impl,
)

def _proc_macro_dep_transition_impl(settings, _attr):
if settings["//rust/private:is_proc_macro_dep_enabled"]:
return {"//rust/private:is_proc_macro_dep": True}
Expand Down Expand Up @@ -1105,7 +1096,11 @@ rust_proc_macro = rule(
"""),
cfg = _proc_macro_dep_transition,
),
internal_doctest_transition_override = attr.bool(
doc = "Used for internal testing; do not set",
),
),
cfg = _exec_transition,
fragments = ["cpp"],
toolchains = [
str(Label("//rust:toolchain_type")),
Expand Down
2 changes: 1 addition & 1 deletion rust/private/rustc.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ def collect_deps(

Args:
deps (list): The deps from ctx.attr.deps.
proc_macro_deps (list): The proc_macro deps from ctx.attr.proc_macro_deps.
proc_macro_deps (list): The proc_macro_deps from partition_deps(ctx).
aliases (dict): A dict mapping aliased targets to their actual Crate information.

Returns:
Expand Down
7 changes: 4 additions & 3 deletions rust/private/rustdoc_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
load("//rust/private:common.bzl", "rust_common")
load("//rust/private:providers.bzl", "CrateInfo")
load("//rust/private:rustdoc.bzl", "rustdoc_compile_action")
load("//rust/private:utils.bzl", "dedent", "find_toolchain", "transform_deps")
load("//rust/private:utils.bzl", "dedent", "find_toolchain", "partition_deps", "transform_deps")

def _construct_writer_arguments(ctx, test_runner, opt_test_params, action, crate_info):
"""Construct arguments and environment variables specific to `rustdoc_test_writer`.
Expand Down Expand Up @@ -110,8 +110,9 @@ def _rust_doc_test_impl(ctx):
toolchain = find_toolchain(ctx)

crate = ctx.attr.crate[rust_common.crate_info]
deps = transform_deps(ctx.attr.deps)
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps)
deps, proc_macro_deps = partition_deps(ctx)
deps = transform_deps(deps)
proc_macro_deps = transform_deps(proc_macro_deps)

crate_info = rust_common.create_crate_info(
name = crate.name,
Expand Down
22 changes: 22 additions & 0 deletions rust/private/utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -498,6 +498,28 @@ def is_exec_configuration(ctx):
# TODO(djmarcin): Is there any better way to determine cfg=exec?
return ctx.genfiles_dir.path.find("-exec") != -1

def partition_deps(ctx):
"""Split deps into normal deps and proc_macro_deps.

Args:
ctx (ctx): The current rule's context object

Returns:
deps, proc_macro_deps
"""
if ctx.attr.proc_macro_deps:
print("`proc_macro_deps` attribute is deprecated; all deps can go in `deps`")

deps = []
proc_macro_deps = []
for dep in ctx.attr.deps + ctx.attr.proc_macro_deps:
if CrateInfo in dep and dep[CrateInfo].type == "proc-macro":
proc_macro_deps.append(dep)
else:
deps.append(dep)

return deps, proc_macro_deps

def transform_deps(deps):
"""Transforms a [Target] into [DepVariantInfo].

Expand Down
4 changes: 2 additions & 2 deletions test/unit/is_proc_macro_dep/is_proc_macro_dep_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ is_proc_macro_dep_is_not_in_env_for_top_level_action_test = analysistest.make(_i
def _is_proc_macro_dep_is_false_for_proc_macro(ctx):
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
proc_macro_dep_action = [a for a in tut[DepActionsInfo].actions if str(a) == "action 'Compiling Rust proc-macro proc_macro_crate (1 files)'"][0]
proc_macro_dep_action = [a for a in tut[DepActionsInfo].actions if str(a) == "action 'Compiling Rust proc-macro proc_macro_crate (1 files) [for tool]'"][0]
asserts.equals(env, proc_macro_dep_action.env["BAZEL_RULES_RUST_IS_PROC_MACRO_DEP"], "0")
return analysistest.end(env)

Expand All @@ -83,7 +83,7 @@ is_proc_macro_dep_is_false_for_top_level_library_test = analysistest.make(_is_pr
def _is_proc_macro_dep_is_true_for_proc_macro_dep(ctx):
env = analysistest.begin(ctx)
tut = analysistest.target_under_test(env)
proc_macro_dep_action = [a for a in tut[DepActionsInfo].actions if str(a) == "action 'Compiling Rust rlib proc_macro_dep (1 files)'"][0]
proc_macro_dep_action = [a for a in tut[DepActionsInfo].actions if str(a) == "action 'Compiling Rust rlib proc_macro_dep (1 files) [for tool]'"][0]
asserts.equals(env, proc_macro_dep_action.env["BAZEL_RULES_RUST_IS_PROC_MACRO_DEP"], "1")
return analysistest.end(env)

Expand Down
4 changes: 2 additions & 2 deletions test/unit/rustdoc/rustdoc_unit_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -190,8 +190,7 @@ def _target_maker(rule_fn, name, rustdoc_deps = [], rustdoc_proc_macro_deps = []
rust_doc_test(
name = "{}_doctest".format(name),
crate = ":{}".format(name),
deps = rustdoc_deps,
proc_macro_deps = rustdoc_proc_macro_deps,
deps = rustdoc_deps + rustdoc_proc_macro_deps,
target_compatible_with = NOT_WINDOWS,
)

Expand Down Expand Up @@ -241,6 +240,7 @@ def _define_targets():
rust_proc_macro,
name = "rustdoc_proc_macro",
srcs = ["rustdoc_proc_macro.rs"],
internal_doctest_transition_override = True,
)

_target_maker(
Expand Down
Loading