Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

compiletest: support auxiliaries with auxiliaries #121347

Merged
merged 1 commit into from
Feb 21, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 23 additions & 23 deletions src/tools/compiletest/src/runtest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1936,7 +1936,7 @@ impl<'test> TestCx<'test> {
fn document(&self, out_dir: &Path) -> ProcRes {
if self.props.build_aux_docs {
for rel_ab in &self.props.aux_builds {
let aux_testpaths = self.compute_aux_test_paths(rel_ab);
let aux_testpaths = self.compute_aux_test_paths(&self.testpaths, rel_ab);
let aux_props =
self.props.from_aux_file(&aux_testpaths.file, self.revision, self.config);
let aux_cx = TestCx {
Expand Down Expand Up @@ -2092,24 +2092,18 @@ impl<'test> TestCx<'test> {
proc_res
}

/// For each `aux-build: foo/bar` annotation, we check to find the
/// file in an `auxiliary` directory relative to the test itself.
fn compute_aux_test_paths(&self, rel_ab: &str) -> TestPaths {
let test_ab = self
.testpaths
.file
.parent()
.expect("test file path has no parent")
.join("auxiliary")
.join(rel_ab);
/// For each `aux-build: foo/bar` annotation, we check to find the file in an `auxiliary`
/// directory relative to the test itself (not any intermediate auxiliaries).
fn compute_aux_test_paths(&self, of: &TestPaths, rel_ab: &str) -> TestPaths {
let test_ab =
of.file.parent().expect("test file path has no parent").join("auxiliary").join(rel_ab);
if !test_ab.exists() {
self.fatal(&format!("aux-build `{}` source not found", test_ab.display()))
}

TestPaths {
file: test_ab,
relative_dir: self
.testpaths
relative_dir: of
.relative_dir
.join(self.output_testname_unique())
.join("auxiliary")
Expand All @@ -2135,30 +2129,34 @@ impl<'test> TestCx<'test> {
self.config.target.contains("vxworks") && !self.is_vxworks_pure_static()
}

fn build_all_auxiliary(&self, rustc: &mut Command) -> PathBuf {
fn aux_output_dir(&self) -> PathBuf {
let aux_dir = self.aux_output_dir_name();

if !self.props.aux_builds.is_empty() {
let _ = fs::remove_dir_all(&aux_dir);
create_dir_all(&aux_dir).unwrap();
}

aux_dir
}

fn build_all_auxiliary(&self, of: &TestPaths, aux_dir: &Path, rustc: &mut Command) {
for rel_ab in &self.props.aux_builds {
self.build_auxiliary(rel_ab, &aux_dir);
self.build_auxiliary(of, rel_ab, &aux_dir);
}

for (aux_name, aux_path) in &self.props.aux_crates {
let is_dylib = self.build_auxiliary(&aux_path, &aux_dir);
let is_dylib = self.build_auxiliary(of, &aux_path, &aux_dir);
let lib_name =
get_lib_name(&aux_path.trim_end_matches(".rs").replace('-', "_"), is_dylib);
rustc.arg("--extern").arg(format!("{}={}/{}", aux_name, aux_dir.display(), lib_name));
}

aux_dir
}

fn compose_and_run_compiler(&self, mut rustc: Command, input: Option<String>) -> ProcRes {
let aux_dir = self.build_all_auxiliary(&mut rustc);
let aux_dir = self.aux_output_dir();
self.build_all_auxiliary(&self.testpaths, &aux_dir, &mut rustc);

self.props.unset_rustc_env.iter().fold(&mut rustc, Command::env_remove);
rustc.envs(self.props.rustc_env.clone());
self.compose_and_run(
Expand All @@ -2172,10 +2170,10 @@ impl<'test> TestCx<'test> {
/// Builds an aux dependency.
///
/// Returns whether or not it is a dylib.
fn build_auxiliary(&self, source_path: &str, aux_dir: &Path) -> bool {
let aux_testpaths = self.compute_aux_test_paths(source_path);
fn build_auxiliary(&self, of: &TestPaths, source_path: &str, aux_dir: &Path) -> bool {
let aux_testpaths = self.compute_aux_test_paths(of, source_path);
let aux_props = self.props.from_aux_file(&aux_testpaths.file, self.revision, self.config);
let aux_output = TargetLocation::ThisDirectory(self.aux_output_dir_name());
let aux_output = TargetLocation::ThisDirectory(aux_dir.to_path_buf());
let aux_cx = TestCx {
config: self.config,
props: &aux_props,
Expand All @@ -2193,6 +2191,7 @@ impl<'test> TestCx<'test> {
LinkToAux::No,
Vec::new(),
);
aux_cx.build_all_auxiliary(of, aux_dir, &mut aux_rustc);

for key in &aux_props.unset_rustc_env {
aux_rustc.env_remove(key);
Expand Down Expand Up @@ -3034,7 +3033,8 @@ impl<'test> TestCx<'test> {
LinkToAux::Yes,
Vec::new(),
);
new_rustdoc.build_all_auxiliary(&mut rustc);
let aux_dir = new_rustdoc.aux_output_dir();
new_rustdoc.build_all_auxiliary(&new_rustdoc.testpaths, &aux_dir, &mut rustc);

let proc_res = new_rustdoc.document(&compare_dir);
if !proc_res.status.success() {
Expand Down
14 changes: 14 additions & 0 deletions tests/ui/compiletest-self-test/aux-aux.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//@ aux-crate: aux_aux_foo=aux_aux_foo.rs
//@ aux-crate: aux_aux_bar=aux_aux_bar.rs
//@ edition: 2021
//@ compile-flags: --crate-type lib
//@ check-pass

use aux_aux_foo::Bar as IndirectBar;
use aux_aux_bar::Bar as DirectBar;
davidtwco marked this conversation as resolved.
Show resolved Hide resolved

fn foo(x: IndirectBar) {}

fn main() {
foo(DirectBar);
}
3 changes: 3 additions & 0 deletions tests/ui/compiletest-self-test/auxiliary/aux_aux_bar.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
//@ edition: 2021

pub struct Bar;
4 changes: 4 additions & 0 deletions tests/ui/compiletest-self-test/auxiliary/aux_aux_foo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
//@ aux-crate: aux_aux_bar=aux_aux_bar.rs
davidtwco marked this conversation as resolved.
Show resolved Hide resolved
//@ edition: 2021

pub use aux_aux_bar::Bar;
Loading