Skip to content

Commit 267aa69

Browse files
committed
add rust_analyzer_proc_macro_dylibs and rust_analyzer_build_info_out_dirs output groups
1 parent 4d0b0dd commit 267aa69

File tree

4 files changed

+46
-13
lines changed

4 files changed

+46
-13
lines changed

extensions/prost/private/prost.bzl

+5-1
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,9 @@ def _rust_prost_aspect_impl(target, ctx):
271271
env = dep_variant_info.crate_info.rustc_env,
272272
deps = depset([dep.id for dep in rust_analyzer_deps]).to_list(),
273273
crate_specs = depset(transitive = [dep.crate_specs for dep in rust_analyzer_deps]),
274-
proc_macro_dylib_path = None,
274+
proc_macro_dylibs = depset(transitive = [dep.proc_macro_dylibs for dep in rust_analyzer_deps]),
275+
build_info_out_dirs = depset(transitive = [dep.build_info_out_dirs for dep in rust_analyzer_deps]),
276+
proc_macro_dylib = None,
275277
build_info = dep_variant_info.build_info,
276278
))
277279

@@ -337,6 +339,8 @@ def _rust_prost_library_impl(ctx):
337339
),
338340
RustAnalyzerGroupInfo(
339341
crate_specs = proto_dep[RustAnalyzerInfo].crate_specs,
342+
proc_macro_dylibs = proto_dep[RustAnalyzerInfo].proc_macro_dylibs,
343+
build_script_out_dirs = proto_dep[RustAnalyzerInfo].build_script_out_dirs,
340344
deps = proto_dep[RustAnalyzerInfo].deps,
341345
),
342346
]

rust/private/providers.bzl

+5-1
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,21 @@ RustAnalyzerInfo = provider(
162162
"cfgs": "List[String]: features or other compilation `--cfg` settings",
163163
"crate": "CrateInfo: Crate information.",
164164
"crate_specs": "Depset[File]: transitive closure of OutputGroupInfo files",
165+
"proc_macro_dylibs": "Depset[File]: transitive closure of OutputGroupInfo files",
166+
"build_info_out_dirs": "Depset[File]: transitive closure of OutputGroupInfo files",
165167
"deps": "List[String]: IDs of direct dependency crates",
166168
"env": "Dict[String: String]: Environment variables, used for the `env!` macro",
167169
"id": "String: Arbitrary unique ID for this crate",
168-
"proc_macro_dylib_path": "File: compiled shared library output of proc-macro rule",
170+
"proc_macro_dylib": "File: compiled shared library output of proc-macro rule",
169171
},
170172
)
171173

172174
RustAnalyzerGroupInfo = provider(
173175
doc = "RustAnalyzerGroupInfo holds multiple RustAnalyzerInfos",
174176
fields = {
175177
"crate_specs": "Depset[File]: transitive closure of OutputGroupInfo files",
178+
"proc_macro_dylibs": "Depset[File]: transitive closure of OutputGroupInfo files",
179+
"build_info_out_dirs": "Depset[File]: transitive closure of OutputGroupInfo files",
176180
"deps": "List[String]: crate IDs of direct dependencies",
177181
},
178182
)

rust/private/rust_analyzer.bzl

