Skip to content

Commit f513424

Browse files
authored
Merge branch 'main' into cargo-build-cflags
2 parents e7056eb + c435cf4 commit f513424

File tree

7 files changed

+54
-23
lines changed

7 files changed

+54
-23
lines changed

cargo/cargo_build_script.bzl

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ def _build_script_impl(ctx):
5959
dep_env_out = ctx.actions.declare_file(ctx.label.name + ".depenv")
6060
flags_out = ctx.actions.declare_file(ctx.label.name + ".flags")
6161
link_flags = ctx.actions.declare_file(ctx.label.name + ".linkflags")
62+
link_search_paths = ctx.actions.declare_file(ctx.label.name + ".linksearchpaths") # rustc-link-search, propagated from transitive dependencies
6263
manifest_dir = "%s.runfiles/%s/%s" % (script.path, ctx.label.workspace_name or ctx.workspace_name, ctx.label.package)
6364
compilation_mode_opt_level = get_compilation_mode_opts(ctx, toolchain).opt_level
6465

@@ -175,6 +176,7 @@ def _build_script_impl(ctx):
175176
env_out.path,
176177
flags_out.path,
177178
link_flags.path,
179+
link_search_paths.path,
178180
dep_env_out.path,
179181
streams.stdout.path,
180182
streams.stderr.path,
@@ -191,7 +193,7 @@ def _build_script_impl(ctx):
191193
ctx.actions.run(
192194
executable = ctx.executable._cargo_build_script_runner,
193195
arguments = [args],
194-
outputs = [out_dir, env_out, flags_out, link_flags, dep_env_out, streams.stdout, streams.stderr],
196+
outputs = [out_dir, env_out, flags_out, link_flags, link_search_paths, dep_env_out, streams.stdout, streams.stderr],
195197
tools = tools,
196198
inputs = build_script_inputs,
197199
mnemonic = "CargoBuildScriptRun",
@@ -206,6 +208,7 @@ def _build_script_impl(ctx):
206208
dep_env = dep_env_out,
207209
flags = flags_out,
208210
link_flags = link_flags,
211+
link_search_paths = link_search_paths,
209212
),
210213
OutputGroupInfo(streams = depset([streams.stdout, streams.stderr])),
211214
]

