do not add proc-macro deps to transitive_link_search_paths (#1424)
diff --git a/rust/private/rustc.bzl b/rust/private/rustc.bzl
index 7d2c1dc..44b799c 100644
--- a/rust/private/rustc.bzl
+++ b/rust/private/rustc.bzl
@@ -206,8 +206,9 @@
if "proc-macro" not in [crate_info.type, crate_info.wrapped_crate_type]:
transitive_noncrates.append(dep_info.transitive_noncrates)
+ transitive_link_search_paths.append(dep_info.link_search_path_files)
+
transitive_build_infos.append(dep_info.transitive_build_infos)
- transitive_link_search_paths.append(dep_info.link_search_path_files)
elif cc_info:
# This dependency is a cc_library
diff --git a/test/unit/transitive_link_search_paths/BUILD.bazel b/test/unit/transitive_link_search_paths/BUILD.bazel
new file mode 100644
index 0000000..df20a92
--- /dev/null
+++ b/test/unit/transitive_link_search_paths/BUILD.bazel
@@ -0,0 +1,4 @@
+load(":transitive_link_search_paths_test.bzl", "transitive_link_search_paths_test_suite")
+
+############################ UNIT TESTS #############################
+transitive_link_search_paths_test_suite(name = "transitive_link_search_paths_test_suite")
diff --git a/test/unit/transitive_link_search_paths/dep.rs b/test/unit/transitive_link_search_paths/dep.rs
new file mode 100644
index 0000000..cf74a9a
--- /dev/null
+++ b/test/unit/transitive_link_search_paths/dep.rs
@@ -0,0 +1,3 @@
+pub fn f() -> i64 {
+ 42
+}
diff --git a/test/unit/transitive_link_search_paths/dep_build.rs b/test/unit/transitive_link_search_paths/dep_build.rs
new file mode 100644
index 0000000..29fec91
--- /dev/null
+++ b/test/unit/transitive_link_search_paths/dep_build.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("yolo");
+}
diff --git a/test/unit/transitive_link_search_paths/proc_macro.rs b/test/unit/transitive_link_search_paths/proc_macro.rs
new file mode 100644
index 0000000..2803ddb
--- /dev/null
+++ b/test/unit/transitive_link_search_paths/proc_macro.rs
@@ -0,0 +1,8 @@
+extern crate proc_macro;
+
+use proc_macro::TokenStream;
+
+#[proc_macro_attribute]
+pub fn yolo(args: TokenStream, _input: TokenStream) -> TokenStream {
+ args
+}
diff --git a/test/unit/transitive_link_search_paths/proc_macro_build.rs b/test/unit/transitive_link_search_paths/proc_macro_build.rs
new file mode 100644
index 0000000..29fec91
--- /dev/null
+++ b/test/unit/transitive_link_search_paths/proc_macro_build.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("yolo");
+}
diff --git a/test/unit/transitive_link_search_paths/transitive_link_search_paths_test.bzl b/test/unit/transitive_link_search_paths/transitive_link_search_paths_test.bzl
new file mode 100644
index 0000000..ac76547
--- /dev/null
+++ b/test/unit/transitive_link_search_paths/transitive_link_search_paths_test.bzl
@@ -0,0 +1,67 @@
+"""Unittests for rust rules."""
+
+load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
+load("//cargo:defs.bzl", "cargo_build_script")
+load("//rust:defs.bzl", "rust_common", "rust_library", "rust_proc_macro")
+
+def _transitive_link_search_paths_test_impl(ctx):
+ env = analysistest.begin(ctx)
+ tut = analysistest.target_under_test(env)
+ link_search_path_files = tut[rust_common.dep_info].link_search_path_files.to_list()
+ link_search_path_basenames = [f.basename for f in link_search_path_files]
+
+ # Checks that this contains the dep build script, but not the build script
+ # of the dep of the proc_macro.
+ asserts.equals(env, link_search_path_basenames, ["dep_build_script.linksearchpaths"])
+
+ return analysistest.end(env)
+
+transitive_link_search_paths_test = analysistest.make(_transitive_link_search_paths_test_impl)
+
+def _transitive_link_search_paths_test():
+ cargo_build_script(
+ name = "proc_macro_build_script",
+ srcs = ["proc_macro_build.rs"],
+ edition = "2018",
+ )
+
+ rust_proc_macro(
+ name = "proc_macro",
+ srcs = ["proc_macro.rs"],
+ edition = "2018",
+ deps = [":proc_macro_build_script"],
+ )
+
+ cargo_build_script(
+ name = "dep_build_script",
+ srcs = ["dep_build.rs"],
+ edition = "2018",
+ )
+
+ rust_library(
+ name = "dep",
+ srcs = ["dep.rs"],
+ edition = "2018",
+ proc_macro_deps = [":proc_macro"],
+ deps = [":dep_build_script"],
+ )
+
+ transitive_link_search_paths_test(
+ name = "transitive_link_search_paths_test",
+ target_under_test = ":dep",
+ )
+
+def transitive_link_search_paths_test_suite(name):
+ """Entry-point macro called from the BUILD file.
+
+ Args:
+ name: Name of the macro.
+ """
+ _transitive_link_search_paths_test()
+
+ native.test_suite(
+ name = name,
+ tests = [
+ ":transitive_link_search_paths_test",
+ ],
+ )
diff --git a/util/process_wrapper/options.rs b/util/process_wrapper/options.rs
index 5a074a7..f44c70e 100644
--- a/util/process_wrapper/options.rs
+++ b/util/process_wrapper/options.rs
@@ -201,8 +201,13 @@
fn args_from_file(paths: Vec<String>) -> Result<Vec<String>, OptionError> {
let mut args = vec![];
- for path in paths.into_iter() {
- let mut lines = read_file_to_array(path).map_err(OptionError::Generic)?;
+ for path in paths.iter() {
+ let mut lines = read_file_to_array(path).map_err(|err| {
+ OptionError::Generic(format!(
+ "{} while processing args from file paths: {:?}",
+ err, &paths
+ ))
+ })?;
args.append(&mut lines);
}
Ok(args)
@@ -211,7 +216,7 @@
fn env_from_files(paths: Vec<String>) -> Result<HashMap<String, String>, OptionError> {
let mut env_vars = HashMap::new();
for path in paths.into_iter() {
- let lines = read_file_to_array(path).map_err(OptionError::Generic)?;
+ let lines = read_file_to_array(&path).map_err(OptionError::Generic)?;
for line in lines.into_iter() {
let (k, v) = line
.split_once('=')
diff --git a/util/process_wrapper/util.rs b/util/process_wrapper/util.rs
index 4b3d6bb..89f2ded 100644
--- a/util/process_wrapper/util.rs
+++ b/util/process_wrapper/util.rs
@@ -15,8 +15,16 @@
use std::fs::File;
use std::io::{BufRead, BufReader, Read};
-pub(crate) fn read_file_to_array(path: String) -> Result<Vec<String>, String> {
- let file = File::open(path).map_err(|e| e.to_string())?;
+pub(crate) fn read_file_to_array(path: &str) -> Result<Vec<String>, String> {
+ let file = File::open(path).map_err(|e| e.to_string()).map_err(|err| {
+ format!(
+ "{} reading path: {:?}, current directory: {:?}",
+ err,
+ path,
+ std::env::current_dir()
+ )
+ })?;
+
read_to_array(file)
}