Skip to content

Commit f3ba350

Browse files
committed
propagate hax
1 parent 6d532fd commit f3ba350

File tree

6 files changed

+60
-42
lines changed

6 files changed

+60
-42
lines changed

rust/private/rust.bzl

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ load(
3939
"generate_output_diagnostics",
4040
"get_edition",
4141
"get_import_macro_deps",
42+
"partition_deps",
4243
"transform_deps",
4344
"transform_sources",
4445
)
@@ -53,31 +54,6 @@ def _assert_no_deprecated_attributes(_ctx):
5354
"""
5455
pass
5556

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-
)
8157

8258
def _rust_library_impl(ctx):
8359
"""The implementation of the `rust_library` rule.
@@ -148,7 +124,7 @@ def _rust_library_common(ctx, crate_type):
148124
list: A list of providers. See `rustc_compile_action`
149125
"""
150126
_assert_no_deprecated_attributes(ctx)
151-
_assert_correct_dep_mapping(ctx)
127+
deps, proc_macro_deps = partition_deps(ctx)
152128

153129
toolchain = find_toolchain(ctx)
154130

@@ -195,8 +171,8 @@ def _rust_library_common(ctx, crate_type):
195171
not ctx.attr.disable_pipelining
196172
)
197173

198-
deps = transform_deps(ctx.attr.deps)
199-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
174+
deps = transform_deps(deps)
175+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
200176

201177
return rustc_compile_action(
202178
ctx = ctx,
@@ -238,16 +214,16 @@ def _rust_binary_impl(ctx):
238214
"""
239215
toolchain = find_toolchain(ctx)
240216
crate_name = compute_crate_name(ctx.workspace_name, ctx.label, toolchain, ctx.attr.crate_name)
241-
_assert_correct_dep_mapping(ctx)
217+
deps, proc_macro_deps = partition_deps(ctx)
242218

243219
if ctx.attr.binary_name:
244220
output_filename = ctx.attr.binary_name
245221
else:
246222
output_filename = ctx.label.name
247223
output = ctx.actions.declare_file(output_filename + toolchain.binary_ext)
248224

249-
deps = transform_deps(ctx.attr.deps)
250-
proc_macro_deps = transform_deps(ctx.attr.proc_macro_deps + get_import_macro_deps(ctx))
225+
deps = transform_deps(deps)
226+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
251227

