Skip to content

Commit

Permalink
Auto merge of #12900 - weihanglo:trim-paths-build-script, r=epage
Browse files Browse the repository at this point in the history
feat(trim-paths): set env `CARGO_TRIM_PATHS` for build scripts
  • Loading branch information
bors committed Oct 31, 2023
2 parents 4aee12c + 2915729 commit 05cce73
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 2 deletions.
4 changes: 4 additions & 0 deletions src/cargo/core/compiler/custom_build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
1 change: 1 addition & 0 deletions src/cargo/core/profiles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
17 changes: 15 additions & 2 deletions src/doc/src/reference/unstable.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
66 changes: 66 additions & 0 deletions tests/testsuite/profile_trim_paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}

0 comments on commit 05cce73

Please sign in to comment.