cargo/cargo_build_script_runner/bin.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ fn run_buildrs() -> Result<(), String> {
4141
env_file,
4242
compile_flags_file,
4343
link_flags_file,
44+
link_search_paths_file,
4445
output_dep_env_path,
4546
stdout_path,
4647
stderr_path,
@@ -162,12 +163,15 @@ fn run_buildrs() -> Result<(), String> {
162163
let CompileAndLinkFlags {
163164
compile_flags,
164165
link_flags,
166+
link_search_paths,
165167
} = BuildScriptOutput::outputs_to_flags(&buildrs_outputs, &exec_root.to_string_lossy());
166168

167169
write(&compile_flags_file, compile_flags.as_bytes())
168170
.unwrap_or_else(|_| panic!("Unable to write file {:?}", compile_flags_file));
169171
write(&link_flags_file, link_flags.as_bytes())
170172
.unwrap_or_else(|_| panic!("Unable to write file {:?}", link_flags_file));
173+
write(&link_search_paths_file, link_search_paths.as_bytes())
174+
.unwrap_or_else(|_| panic!("Unable to write file {:?}", link_search_paths_file));
171175
Ok(())
172176
}
173177

@@ -179,6 +183,7 @@ struct Options {
179183
env_file: String,
180184
compile_flags_file: String,
181185
link_flags_file: String,
186+
link_search_paths_file: String,
182187
output_dep_env_path: String,
183188
stdout_path: String,
184189
stderr_path: String,
@@ -190,14 +195,15 @@ fn parse_args() -> Result<Options, String> {
190195
let mut args = env::args().skip(1);
191196

192197
// TODO: we should consider an alternative to positional arguments.
193-
match (args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next()) {
198+
match (args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next(), args.next()) {
194199
(
195200
Some(progname),
196201
Some(crate_links),
197202
Some(out_dir),
198203
Some(env_file),
199204
Some(compile_flags_file),
200205
Some(link_flags_file),
206+
Some(link_search_paths_file),
201207
Some(output_dep_env_path),
202208
Some(stdout_path),
203209
Some(stderr_path),
@@ -209,14 +215,15 @@ fn parse_args() -> Result<Options, String> {
209215
env_file,
210216
compile_flags_file,
211217
link_flags_file,
218+
link_search_paths_file,
212219
output_dep_env_path,
213220
stdout_path,
214221
stderr_path,
215222
input_dep_env_paths: args.collect(),
216223
})
217224
}
218225
_ => {
219-
Err(format!("Usage: $0 progname crate_links out_dir env_file compile_flags_file link_flags_file output_dep_env_path stdout_path stderr_path input_dep_env_paths[arg1...argn]\nArguments passed: {:?}", args.collect::<Vec<String>>()))
226+
Err(format!("Usage: $0 progname crate_links out_dir env_file compile_flags_file link_flags_file link_search_paths_file output_dep_env_path stdout_path stderr_path input_dep_env_paths[arg1...argn]\nArguments passed: {:?}", args.collect::<Vec<String>>()))
220227
}
221228
}
222229
}

cargo/cargo_build_script_runner/lib.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use std::process::{Command, Output};
2121
pub struct CompileAndLinkFlags {
2222
pub compile_flags: String,
2323
pub link_flags: String,
24+
pub link_search_paths: String,
2425
}
2526

2627
/// Enum containing all the considered return value from the script
@@ -171,20 +172,23 @@ impl BuildScriptOutput {
171172
pub fn outputs_to_flags(outputs: &[BuildScriptOutput], exec_root: &str) -> CompileAndLinkFlags {
172173
let mut compile_flags = Vec::new();
173174
let mut link_flags = Vec::new();
175+
let mut link_search_paths = Vec::new();
174176

175177
for flag in outputs {
176178
match flag {
177179
BuildScriptOutput::Cfg(e) => compile_flags.push(format!("--cfg={}", e)),
178180
BuildScriptOutput::Flags(e) => compile_flags.push(e.to_owned()),
179181
BuildScriptOutput::LinkArg(e) => compile_flags.push(format!("-Clink-arg={}", e)),
180182
BuildScriptOutput::LinkLib(e) => link_flags.push(format!("-l{}", e)),
181-
BuildScriptOutput::LinkSearch(e) => link_flags.push(format!("-L{}", e)),
183+
BuildScriptOutput::LinkSearch(e) => link_search_paths.push(format!("-L{}", e)),
182184
_ => {}
183185
}
184186
}
187+
185188
CompileAndLinkFlags {
186189
compile_flags: compile_flags.join("\n"),
187190
link_flags: Self::redact_exec_root(&link_flags.join("\n"), exec_root),
191+
link_search_paths: Self::redact_exec_root(&link_search_paths.join("\n"), exec_root),
188192
}
189193
}
190194

@@ -279,7 +283,8 @@ cargo:rustc-link-arg=Metal
279283
compile_flags:
280284
"-Lblah\n--cfg=feature=awesome\n-Clink-arg=-weak_framework\n-Clink-arg=Metal"
281285
.to_owned(),
282-
link_flags: "-lsdfsdf\n-L${pwd}/bleh".to_owned(),
286+
link_flags: "-lsdfsdf".to_owned(),
287+
link_search_paths: "-L${pwd}/bleh".to_owned(),
283288
}
284289
);
285290
}

docs/flatten.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1386,8 +1386,8 @@ A provider containing general Crate information.
13861386
## DepInfo
13871387

