Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
7 changes: 5 additions & 2 deletions extensions/wasm_bindgen/private/wasm_bindgen_test.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ load(
"@rules_rust//rust/private:utils.bzl",
"determine_output_hash",
"expand_dict_value_locations",
"filter_deps",
"find_toolchain",
"generate_output_diagnostics",
"get_import_macro_deps",
Expand Down Expand Up @@ -67,8 +68,10 @@ def _rust_wasm_bindgen_test_impl(ctx):
toolchain = find_toolchain(ctx)

crate_type = "bin"
deps = transform_deps(ctx.attr.deps + [wb_toolchain.wasm_bindgen_test])
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))

deps, proc_macro_deps = filter_deps(ctx)
deps = transform_deps(deps + [wb_toolchain.wasm_bindgen_test])
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))

# Target is building the crate in `test` config
if WasmBindgenTestCrateInfo in ctx.attr.wasm:
Expand Down
29 changes: 22 additions & 7 deletions rust/defs.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -76,25 +76,40 @@ load(
_rust_unpretty_aspect = "rust_unpretty_aspect",
)

rust_library = _rust_library
def _rule_wrapper(rule):
def _wrapped(name, deps = [], proc_macro_deps = [], **kwargs):
if proc_macro_deps:
print("proc_macros can now be passed directly to `deps`, no need to use `proc_macro_deps` in " + native.package_relative_label(name))

rule(
name = name,
deps = deps + proc_macro_deps,
# TODO(zbarsky): This attribute would ideally be called `exec_configured_deps` or similar.
proc_macro_deps = deps + proc_macro_deps,
**kwargs
)

return _wrapped

rust_library = _rule_wrapper(_rust_library)
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_static_library = _rust_static_library
rust_static_library = _rule_wrapper(_rust_static_library)
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_shared_library = _rust_shared_library
rust_shared_library = _rule_wrapper(_rust_shared_library)
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_proc_macro = _rust_proc_macro
rust_proc_macro = _rule_wrapper(_rust_proc_macro)
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_binary = _rust_binary
rust_binary = _rule_wrapper(_rust_binary)
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_library_group = _rust_library_group
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_test = _rust_test
rust_test = _rule_wrapper(_rust_test)
# See @rules_rust//rust/private:rust.bzl for a complete description.

rust_test_suite = _rust_test_suite
Expand All @@ -103,7 +118,7 @@ rust_test_suite = _rust_test_suite
rust_doc = _rust_doc
# See @rules_rust//rust/private:rustdoc.bzl for a complete description.

rust_doc_test = _rust_doc_test
rust_doc_test = _rule_wrapper(_rust_doc_test)
# See @rules_rust//rust/private:rustdoc_test.bzl for a complete description.

clippy_flag = _clippy_flag
Expand Down
69 changes: 26 additions & 43 deletions rust/private/rust.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@ load(
"AllocatorLibrariesImplInfo",
"AllocatorLibrariesInfo",
"BuildInfo",
"CrateInfo",
"CrateGroupInfo",
"DepInfo",
"LintsInfo",
)
load("//rust/private:rustc.bzl", "rustc_compile_action")
Expand All @@ -35,6 +38,7 @@ load(
"determine_lib_name",
"determine_output_hash",
"expand_dict_value_locations",
"filter_deps",
"find_toolchain",
"generate_output_diagnostics",
"get_edition",
Expand All @@ -53,32 +57,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 +126,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 = filter_deps(ctx)

toolchain = find_toolchain(ctx)

Expand Down Expand Up @@ -195,8 +173,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 +216,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 = filter_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 +305,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 = filter_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 @@ -526,16 +504,16 @@ def _rust_library_group_impl(ctx):
runfiles = []

for dep in ctx.attr.deps:
if rust_common.crate_info in dep:
if CrateInfo in dep:
dep_variant_infos.append(rust_common.dep_variant_info(
crate_info = dep[rust_common.crate_info] if rust_common.crate_info in dep else None,
dep_info = dep[rust_common.dep_info] if rust_common.crate_info in dep else None,
crate_info = dep[CrateInfo] if CrateInfo in dep else None,
dep_info = dep[DepInfo] if DepInfo in dep else None,
Copy link
Contributor Author

Choose a reason for hiding this comment

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

cleaned up provider references while I was here and discovered dep_info was cheking for the CrateInfo provider but using DepInfo one :)

build_info = dep[BuildInfo] if BuildInfo in dep else None,
cc_info = dep[CcInfo] if CcInfo in dep else None,
crate_group_info = None,
))
elif rust_common.crate_group_info in dep:
dep_variant_transitive_infos.append(dep[rust_common.crate_group_info].dep_variant_infos)
elif CrateGroupInfo in dep:
dep_variant_transitive_infos.append(dep[CrateGroupInfo].dep_variant_infos)
else:
fail("crate_group_info targets can only depend on rust_library or rust_library_group targets.")

