Skip to content

Commit

Permalink
add unstable -Zroot-path flag to configure the path from which rustc …
Browse files Browse the repository at this point in the history
…should be invoked
  • Loading branch information
RalfJung committed Oct 31, 2024
1 parent 06e0ef4 commit ad2636d
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 15 deletions.
11 changes: 11 additions & 0 deletions src/cargo/core/features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@
use std::collections::BTreeSet;
use std::env;
use std::fmt::{self, Write};
use std::path::PathBuf;
use std::str::FromStr;

use anyhow::{bail, Error};
Expand Down Expand Up @@ -783,6 +784,7 @@ unstable_cli_options!(
profile_rustflags: bool = ("Enable the `rustflags` option in profiles in .cargo/config.toml file"),
public_dependency: bool = ("Respect a dependency's `public` field in Cargo.toml to control public/private dependencies"),
publish_timeout: bool = ("Enable the `publish.timeout` key in .cargo/config.toml file"),
root_dir: Option<PathBuf> = ("Set the root directory relative to which paths are printed (defaults to workspace root)"),
rustdoc_map: bool = ("Allow passing external documentation mappings to rustdoc"),
rustdoc_scrape_examples: bool = ("Allows Rustdoc to scrape code examples from reverse-dependencies"),
script: bool = ("Enable support for single-file, `.rs` packages"),
Expand Down Expand Up @@ -1287,6 +1289,15 @@ impl CliUnstable {
"profile-rustflags" => self.profile_rustflags = parse_empty(k, v)?,
"trim-paths" => self.trim_paths = parse_empty(k, v)?,
"publish-timeout" => self.publish_timeout = parse_empty(k, v)?,
"root-dir" => self.root_dir = v.map(|v| {
// Make the path absolute, if we can.
let v = PathBuf::from(v);
if v.is_absolute() {
v
} else {
v.canonicalize().unwrap_or(v)
}
}),
"rustdoc-map" => self.rustdoc_map = parse_empty(k, v)?,
"rustdoc-scrape-examples" => self.rustdoc_scrape_examples = parse_empty(k, v)?,
"separate-nightlies" => self.separate_nightlies = parse_empty(k, v)?,
Expand Down
12 changes: 9 additions & 3 deletions src/cargo/util/workspace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ use crate::core::{Target, Workspace};
use crate::ops::CompileOptions;
use crate::util::CargoResult;
use anyhow::bail;
use cargo_util::paths::normalize_path;
use cargo_util::ProcessBuilder;
use std::fmt::Write;
use std::path::PathBuf;
Expand Down Expand Up @@ -109,15 +110,20 @@ pub fn print_available_tests(ws: &Workspace<'_>, options: &CompileOptions) -> Ca
/// The first returned value here is the argument to pass to rustc, and the
/// second is the cwd that rustc should operate in.
pub fn path_args(ws: &Workspace<'_>, unit: &Unit) -> (PathBuf, PathBuf) {
let ws_root = ws.root();
let src = match unit.target.src_path() {
TargetSourcePath::Path(path) => path.to_path_buf(),
TargetSourcePath::Metabuild => unit.pkg.manifest().metabuild_path(ws.target_dir()),
};
assert!(src.is_absolute());
if unit.pkg.package_id().source_id().is_path() {
if let Ok(path) = src.strip_prefix(ws_root) {
return (path.to_path_buf(), ws_root.to_path_buf());
// Determine which path we make this relative to: usually it's the workspace root,
// but this can be overwritten with a `-Z` flag.
let root = match &ws.gctx().cli_unstable().root_dir {
None => ws.root().to_owned(),
Some(root_dir) => normalize_path(&ws.gctx().cwd().join(root_dir)),
};
if let Ok(path) = src.strip_prefix(&root) {
return (path.to_path_buf(), root);
}
}
(src, unit.pkg.root().to_path_buf())
Expand Down
26 changes: 14 additions & 12 deletions tests/testsuite/cargo/z_help/stdout.term.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
71 changes: 71 additions & 0 deletions tests/testsuite/directory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -784,3 +784,74 @@ Caused by:
.with_status(101)
.run();
}

#[cargo_test]
fn root_path_diagnostics() {
let p = ProjectBuilder::new(paths::root())
.no_manifest() // we are placing it in a different dir
.file(
"ws_root/Cargo.toml",
r#"
[package]
name = "foo"
version = "0.1.0"
edition = "2015"
authors = []
"#,
)
.file("ws_root/src/lib.rs", "invalid;")
.build();

// Crucially, the rustc error message below says `ws_root/...`, i.e.
// it is relative to our fake home, not to the workspace root.
p.cargo("check")
.arg("-Zroot-path=.")
.arg("--manifest-path=ws_root/Cargo.toml")
.masquerade_as_nightly_cargo(&["-Zroot-path"])
.with_status(101)
.with_stderr_data(str![[r#"
[CHECKING] foo v0.1.0 ([ROOT]/ws_root)
[ERROR] expected one of `!` or `::`, found `;`
--> ws_root/src/lib.rs:1:8
|
1 | invalid;
| [..]
[ERROR] could not compile `foo` (lib) due to 1 previous error
"#]])
.run();
}

#[cargo_test]
fn root_path_file_macro() {
let p = ProjectBuilder::new(paths::root())
.no_manifest() // we are placing it in a different dir
.file(
"ws_root/Cargo.toml",
r#"
[package]
name = "foo"
version = "0.1.0"
edition = "2015"
authors = []
"#,
)
.file(
"ws_root/src/main.rs",
r#"fn main() { println!("{}", file!()); }"#,
)
.build();

// Crucially, the rustc error message below says `ws_root/...`, i.e.
// it is relative to our fake home, not to the workspace root.
p.cargo("run")
.arg("-Zroot-path=.")
.arg("--manifest-path=ws_root/Cargo.toml")
.masquerade_as_nightly_cargo(&["-Zroot-path"])
.with_stdout_data(str![[r#"
ws_root/src/main.rs
"#]])
.run();
}

0 comments on commit ad2636d

Please sign in to comment.