diff --git a/src/cargo/core/features.rs b/src/cargo/core/features.rs index 2638ff95234..51e26054c53 100644 --- a/src/cargo/core/features.rs +++ b/src/cargo/core/features.rs @@ -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}; @@ -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 = ("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"), @@ -1287,6 +1289,7 @@ 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| v.into()), "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)?, diff --git a/src/cargo/util/workspace.rs b/src/cargo/util/workspace.rs index a2e0fff5068..754775596fa 100644 --- a/src/cargo/util/workspace.rs +++ b/src/cargo/util/workspace.rs @@ -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; @@ -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()) diff --git a/src/doc/src/reference/unstable.md b/src/doc/src/reference/unstable.md index 39952bf6c20..2062e13fe2c 100644 --- a/src/doc/src/reference/unstable.md +++ b/src/doc/src/reference/unstable.md @@ -78,6 +78,7 @@ Each new feature described below should explain how to use it. * Output behavior * [artifact-dir](#artifact-dir) --- Adds a directory where artifacts are copied to. * [Different binary name](#different-binary-name) --- Assign a name to the built binary that is separate from the crate name. + * [root-dir](#root-dir) --- Controls the root directory relative to which paths are printed * Compile behavior * [mtime-on-use](#mtime-on-use) --- Updates the last-modified timestamp on every dependency every time it is used, to provide a mechanism to delete unused artifacts. * [doctest-xcompile](#doctest-xcompile) --- Supports running doctests with the `--target` flag. @@ -236,6 +237,13 @@ This can also be specified in `.cargo/config.toml` files. artifact-dir = "out" ``` +## root-dir +* Original Issue: [#9887](https://github.com/rust-lang/cargo/issues/9887) +* Tracking Issue: None (not currently slated for stabilization) + +The `-Zroot-dir` flag sets the root directory relative to which paths are printed. +This affects both diagnostics and paths emitted by the `file!()` macro. + ## doctest-xcompile * Tracking Issue: [#7040](https://github.com/rust-lang/cargo/issues/7040) * Tracking Rustc Issue: [#64245](https://github.com/rust-lang/rust/issues/64245) diff --git a/tests/testsuite/cargo/z_help/stdout.term.svg b/tests/testsuite/cargo/z_help/stdout.term.svg index a429e92d58b..993a456f1e5 100644 --- a/tests/testsuite/cargo/z_help/stdout.term.svg +++ b/tests/testsuite/cargo/z_help/stdout.term.svg @@ -1,4 +1,4 @@ - +