+35-10
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
4545
RustAnalyzerInfo: Info with the embedded spec file.
4646
"""
4747
crate_spec = ctx.actions.declare_file("{}.rust_analyzer_crate_spec.json".format(owner.name))
48+
proc_macro_dylibs = [base_info.proc_macro_dylib] if base_info.proc_macro_dylib else None
49+
build_info_out_dirs = [base_info.build_info.out_dir] if base_info.build_info != None and base_info.build_info.out_dir != None else None
4850

4951
# Recreate the provider with the spec file embedded in it.
5052
rust_analyzer_info = RustAnalyzerInfo(
@@ -55,7 +57,9 @@ def write_rust_analyzer_spec_file(ctx, attrs, owner, base_info):
5557
deps = base_info.deps,
5658
id = base_info.id,
5759
crate_specs = depset(direct = [crate_spec], transitive = [base_info.crate_specs]),
58-
proc_macro_dylib_path = base_info.proc_macro_dylib_path,
60+
proc_macro_dylibs = depset(direct = proc_macro_dylibs, transitive = [base_info.proc_macro_dylibs]),
61+
build_info_out_dirs = depset(direct = build_info_out_dirs, transitive = [base_info.build_info_out_dirs]),
62+
proc_macro_dylib = base_info.proc_macro_dylib,
5963
build_info = base_info.build_info,
6064
)
6165

@@ -101,23 +105,36 @@ def _rust_analyzer_aspect_impl(target, ctx):
101105
# Gather required info from dependencies.
102106
label_to_id = {} # {Label of dependency => crate_id}
103107
crate_specs = [] # [depset of File - transitive crate_spec.json files]
108+
proc_macro_dylibs = [] # [depset of File - transitive crate_spec.json files]
109+
build_script_out_dirs = [] # [depset of File - transitive crate_spec.json files]
104110
attrs = ctx.rule.attr
105111
all_deps = getattr(attrs, "deps", []) + getattr(attrs, "proc_macro_deps", []) + \
106112
[dep for dep in [getattr(attrs, "crate", None), getattr(attrs, "actual", None)] if dep != None]
107113
for dep in all_deps:
108114
if RustAnalyzerInfo in dep:
109115
label_to_id[dep.label] = dep[RustAnalyzerInfo].id
110116
crate_specs.append(dep[RustAnalyzerInfo].crate_specs)
117+
proc_macro_dylibs.append(dep[RustAnalyzerInfo].proc_macro_dylibs)
118+
build_script_out_dirs.append(dep[RustAnalyzerInfo].build_info_out_dirs)
111119
if RustAnalyzerGroupInfo in dep:
112120
for expanded_dep in dep[RustAnalyzerGroupInfo].deps:
113121
label_to_id[expanded_dep] = expanded_dep
114122
crate_specs.append(dep[RustAnalyzerGroupInfo].crate_specs)
123+
proc_macro_dylibs.append(dep[RustAnalyzerGroupInfo].proc_macro_dylibs)
124+
build_script_out_dirs.append(dep[RustAnalyzerGroupInfo].build_info_out_dirs)
115125

116126
deps = label_to_id.values()
117127
crate_specs = depset(transitive = crate_specs)
128+
proc_macro_dylibs = depset(transitive = proc_macro_dylibs)
129+
build_script_out_dirs = depset(transitive = build_script_out_dirs)
118130

119131
if rust_common.crate_group_info in target:
120-
return [RustAnalyzerGroupInfo(deps = deps, crate_specs = crate_specs)]
132+
return [RustAnalyzerGroupInfo(
133+
deps = deps,
134+
crate_specs = crate_specs,
135+
proc_macro_dylibs = proc_macro_dylibs,
136+
build_info_out_dirs = build_script_out_dirs,
137+
)]
121138
elif rust_common.crate_info in target:
122139
crate_info = target[rust_common.crate_info]
123140
elif rust_common.test_crate_info in target:
@@ -134,6 +151,8 @@ def _rust_analyzer_aspect_impl(target, ctx):
134151
# An arbitrary unique and stable identifier.
135152
crate_id = "ID-" + crate_info.root.path
136153

154+
proc_macro_dylib = find_proc_macro_dylib(toolchain, target)
155+
137156
rust_analyzer_info = write_rust_analyzer_spec_file(ctx, ctx.rule.attr, ctx.label, RustAnalyzerInfo(
138157
id = crate_id,
139158
aliases = aliases,
@@ -142,23 +161,29 @@ def _rust_analyzer_aspect_impl(target, ctx):
142161
env = crate_info.rustc_env,
143162
deps = deps,
144163
crate_specs = crate_specs,
145-
proc_macro_dylib_path = find_proc_macro_dylib_path(toolchain, target),
164+
proc_macro_dylibs = proc_macro_dylibs,
165+
build_info_out_dirs = build_script_out_dirs,
166+
proc_macro_dylib = proc_macro_dylib,
146167
build_info = build_info,
147168
))
148169

149170
return [
150171
rust_analyzer_info,
151-
OutputGroupInfo(rust_analyzer_crate_spec = rust_analyzer_info.crate_specs),
172+
OutputGroupInfo(
173+
rust_analyzer_crate_spec = rust_analyzer_info.crate_specs,
174+
rust_analyzer_proc_macro_dylibs = rust_analyzer_info.proc_macro_dylibs,
175+
rust_analyzer_build_info_out_dirs = rust_analyzer_info.build_info_out_dirs,
176+
),
152177
]
153178

154-
def find_proc_macro_dylib_path(toolchain, target):
155-
"""Find the proc_macro_dylib_path of target. Returns None if target crate is not type proc-macro.
179+
def find_proc_macro_dylib(toolchain, target):
180+
"""Find the proc_macro_dylib of target. Returns None if target crate is not type proc-macro.
156181
157182
Args:
158183
toolchain: The current rust toolchain.
159184
target: The current target.
160185
Returns:
161-
(path): The path to the proc macro dylib, or None if this crate is not a proc-macro.
186+
(File): The path to the proc macro dylib, or None if this crate is not a proc-macro.
162187
"""
163188
if rust_common.crate_info in target:
164189
crate_info = target[rust_common.crate_info]
@@ -174,7 +199,7 @@ def find_proc_macro_dylib_path(toolchain, target):
174199
for action in target.actions:
175200
for output in action.outputs.to_list():
176201
if output.extension == dylib_ext[1:]:
177-
return output.path
202+
return output
178203

179204
# Failed to find the dylib path inside a proc-macro crate.
180205
# TODO: Should this be an error?
@@ -266,8 +291,8 @@ def _create_single_crate(ctx, attrs, info):
266291
crate["cfg"] = info.cfgs
267292
toolchain = find_toolchain(ctx)
268293
crate["target"] = (_EXEC_ROOT_TEMPLATE + toolchain.target_json.path) if toolchain.target_json else toolchain.target_flag_value
269-
if info.proc_macro_dylib_path != None:
270-
crate["proc_macro_dylib_path"] = _EXEC_ROOT_TEMPLATE + info.proc_macro_dylib_path
294+
if info.proc_macro_dylib != None:
295+
crate["proc_macro_dylib_path"] = _EXEC_ROOT_TEMPLATE + info.proc_macro_dylib.path
271296
return crate
272297

273298
def _rust_analyzer_toolchain_impl(ctx):

tools/rust_analyzer/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub fn generate_crate_info(
3636
.arg(format!(
3737
"--aspects={rules_rust}//rust:defs.bzl%rust_analyzer_aspect"
3838
))
39-
.arg("--output_groups=rust_analyzer_crate_spec,rust_generated_srcs")
39+
.arg("--output_groups=rust_analyzer_crate_spec,rust_generated_srcs,rust_analyzer_proc_macro_dylibs,rust_analyzer_build_info_out_dirs")
4040
.args(targets)
4141
.output()?;
4242

0 commit comments

Comments
 (0)