Expand Down Expand Up @@ -724,10 +702,12 @@ _common_attrs = {
# `@local_config_platform//:exec` exposed.
"proc_macro_deps": attr.label_list(
doc = dedent("""\
List of `rust_proc_macro` targets used to help build this library target.
Copy of deps in exec configuration. This should really be called `exec_configured_deps`.

Rule implementations use this to select exec-configured `rust_proc_macro` targets.
User code should pass all deps to `deps` for the macros loaded from `defs.bzl`.
"""),
cfg = "exec",
providers = [rust_common.crate_info],
),
"rustc_env": attr.string_dict(
doc = dedent("""\
Expand Down Expand Up @@ -1330,6 +1310,7 @@ rust_binary_without_process_wrapper = rule(
"_allowlist_function_transition": attr.label(
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
),
"_skip_deps_verification": attr.bool(default = True),
}),
executable = True,
fragments = ["cpp"],
Expand Down Expand Up @@ -1510,7 +1491,7 @@ rust_test = rule(
"""),
)

def rust_test_suite(name, srcs, shared_srcs = [], **kwargs):
def rust_test_suite(name, srcs, shared_srcs = [], deps = [], proc_macro_deps = [], **kwargs):
"""A rule for creating a test suite for a set of `rust_test` targets.

This rule can be used for setting up typical rust [integration tests][it]. Given the following
Expand Down Expand Up @@ -1593,6 +1574,8 @@ def rust_test_suite(name, srcs, shared_srcs = [], **kwargs):
srcs = [src] + shared_srcs,
tags = tags,
crate_name = crate_name,
deps = deps + proc_macro_deps,
proc_macro_deps = deps + proc_macro_deps,
**kwargs
)
tests.append(test_name)
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 `filter_deps(ctx)`.
aliases (dict): A dict mapping aliased targets to their actual Crate information.

Returns:
Expand Down
2 changes: 1 addition & 1 deletion rust/private/rustdoc/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
load("//rust/private:rust.bzl", "rust_binary")
load("//rust:defs.bzl", "rust_binary")

package(default_visibility = ["//visibility:public"])

Expand Down
8 changes: 5 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", "filter_deps", "find_toolchain", "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,10 @@ 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 = filter_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
29 changes: 27 additions & 2 deletions rust/private/utils.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -498,14 +498,39 @@ 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 filter_deps(ctx):
"""Filters the provided (combined) deps into normal deps and proc_macro deps.

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

Returns:
deps and proc_macro_deps
"""
if len(ctx.attr.deps) != len(ctx.attr.proc_macro_deps) and not getattr(ctx.attr, "_skip_deps_verification", False):
fail("All deps should be passed to both `deps` and `proc_macro_deps`; please use the macros in //rust:defs.bzl")

deps = []
for dep in ctx.attr.deps:
if CrateInfo not in dep or dep[CrateInfo].type != "proc-macro":
deps.append(dep)

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

return deps, proc_macro_deps

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

This helper function is used to transform ctx.attr.deps and ctx.attr.proc_macro_deps into
This helper function is used to transform deps and .proc_macro_deps coming from `filter_deps` into
[DepVariantInfo].

Args:
deps (list of Targets): Dependencies coming from ctx.attr.deps or ctx.attr.proc_macro_deps
deps (list of Targets): Dependencies coming from `filter_deps`

Returns:
list of DepVariantInfos.
Expand Down