Skip to content

Commit 7e5c4bc

Browse files
committed
propagate hax
1 parent 6d532fd commit 7e5c4bc

File tree

5 files changed

+114
-40
lines changed

5 files changed

+114
-40
lines changed

rust/private/rust.bzl

Lines changed: 85 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,80 @@ rust_shared_library = rule(
10721048
"""),
10731049
)
10741050

1051+
# See https://github.com/bazelbuild/bazel/blob/952a7580c3fcf913371019238ef06611cead4857/src/main/starlark/builtins_bzl/common/builtin_exec_platforms.bzl#L219-L282
1052+
_EXEC_TRANSITION_PROPAGATED = [
1053+
#"//command_line_option:experimental_output_directory_naming_scheme",
1054+
"//command_line_option:host_compilation_mode",
1055+
#"//command_line_option:experimental_exec_configuration_distinguisher",
1056+
#"//command_line_option:experimental_output_paths",
1057+
"//command_line_option:enable_runfiles",
1058+
"//command_line_option:enforce_constraints",
1059+
#"//command_line_option:incompatible_merge_genfiles_directory",
1060+
#"//command_line_option:experimental_platform_in_output_dir",
1061+
"//command_line_option:host_cpu",
1062+
#"//command_line_option:incompatible_modify_execution_info_additive",
1063+
"//command_line_option:include_config_fragments_provider",
1064+
#"//command_line_option:experimental_debug_selects_always_succeed",
1065+
#"//command_line_option:incompatible_check_testonly_for_output_files",
1066+
#"//command_line_option:incompatible_auto_exec_groups",
1067+
#"//command_line_option:incompatible_bazel_test_exec_run_under",
1068+
#"//command_line_option:experimental_writable_outputs",
1069+
"//command_line_option:build_runfile_manifests",
1070+
"//command_line_option:build_runfile_links",
1071+
#"//command_line_option:experimental_remotable_source_manifests",
1072+
#"//command_line_option:incompatible_always_include_files_in_data",
1073+
#"//command_line_option:experimental_strict_fileset_output",
1074+
"//command_line_option:strict_filesets",
1075+
"//command_line_option:check_visibility",
1076+
"//command_line_option:check_licenses",
1077+
"//command_line_option:host_features",
1078+
"//command_line_option:host_action_env",
1079+
"//command_line_option:archived_tree_artifact_mnemonics_filter",
1080+
"//command_line_option:allow_unresolved_symlinks",
1081+
#"//command_line_option:experimental_exec_config",
1082+
#"//command_line_option:experimental_exclude_defines_from_exec_config",
1083+
#"//command_line_option:experimental_exclude_starlark_flags_from_exec_config",
1084+
#"//command_line_option:experimental_propagate_custom_flag",
1085+
"//command_line_option:allow_analysis_failures",
1086+
#"//command_line_option:experimental_collect_code_coverage_for_generated_files",
1087+
#"//command_line_option:experimental_extended_sanity_checks",
1088+
#"//command_line_option:experimental_inprocess_symlink_creation",
1089+
#"//command_line_option:experimental_throttle_action_cache_check",
1090+
#"//command_line_option:experimental_use_platforms_in_output_dir_legacy_heuristic",
1091+
#"//command_line_option:incompatible_compact_repo_mapping_manifest",
1092+
#"//command_line_option:incompatible_filegroup_runfiles_for_data",
1093+
]
1094+
1095+
def _exec_transition_impl(settings, _attr):
1096+
transitioned = {
1097+
"//command_line_option:compilation_mode": settings["//command_line_option:host_compilation_mode"],
1098+
"//command_line_option:is exec configuration": True,
1099+
"//command_line_option:cpu": settings["//command_line_option:host_cpu"],
1100+
"//command_line_option:stamp": False,
1101+
"//command_line_option:action_env": settings["//command_line_option:host_action_env"],
1102+
"//command_line_option:features": settings["//command_line_option:host_features"],
1103+
}
1104+
1105+
for opt in _EXEC_TRANSITION_PROPAGATED:
1106+
transitioned[opt] = settings[opt]
1107+
1108+
return transitioned
1109+
1110+
_exec_transition = transition(
1111+
inputs = [
1112+
"//command_line_option:features",
1113+
] + _EXEC_TRANSITION_PROPAGATED,
1114+
outputs = [
1115+
"//command_line_option:compilation_mode",
1116+
"//command_line_option:is exec configuration",
1117+
"//command_line_option:cpu",
1118+
"//command_line_option:stamp",
1119+
"//command_line_option:features",
1120+
"//command_line_option:action_env",
1121+
] + _EXEC_TRANSITION_PROPAGATED,
1122+
implementation = _exec_transition_impl,
1123+
)
1124+
10751125
def _proc_macro_dep_transition_impl(settings, _attr):
10761126
if settings["//rust/private:is_proc_macro_dep_enabled"]:
10771127
return {"//rust/private:is_proc_macro_dep": True}
@@ -1106,6 +1156,7 @@ rust_proc_macro = rule(
11061156
cfg = _proc_macro_dep_transition,
11071157
),
11081158
),
1159+
cfg = _exec_transition,
11091160
fragments = ["cpp"],
11101161
toolchains = [
11111162
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

0 commit comments

Comments
 (0)