252228
crate_root = getattr(ctx.file, "crate_root", None)
253229
if not crate_root:
@@ -327,13 +303,13 @@ def _rust_test_impl(ctx):
327303
list: The list of providers. See `rustc_compile_action`
328304
"""
329305
_assert_no_deprecated_attributes(ctx)
330-
_assert_correct_dep_mapping(ctx)
306+
deps, proc_macro_deps = partition_deps(ctx)
331307

332308
toolchain = find_toolchain(ctx)
333309

334310
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))
311+
deps = transform_deps(deps)
312+
proc_macro_deps = transform_deps(proc_macro_deps + get_import_macro_deps(ctx))
337313

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

1051+
def _exec_transition_impl(_settings, attr):
1052+
return {
1053+
"//command_line_option:is exec configuration": not attr.internal_doctest_transition_override,
1054+
"//command_line_option:stamp": False,
1055+
}
1056+
1057+
_exec_transition = transition(
1058+
inputs = [],
1059+
outputs = [
1060+
"//command_line_option:is exec configuration",
1061+
"//command_line_option:stamp",
1062+
],
1063+
implementation = _exec_transition_impl,
1064+
)
1065+
10751066
def _proc_macro_dep_transition_impl(settings, _attr):
10761067
if settings["//rust/private:is_proc_macro_dep_enabled"]:
10771068
return {"//rust/private:is_proc_macro_dep": True}
@@ -1105,7 +1096,11 @@ rust_proc_macro = rule(
11051096
"""),
11061097
cfg = _proc_macro_dep_transition,
11071098
),
1099+
internal_doctest_transition_override = attr.bool(
1100+
doc = "Used for internal testing; do not set",
1101+
),
11081102
),
1103+
cfg = _exec_transition,
11091104
fragments = ["cpp"],
11101105
toolchains = [
11111106
str(Label("//rust:toolchain_type")),

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 partition_deps(ctx).
233233
aliases (dict): A dict mapping aliased targets to their actual Crate information.
234234
235235
Returns:

rust/private/rustdoc_test.bzl

Lines changed: 4 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", "find_toolchain", "partition_deps", "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,9 @@ 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+
deps, proc_macro_deps = partition_deps(ctx)
114+
deps = transform_deps(deps)
115+
proc_macro_deps = transform_deps(proc_macro_deps)
115116

116117
crate_info = rust_common.create_crate_info(
117118
name = crate.name,

rust/private/utils.bzl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,28 @@ 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+
def partition_deps(ctx):
502+
"""Split deps into normal deps and proc_macro_deps.
503+
504+
Args:
505+
ctx (ctx): The current rule's context object
506+
507+
Returns:
508+
deps, proc_macro_deps
509+
"""
510+
if ctx.attr.proc_macro_deps:
511+
print("`proc_macro_deps` attribute is deprecated; all deps can go in `deps`")
512+
513+
deps = []
514+
proc_macro_deps = []
515+
for dep in ctx.attr.deps + ctx.attr.proc_macro_deps:
516+
if CrateInfo in dep and dep[CrateInfo].type == "proc-macro":
517+
proc_macro_deps.append(dep)
518+
else:
519+
deps.append(dep)
520+
521+
return deps, proc_macro_deps
522+
501523
def transform_deps(deps):
502524
"""Transforms a [Target] into [DepVariantInfo].
503525

test/unit/is_proc_macro_dep/is_proc_macro_dep_test.bzl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ is_proc_macro_dep_is_not_in_env_for_top_level_action_test = analysistest.make(_i
6565
def _is_proc_macro_dep_is_false_for_proc_macro(ctx):
6666
env = analysistest.begin(ctx)
6767
tut = analysistest.target_under_test(env)
68-
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]
68+
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]
6969
asserts.equals(env, proc_macro_dep_action.env["BAZEL_RULES_RUST_IS_PROC_MACRO_DEP"], "0")
7070
return analysistest.end(env)
7171

@@ -83,7 +83,7 @@ is_proc_macro_dep_is_false_for_top_level_library_test = analysistest.make(_is_pr
8383
def _is_proc_macro_dep_is_true_for_proc_macro_dep(ctx):
8484
env = analysistest.begin(ctx)
8585
tut = analysistest.target_under_test(env)
86-
proc_macro_dep_action = [a for a in tut[DepActionsInfo].actions if str(a) == "action 'Compiling Rust rlib proc_macro_dep (1 files)'"][0]
86+
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]
8787
asserts.equals(env, proc_macro_dep_action.env["BAZEL_RULES_RUST_IS_PROC_MACRO_DEP"], "1")
8888
return analysistest.end(env)
8989

test/unit/rustdoc/rustdoc_unit_test.bzl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,7 @@ def _target_maker(rule_fn, name, rustdoc_deps = [], rustdoc_proc_macro_deps = []
190190
rust_doc_test(
191191
name = "{}_doctest".format(name),
192192
crate = ":{}".format(name),
193-
deps = rustdoc_deps,
194-
proc_macro_deps = rustdoc_proc_macro_deps,
193+
deps = rustdoc_deps + rustdoc_proc_macro_deps,
195194
target_compatible_with = NOT_WINDOWS,
196195
)
197196

@@ -241,6 +240,7 @@ def _define_targets():
241240
rust_proc_macro,
242241
name = "rustdoc_proc_macro",
243242
srcs = ["rustdoc_proc_macro.rs"],
243+
internal_doctest_transition_override = True,
244244
)
245245

246246
_target_maker(

0 commit comments

Comments
 (0)