diff --git a/src/cargo/core/compiler/custom_build.rs b/src/cargo/core/compiler/custom_build.rs index 022ad87613a..c921986a838 100644 --- a/src/cargo/core/compiler/custom_build.rs +++ b/src/cargo/core/compiler/custom_build.rs @@ -307,6 +307,10 @@ fn build_work(cx: &mut Context<'_, '_>, unit: &Unit) -> CargoResult<Job> { cmd.env("CARGO_MANIFEST_LINKS", links); } + if let Some(trim_paths) = unit.profile.trim_paths.as_ref() { + cmd.env("CARGO_TRIM_PATHS", trim_paths.to_string()); + } + // Be sure to pass along all enabled features for this package, this is the // last piece of statically known information that we have. for feat in &unit.features { diff --git a/src/cargo/core/profiles.rs b/src/cargo/core/profiles.rs index 06a5f3b5784..95354a3f6ad 100644 --- a/src/cargo/core/profiles.rs +++ b/src/cargo/core/profiles.rs @@ -327,6 +327,7 @@ impl Profiles { result.root = for_unit_profile.root; result.debuginfo = for_unit_profile.debuginfo; result.opt_level = for_unit_profile.opt_level; + result.trim_paths = for_unit_profile.trim_paths.clone(); result } diff --git a/src/doc/src/reference/unstable.md b/src/doc/src/reference/unstable.md index 67144807fe2..0683daa3c59 100644 --- a/src/doc/src/reference/unstable.md +++ b/src/doc/src/reference/unstable.md @@ -94,7 +94,7 @@ For the latest nightly, see the [nightly version] of this page. * [per-package-target](#per-package-target) --- Sets the `--target` to use for each individual package. * [artifact dependencies](#artifact-dependencies) --- Allow build artifacts to be included into other build artifacts and build them for different targets. * [Edition 2024](#edition-2024) — Adds support for the 2024 Edition. - * [Profile `trim-paths` option](#profile-trim-paths-option) --- Control the sanitisation of file paths in build outputs. + * [Profile `trim-paths` option](#profile-trim-paths-option) --- Control the sanitization of file paths in build outputs. * Information and metadata * [Build-plan](#build-plan) --- Emits JSON information on which commands will be run. * [unit-graph](#unit-graph) --- Emits JSON for Cargo's internal graph structure. @@ -1292,7 +1292,7 @@ edition that may break your build. * Tracking Issue: [rust-lang/cargo#12137](https://github.com/rust-lang/cargo/issues/12137) * Tracking Rustc Issue: [rust-lang/rust#111540](https://github.com/rust-lang/rust/issues/111540) -This adds a new profile setting to control how paths are sanitised in the resulting binary. +This adds a new profile setting to control how paths are sanitized in the resulting binary. This can be enabled like so: ```toml @@ -1370,6 +1370,19 @@ Paths to all other source files will not be affected. This will not affect any hard-coded paths in the source code, such as in strings. +#### Environment variable + +*as a new entry of ["Environment variables Cargo sets for build scripts"](./environment-variables.md#environment-variables-cargo-sets-for-crates)* + +* `CARGO_TRIM_PATHS` --- The value of `trim-paths` profile option. + `false`, `"none"`, and empty arrays would be converted to `none`. + `true` and `"all"` become `all`. + Values in a non-empty array would be joined into a comma-separated list. + If the build script introduces absolute paths to built artifacts (such as by invoking a compiler), + the user may request them to be sanitized in different types of artifacts. + Common paths requiring sanitization include `OUT_DIR` and `CARGO_MANIFEST_DIR`, + plus any other introduced by the build script, such as include directories. + # Stabilized and removed features ## Compile progress diff --git a/tests/testsuite/profile_trim_paths.rs b/tests/testsuite/profile_trim_paths.rs index b0b8d9577a4..f264253c936 100644 --- a/tests/testsuite/profile_trim_paths.rs +++ b/tests/testsuite/profile_trim_paths.rs @@ -511,3 +511,69 @@ fn object_works() { assert!(memchr::memmem::find(&stdout, registry_src_bytes).is_none()); assert!(memchr::memmem::find(&stdout, pkg_root).is_none()); } + +// TODO: might want to move to test/testsuite/build_script.rs once stabilized. +#[cargo_test(nightly, reason = "-Zremap-path-scope is unstable")] +fn custom_build_env_var_trim_paths() { + let p = project() + .file( + "Cargo.toml", + r#" + [package] + name = "foo" + version = "0.0.1" + "#, + ) + .file("src/lib.rs", "") + .file("build.rs", "") + .build(); + + let test_cases = [ + ("[]", "none"), + ("\"all\"", "all"), + ("\"diagnostics\"", "diagnostics"), + ("\"macro\"", "macro"), + ("\"none\"", "none"), + ("\"object\"", "object"), + ("false", "none"), + ("true", "all"), + ( + r#"["diagnostics", "macro", "object"]"#, + "diagnostics,macro,object", + ), + ]; + + for (opts, expected) in test_cases { + p.change_file( + "Cargo.toml", + &format!( + r#" + [package] + name = "foo" + version = "0.0.1" + + [profile.dev] + trim-paths = {opts} + "# + ), + ); + + p.change_file( + "build.rs", + &format!( + r#" + fn main() {{ + assert_eq!( + std::env::var("CARGO_TRIM_PATHS").unwrap().as_str(), + "{expected}", + ); + }} + "# + ), + ); + + p.cargo("build -Ztrim-paths") + .masquerade_as_nightly_cargo(&["-Ztrim-paths"]) + .run(); + } +}