From 56389f36a3e99d374684c74c8dbddd7691023968 Mon Sep 17 00:00:00 2001 From: Igor Matuszewski Date: Mon, 22 Apr 2019 15:04:48 +0200 Subject: [PATCH] compiletest: Disambiguate extern crate deps shared with the compiler --- tests/compile-test.rs | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/tests/compile-test.rs b/tests/compile-test.rs index bafd64e934f..65561b7fbd7 100644 --- a/tests/compile-test.rs +++ b/tests/compile-test.rs @@ -46,9 +46,32 @@ fn config(mode: &str, dir: PathBuf) -> compiletest::Config { config.run_lib_path = rustc_lib_path(); config.compile_lib_path = rustc_lib_path(); } + + // When we'll want to use `extern crate ..` for a dependency that is used + // both by the crate and the compiler itself, we can't simply pass -L flags + // as we'll get a duplicate matching versions. Instead, disambiguate with + // `--extern dep=path`. + // See https://github.com/rust-lang/rust-clippy/issues/4015. + let needs_disambiguation = ["serde"]; + // This assumes that deps are compiled (they are for Cargo integration tests). + let deps = std::fs::read_dir(host_libs().join("deps")).unwrap(); + let disambiguated = deps + .filter_map(|dep| { + let path = dep.ok()?.path(); + let name = path.file_name()?.to_string_lossy(); + // NOTE: This only handles a single dep + // https://github.com/laumann/compiletest-rs/issues/101 + needs_disambiguation + .iter() + .find(|dep| name.starts_with(&format!("lib{}-", dep))) + .map(|dep| format!("--extern {}={}", dep, path.display())) + }) + .collect::>(); + config.target_rustcflags = Some(format!( - "-L {0} -L {0}/deps -Dwarnings -Zui-testing", - host_libs().display() + "-L {0} -L {0}/deps -Dwarnings -Zui-testing {1}", + host_libs().display(), + disambiguated.join(" ") )); config.mode = cfg_mode;