13881388
<pre>
1389-
DepInfo(<a href="#DepInfo-dep_env">dep_env</a>, <a href="#DepInfo-direct_crates">direct_crates</a>, <a href="#DepInfo-transitive_build_infos">transitive_build_infos</a>, <a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>,
1390-
<a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
1389+
DepInfo(<a href="#DepInfo-dep_env">dep_env</a>, <a href="#DepInfo-direct_crates">direct_crates</a>, <a href="#DepInfo-link_search_path_files">link_search_path_files</a>, <a href="#DepInfo-transitive_build_infos">transitive_build_infos</a>,
1390+
<a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>, <a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
13911391
</pre>
13921392

13931393
A provider containing information about a Crate's dependencies.
@@ -1399,6 +1399,7 @@ A provider containing information about a Crate's dependencies.
13991399
| :------------- | :------------- |
14001400
| <a id="DepInfo-dep_env"></a>dep_env | File: File with environment variables direct dependencies build scripts rely upon. |
14011401
| <a id="DepInfo-direct_crates"></a>direct_crates | depset[AliasableDepInfo] |
1402+
| <a id="DepInfo-link_search_path_files"></a>link_search_path_files | depset[File]: All transitive files containing search paths to pass to the linker |
14021403
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
14031404
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
14041405
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |

docs/providers.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ A provider containing general Crate information.
4242
## DepInfo
4343

4444
<pre>
45-
DepInfo(<a href="#DepInfo-dep_env">dep_env</a>, <a href="#DepInfo-direct_crates">direct_crates</a>, <a href="#DepInfo-transitive_build_infos">transitive_build_infos</a>, <a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>,
46-
<a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
45+
DepInfo(<a href="#DepInfo-dep_env">dep_env</a>, <a href="#DepInfo-direct_crates">direct_crates</a>, <a href="#DepInfo-link_search_path_files">link_search_path_files</a>, <a href="#DepInfo-transitive_build_infos">transitive_build_infos</a>,
46+
<a href="#DepInfo-transitive_crate_outputs">transitive_crate_outputs</a>, <a href="#DepInfo-transitive_crates">transitive_crates</a>, <a href="#DepInfo-transitive_noncrates">transitive_noncrates</a>)
4747
</pre>
4848

4949
A provider containing information about a Crate's dependencies.
@@ -55,6 +55,7 @@ A provider containing information about a Crate's dependencies.
5555
| :------------- | :------------- |
5656
| <a id="DepInfo-dep_env"></a>dep_env | File: File with environment variables direct dependencies build scripts rely upon. |
5757
| <a id="DepInfo-direct_crates"></a>direct_crates | depset[AliasableDepInfo] |
58+
| <a id="DepInfo-link_search_path_files"></a>link_search_path_files | depset[File]: All transitive files containing search paths to pass to the linker |
5859
| <a id="DepInfo-transitive_build_infos"></a>transitive_build_infos | depset[BuildInfo] |
5960
| <a id="DepInfo-transitive_crate_outputs"></a>transitive_crate_outputs | depset[File]: All transitive crate outputs. |
6061
| <a id="DepInfo-transitive_crates"></a>transitive_crates | depset[CrateInfo] |

rust/private/providers.bzl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ DepInfo = provider(
4545
fields = {
4646
"dep_env": "File: File with environment variables direct dependencies build scripts rely upon.",
4747
"direct_crates": "depset[AliasableDepInfo]",
48+
"link_search_path_files": "depset[File]: All transitive files containing search paths to pass to the linker",
4849
"transitive_build_infos": "depset[BuildInfo]",
4950
"transitive_crate_outputs": "depset[File]: All transitive crate outputs.",
5051
"transitive_crates": "depset[CrateInfo]",
@@ -58,6 +59,7 @@ BuildInfo = provider(
5859
"dep_env": "File: extra build script environment varibles to be set to direct dependencies.",
5960
"flags": "File: file containing additional flags to pass to rustc",
6061
"link_flags": "File: file containing flags to pass to the linker",
62+
"link_search_paths": "File: file containing search paths to pass to the linker",
6163
"out_dir": "File: directory containing the result of a build script",
6264
"rustc_env": "File: file containing additional environment variables to set for rustc.",
6365
},

rust/private/rustc.bzl

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ def collect_deps(
141141
transitive_crates = []
142142
transitive_noncrates = []
143143
transitive_build_infos = []
144+
transitive_link_search_paths = []
144145
build_info = None
145146
linkstamps = []
146147
transitive_crate_outputs = []
@@ -175,6 +176,8 @@ def collect_deps(
175176
)
176177
transitive_noncrates.append(dep_info.transitive_noncrates)
177178
transitive_build_infos.append(dep_info.transitive_build_infos)
179+
transitive_link_search_paths.append(dep_info.link_search_path_files)
180+
178181
elif cc_info:
179182
# This dependency is a cc_library
180183
transitive_noncrates.append(cc_info.linking_context.linker_inputs)
@@ -184,6 +187,7 @@ def collect_deps(
184187
"only one is allowed in the dependencies")
185188
build_info = dep_build_info
186189
transitive_build_infos.append(depset([build_info]))
190+
transitive_link_search_paths.append(depset([build_info.link_search_paths]))
187191
else:
188192
fail("rust targets can only depend on rust_library, rust_*_library or cc_library " +
189193
"targets.")
@@ -200,6 +204,7 @@ def collect_deps(
200204
),
201205
transitive_crate_outputs = depset(transitive = transitive_crate_outputs),
202206
transitive_build_infos = depset(transitive = transitive_build_infos),
207+
link_search_path_files = depset(transitive = transitive_link_search_paths),
203208
dep_env = build_info.dep_env if build_info else None,
204209
),
205210
build_info,
@@ -298,23 +303,24 @@ def get_linker_and_args(ctx, attr, cc_toolchain, feature_configuration, rpaths):
298303

299304
def _process_build_scripts(
300305
build_info,
306+
dep_info,
301307
compile_inputs):
302308
"""Gathers the outputs from a target's `cargo_build_script` action.
303309
304310
Args:
305311
build_info (BuildInfo): The target Build's dependency info.
312+
dep_info (DepInfo): The Depinfo provider form the target Crate's set of inputs.
306313
compile_inputs (depset): A set of all files that will participate in the build.
307314
308315
Returns:
309316
tuple: A tuple: A tuple of the following items:
310-
- (list): A list of all build info `OUT_DIR` File objects
317+
- (depset[File]): A list of all build info `OUT_DIR` File objects
311318
- (str): The `OUT_DIR` of the current build info
312319
- (File): An optional path to a generated environment file from a `cargo_build_script` target
313-
- (list): All direct and transitive build flags from the current build info.
320+
- (depset[File]): All direct and transitive build flags from the current build info.
314321
"""
315-
extra_inputs, out_dir, build_env_file, build_flags_files = _create_extra_input_args(build_info)
316-
if extra_inputs:
317-
compile_inputs = depset(extra_inputs, transitive = [compile_inputs])
322+
extra_inputs, out_dir, build_env_file, build_flags_files = _create_extra_input_args(build_info, dep_info)
323+
compile_inputs = depset(transitive = [extra_inputs, compile_inputs])
318324
return compile_inputs, out_dir, build_env_file, build_flags_files
319325

320326
def collect_inputs(
@@ -350,7 +356,7 @@ def collect_inputs(
350356
- (list): A list of all build info `OUT_DIR` File objects
351357
- (str): The `OUT_DIR` of the current build info
352358
- (File): An optional path to a generated environment file from a `cargo_build_script` target
353-
- (list): All direct and transitive build flags from the current build info
359+
- (depset[File]): All direct and transitive build flag files from the current build info
354360
- (list[File]): Linkstamp outputs.
355361
"""
356362
linker_script = getattr(file, "linker_script") if hasattr(file, "linker_script") else None
@@ -432,7 +438,7 @@ def collect_inputs(
432438
)
433439

434440
build_env_files = getattr(files, "rustc_env_files", [])
435-
compile_inputs, out_dir, build_env_file, build_flags_files = _process_build_scripts(build_info, compile_inputs)
441+
compile_inputs, out_dir, build_env_file, build_flags_files = _process_build_scripts(build_info, dep_info, compile_inputs)
436442
if build_env_file:
437443
build_env_files = [f for f in build_env_files] + [build_env_file]
438444
compile_inputs = depset(build_env_files, transitive = [compile_inputs])
@@ -477,7 +483,7 @@ def construct_arguments(
477483
rust_flags (list): Additional flags to pass to rustc
478484
out_dir (str): The path to the output directory for the target Crate.
479485
build_env_files (list): Files containing rustc environment variables, for instance from `cargo_build_script` actions.
480-
build_flags_files (list): The output files of a `cargo_build_script` actions containing rustc build flags
486+
build_flags_files (depset): The output files of a `cargo_build_script` actions containing rustc build flags
481487
emit (list): Values for the --emit flag to rustc.
482488
force_all_deps_direct (bool, optional): Whether to pass the transitive rlibs with --extern
483489
to the commandline as opposed to -L.
@@ -925,18 +931,19 @@ def add_edition_flags(args, crate):
925931
if crate.edition != "2015":
926932
args.add("--edition={}".format(crate.edition))
927933

928-
def _create_extra_input_args(build_info):
934+
def _create_extra_input_args(build_info, dep_info):
929935
"""Gather additional input arguments from transitive dependencies
930936
931937
Args:
932938
build_info (BuildInfo): The BuildInfo provider from the target Crate's set of inputs.
939+
dep_info (DepInfo): The Depinfo provider form the target Crate's set of inputs.
933940
934941
Returns:
935942
tuple: A tuple of the following items:
936-
- (list): A list of all build info `OUT_DIR` File objects
943+
- (depset[File]): A list of all build info `OUT_DIR` File objects
937944
- (str): The `OUT_DIR` of the current build info
938945
- (File): An optional generated environment file from a `cargo_build_script` target
939-
- (list): All direct and transitive build flags from the current build info.
946+
- (depset[File]): All direct and transitive build flag files from the current build info.
940947
"""
941948
input_files = []
942949

@@ -949,12 +956,17 @@ def _create_extra_input_args(build_info):
949956
if build_info:
950957
out_dir = build_info.out_dir.path
951958
build_env_file = build_info.rustc_env
952-
build_flags_files.append(build_info.flags.path)
953-
build_flags_files.append(build_info.link_flags.path)
959+
build_flags_files.append(build_info.flags)
960+
build_flags_files.append(build_info.link_flags)
954961
input_files.append(build_info.out_dir)
955962
input_files.append(build_info.link_flags)
956963

957-
return input_files, out_dir, build_env_file, build_flags_files
964+
return (
965+
depset(input_files, transitive = [dep_info.link_search_path_files]),
966+
out_dir,
967+
build_env_file,
968+
depset(build_flags_files, transitive = [dep_info.link_search_path_files]),
969+
)
958970

959971
def _compute_rpaths(toolchain, output_dir, dep_info):
960972
"""Determine the artifact's rpaths relative to the bazel root for runtime linking of shared libraries.

0 commit comments

Comments
 (0)