Skip to content

Commit 970e768

Browse files
committed
Improve proc_macro_deps ergonomics
1 parent 6d532fd commit 970e768

File tree

7 files changed

+87
-59
lines changed

7 files changed

+87
-59
lines changed

extensions/wasm_bindgen/private/wasm_bindgen_test.bzl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ load(
1616
"@rules_rust//rust/private:utils.bzl",
1717
"determine_output_hash",
1818
"expand_dict_value_locations",
19+
"filter_deps",
1920
"find_toolchain",
2021
"generate_output_diagnostics",
2122
"get_import_macro_deps",
@@ -67,8 +68,10 @@ def _rust_wasm_bindgen_test_impl(ctx):
6768
toolchain = find_toolchain(ctx)
6869

6970
crate_type = "bin"
70-
deps = transform_deps(ctx.attr.deps + [wb_toolchain.wasm_bindgen_test])
71-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
71+
72+
deps, proc_macro_deps = filter_deps(ctx)
73+
deps = transform_deps(deps + [wb_toolchain.wasm_bindgen_test])
74+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
7275

7376
# Target is building the crate in `test` config
7477
if WasmBindgenTestCrateInfo in ctx.attr.wasm:

rust/defs.bzl

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,25 +76,40 @@ load(
7676
_rust_unpretty_aspect = "rust_unpretty_aspect",
7777
)
7878

79-
rust_library = _rust_library
79+
def _rule_wrapper(rule):
80+
def _wrapped(name, deps = [], proc_macro_deps = [], **kwargs):
81+
if proc_macro_deps:
82+
print("proc_macros can now be passed directly to `deps`, no need to use `proc_macro_deps` in " + native.package_relative_label(name))
83+
84+
rule(
85+
name = name,
86+
deps = deps + proc_macro_deps,
87+
# TODO(zbarsky): This attribute would ideally be called `exec_configured_deps` or similar.
88+
proc_macro_deps = deps + proc_macro_deps,
89+
**kwargs
90+
)
91+
92+
return _wrapped
93+
94+
rust_library = _rule_wrapper(_rust_library)
8095
# See @rules_rust//rust/private:rust.bzl for a complete description.
8196

82-
rust_static_library = _rust_static_library
97+
rust_static_library = _rule_wrapper(_rust_static_library)
8398
# See @rules_rust//rust/private:rust.bzl for a complete description.
8499

85-
rust_shared_library = _rust_shared_library
100+
rust_shared_library = _rule_wrapper(_rust_shared_library)
86101
# See @rules_rust//rust/private:rust.bzl for a complete description.
87102

88-
rust_proc_macro = _rust_proc_macro
103+
rust_proc_macro = _rule_wrapper(_rust_proc_macro)
89104
# See @rules_rust//rust/private:rust.bzl for a complete description.
90105

91-
rust_binary = _rust_binary
106+
rust_binary = _rule_wrapper(_rust_binary)
92107
# See @rules_rust//rust/private:rust.bzl for a complete description.
93108

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

97-
rust_test = _rust_test
112+
rust_test = _rule_wrapper(_rust_test)
98113
# See @rules_rust//rust/private:rust.bzl for a complete description.
99114

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

106-
rust_doc_test = _rust_doc_test
121+
rust_doc_test = _rule_wrapper(_rust_doc_test)
107122
# See @rules_rust//rust/private:rustdoc_test.bzl for a complete description.
108123

109124
clippy_flag = _clippy_flag

rust/private/rust.bzl

Lines changed: 26 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ load(
2222
"AllocatorLibrariesImplInfo",
2323
"AllocatorLibrariesInfo",
2424
"BuildInfo",
25+
"CrateInfo",
26+
"CrateGroupInfo",
27+
"DepInfo",
2528
"LintsInfo",
2629
)
2730
load("//rust/private:rustc.bzl", "rustc_compile_action")
@@ -35,6 +38,7 @@ load(
3538
"determine_lib_name",
3639
"determine_output_hash",
3740
"expand_dict_value_locations",
41+
"filter_deps",
3842
"find_toolchain",
3943
"generate_output_diagnostics",
4044
"get_edition",
@@ -53,32 +57,6 @@ def _assert_no_deprecated_attributes(_ctx):
5357
"""
5458
pass
5559

56-
def _assert_correct_dep_mapping(ctx):
57-
"""Forces a failure if proc_macro_deps and deps are mixed inappropriately
58-
59-
Args:
60-
ctx (ctx): The current rule's context object
61-
"""
62-
for dep in ctx.attr.deps:
63-
if rust_common.crate_info in dep:
64-
if dep[rust_common.crate_info].type == "proc-macro":
65-
fail(
66-
"{} listed {} in its deps, but it is a proc-macro. It should instead be in the bazel property proc_macro_deps.".format(
67-
ctx.label,
68-
dep.label,
69-
),
70-
)
71-
for dep in ctx.attr.proc_macro_deps:
72-
type = dep[rust_common.crate_info].type
73-
if type != "proc-macro":
74-
fail(
75-
"{} listed {} in its proc_macro_deps, but it is not proc-macro, it is a {}. It should probably instead be listed in deps.".format(
76-
ctx.label,
77-
dep.label,
78-
type,
79-
),
80-
)
81-
8260
def _rust_library_impl(ctx):
8361
"""The implementation of the `rust_library` rule.
8462
@@ -148,7 +126,7 @@ def _rust_library_common(ctx, crate_type):
148126
list: A list of providers. See `rustc_compile_action`
149127
"""
150128
_assert_no_deprecated_attributes(ctx)
151-
_assert_correct_dep_mapping(ctx)
129+
deps, proc_macro_deps = filter_deps(ctx)
152130

153131
toolchain = find_toolchain(ctx)
154132

@@ -195,8 +173,8 @@ def _rust_library_common(ctx, crate_type):
195173
not ctx.attr.disable_pipelining
196174
)
197175

198-
deps = transform_deps(ctx.attr.deps)
199-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
176+
deps = transform_deps(deps)
177+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
200178

201179
return rustc_compile_action(
202180
ctx = ctx,
@@ -238,16 +216,16 @@ def _rust_binary_impl(ctx):
238216
"""
239217
toolchain = find_toolchain(ctx)
240218
crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
241-
_assert_correct_dep_mapping(ctx)
219+
deps, proc_macro_deps = filter_deps(ctx)
242220

243221
if ctx.attr.binary_name:
244222
output_filename = ctx.attr.binary_name
245223
else:
246224
output_filename = ctx.label.name
247225
output = ctx.actions.declare_file(output_filename + toolchain.binary_ext)
248226

249-
deps = transform_deps(ctx.attr.deps)
250-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
227+
deps = transform_deps(deps)
228+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
251229

252230
crate_root = getattr(ctx.file, "crate_root", None)
253231
if not crate_root:
@@ -327,13 +305,13 @@ def _rust_test_impl(ctx):
327305
list: The list of providers. See `rustc_compile_action`
328306
"""
329307
_assert_no_deprecated_attributes(ctx)
330-
_assert_correct_dep_mapping(ctx)
308+
deps, proc_macro_deps = filter_deps(ctx)
331309

332310
toolchain = find_toolchain(ctx)
333311

334312
crate_type = "bin"
335-
deps = transform_deps(ctx.attr.deps)
336-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
313+
deps = transform_deps(deps)
314+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
337315

338316
if ctx.attr.crate and ctx.attr.srcs:
339317
fail("rust_test.crate and rust_test.srcs are mutually exclusive. Update {} to use only one of these attributes".format(
@@ -526,16 +504,16 @@ def _rust_library_group_impl(ctx):
526504
runfiles = []
527505

528506
for dep in ctx.attr.deps:
529-
if rust_common.crate_info in dep:
507+
if CrateInfo in dep:
530508
dep_variant_infos.append(rust_common.dep_variant_info(
531-
crate_info = dep[rust_common.crate_info] if rust_common.crate_info in dep else None,
532-
dep_info = dep[rust_common.dep_info] if rust_common.crate_info in dep else None,
509+
crate_info = dep[CrateInfo] if CrateInfo in dep else None,
510+
dep_info = dep[DepInfo] if DepInfo in dep else None,
533511
build_info = dep[BuildInfo] if BuildInfo in dep else None,
534512
cc_info = dep[CcInfo] if CcInfo in dep else None,
535513
crate_group_info = None,
536514
))
537-
elif rust_common.crate_group_info in dep:
538-
dep_variant_transitive_infos.append(dep[rust_common.crate_group_info].dep_variant_infos)
515+
elif CrateGroupInfo in dep:
516+
dep_variant_transitive_infos.append(dep[CrateGroupInfo].dep_variant_infos)
539517
else:
540518
fail("crate_group_info targets can only depend on rust_library or rust_library_group targets.")
541519

@@ -724,10 +702,12 @@ _common_attrs = {
724702
# `@local_config_platform//:exec` exposed.
725703
"proc_macro_deps": attr.label_list(
726704
doc = dedent("""\
727-
List of `rust_proc_macro` targets used to help build this library target.
705+
Copy of deps in exec configuration. This should really be called `exec_configured_deps`.
706+
707+
Rule implementations use this to select exec-configured `rust_proc_macro` targets.
708+
User code should pass all deps to `deps` for the macros loaded from `defs.bzl`.
728709
"""),
729710
cfg = "exec",
730-
providers = [rust_common.crate_info],
731711
),
732712
"rustc_env": attr.string_dict(
733713
doc = dedent("""\
@@ -1330,6 +1310,7 @@ rust_binary_without_process_wrapper = rule(
13301310
"_allowlist_function_transition": attr.label(
13311311
default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
13321312
),
1313+
"_skip_deps_verification": attr.bool(default = True),
13331314
}),
13341315
executable = True,
13351316
fragments = ["cpp"],
@@ -1510,7 +1491,7 @@ rust_test = rule(
15101491
"""),
15111492
)
15121493

1513-
def rust_test_suite(name, srcs, shared_srcs = [], **kwargs):
1494+
def rust_test_suite(name, srcs, shared_srcs = [], deps = [], proc_macro_deps = [], **kwargs):
15141495
"""A rule for creating a test suite for a set of `rust_test` targets.
15151496
15161497
This rule can be used for setting up typical rust [integration tests][it]. Given the following
@@ -1593,6 +1574,8 @@ def rust_test_suite(name, srcs, shared_srcs = [], **kwargs):
15931574
srcs = [src] + shared_srcs,
15941575
tags = tags,
15951576
crate_name = crate_name,
1577+
deps = deps + proc_macro_deps,
1578+
proc_macro_deps = deps + proc_macro_deps,
15961579
**kwargs
15971580
)
15981581
tests.append(test_name)

rust/private/rustc.bzl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ def collect_deps(
229229
230230
Args:
231231
deps (list): The deps from ctx.attr.deps.
232-
proc_macro_deps (list): The proc_macro deps from ctx.attr.proc_macro_deps.
232+
proc_macro_deps (list): The proc_macro deps from `filter_deps(ctx)`.
233233
aliases (dict): A dict mapping aliased targets to their actual Crate information.
234234
235235
Returns:

rust/private/rustdoc/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
load("//rust/private:rust.bzl", "rust_binary")
1+
load("//rust:defs.bzl", "rust_binary")
22

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

rust/private/rustdoc_test.bzl

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ load("@rules_cc//cc/common:cc_info.bzl", "CcInfo")
1818
load("//rust/private:common.bzl", "rust_common")
1919
load("//rust/private:providers.bzl", "CrateInfo")
2020
load("//rust/private:rustdoc.bzl", "rustdoc_compile_action")
21-
load("//rust/private:utils.bzl", "dedent", "find_toolchain", "transform_deps")
21+
load("//rust/private:utils.bzl", "dedent", "filter_deps", "find_toolchain", "transform_deps")
2222

2323
def _construct_writer_arguments(ctx, test_runner, opt_test_params, action, crate_info):
2424
"""Construct arguments and environment variables specific to `rustdoc_test_writer`.
@@ -110,8 +110,10 @@ def _rust_doc_test_impl(ctx):
110110
toolchain = find_toolchain(ctx)
111111

112112
crate = ctx.attr.crate[rust_common.crate_info]
113-
deps = transform_deps(ctx.attr.deps)
114-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps)
113+
114+
deps, proc_macro_deps = filter_deps(ctx)
115+
deps = transform_deps(deps)
116+
proc_macro_deps = transform_deps(proc_macro_deps)
115117

116118
crate_info = rust_common.create_crate_info(
117119
name = crate.name,

rust/private/utils.bzl

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -498,14 +498,39 @@ def is_exec_configuration(ctx):
498498
# TODO(djmarcin): Is there any better way to determine cfg=exec?
499499
return ctx.genfiles_dir.path.find("-exec") != -1
500500

501+
502+
def filter_deps(ctx):
503+
"""Filters the provided (combined) deps into normal deps and proc_macro deps.
504+
505+
Args:
506+
ctx (ctx): The current rule's context object
507+
508+
Returns:
509+
deps and proc_macro_deps
510+
"""
511+
if len(ctx.attr.deps) != len(ctx.attr.proc_macro_deps) and not getattr(ctx.attr, "_skip_deps_verification", False):
512+
fail("All deps should be passed to both `deps` and `proc_macro_deps`; please use the macros in //rust:defs.bzl")
513+
514+
deps = []
515+
for dep in ctx.attr.deps:
516+
if CrateInfo not in dep or dep[CrateInfo].type != "proc-macro":
517+
deps.append(dep)
518+
519+
proc_macro_deps = []
520+
for dep in ctx.attr.proc_macro_deps:
521+
if CrateInfo in dep and dep[CrateInfo].type == "proc-macro":
522+
proc_macro_deps.append(dep)
523+
524+
return deps, proc_macro_deps
525+
501526
def transform_deps(deps):
502527
"""Transforms a [Target] into [DepVariantInfo].
503528
504-
This helper function is used to transform ctx.attr.deps and ctx.attr.proc_macro_deps into
529+
This helper function is used to transform deps and .proc_macro_deps coming from `filter_deps` into
505530
[DepVariantInfo].
506531
507532
Args:
508-
deps (list of Targets): Dependencies coming from ctx.attr.deps or ctx.attr.proc_macro_deps
533+
deps (list of Targets): Dependencies coming from `filter_deps`
509534
510535
Returns:
511536
list of DepVariantInfos.

0 commit comments

Comments
 (0)