@@ -94,6 +94,7 @@ For the latest nightly, see the [nightly version] of this page.
94
94
* [ per-package-target] ( #per-package-target ) --- Sets the ` --target ` to use for each individual package.
95
95
* [ artifact dependencies] ( #artifact-dependencies ) --- Allow build artifacts to be included into other build artifacts and build them for different targets.
96
96
* [ Edition 2024] ( #edition-2024 ) — Adds support for the 2024 Edition.
97
+ * [ Profile ` trim-paths ` option] ( #profile-trim-paths-option ) --- Control the sanitisation of file paths in build outputs.
97
98
* Information and metadata
98
99
* [ Build-plan] ( #build-plan ) --- Emits JSON information on which commands will be run.
99
100
* [ unit-graph] ( #unit-graph ) --- Emits JSON for Cargo's internal graph structure.
@@ -1289,6 +1290,96 @@ edition that may break your build.
1289
1290
1290
1291
[ edition ] : ../../edition-guide/index.html
1291
1292
1293
+ ## Profile ` trim-paths ` option
1294
+
1295
+ * Tracking Issue: [ rust-lang/cargo #12137 ] ( https://github.com/rust-lang/cargo/issues/12137 )
1296
+ * Tracking Rustc Issue: [ rust-lang/rust #111540 ] ( https://github.com/rust-lang/rust/issues/111540 )
1297
+
1298
+ This adds a new profile setting to control how paths are sanitised in the resulting binary.
1299
+ This can be enabled like so:
1300
+
1301
+ ``` toml
1302
+ cargo-features = [" trim-paths" ]
1303
+
1304
+ [package ]
1305
+ # ...
1306
+
1307
+ [profile .release ]
1308
+ trim-paths = [" all" ]
1309
+ ```
1310
+
1311
+ To set this in a profile in Cargo configuration, you need to use either
1312
+ ` -Z trim-paths ` or ` [unstable] ` table to enable it. For example,
1313
+
1314
+ ``` toml
1315
+ # .cargo/config.toml
1316
+ [unstable ]
1317
+ trim-paths = true
1318
+
1319
+ [profile .release ]
1320
+ rustflags = [" diagnostics" ]
1321
+ ```
1322
+
1323
+ ### Documentation updates
1324
+
1325
+ #### trim-paths
1326
+
1327
+ * as a new [ "Profiles settings" entry] ( ./profiles.html#profile-settings ) *
1328
+
1329
+ ` trim-paths ` is a profile setting which enables and controls the sanitisation of file paths in build outputs.
1330
+ It takes either string or an array of the following values:
1331
+
1332
+ - ` "none" ` and ` false ` --- disable path sanitisation
1333
+ - ` "macro" ` --- sanitise paths in the expansion of ` std::file!() ` macro.
1334
+ This is where paths in embedded panic messages come from
1335
+ - ` "diagnostics" ` --- sanitise paths in printed compiler diagnostics
1336
+ - ` "object" ` --- sanitise paths in compiled executables or libraries
1337
+ - ` "all" ` and ` true ` --- sanitise paths in all possible locations
1338
+
1339
+ It is defaulted to ` none ` for the ` dev ` profile, and ` object ` for the ` release ` profile.
1340
+ You can manually override it by specifying this option in ` Cargo.toml ` :
1341
+
1342
+ ``` toml
1343
+ [profile .dev ]
1344
+ trim-paths = " all"
1345
+
1346
+ [profile .release ]
1347
+ trim-paths = [" object" , " diagnostics" ]
1348
+ ```
1349
+
1350
+ The default ` release ` profile setting (` object ` ) sanitises only the paths in emitted executable or library files.
1351
+ It always affects paths from macros such as panic messages, and in debug information only if they will be embedded together with the binary
1352
+ (the default on platforms with ELF binaries, such as Linux and windows-gnu),
1353
+ but will not touch them if they are in separate files (the default on Windows MSVC and macOS).
1354
+ But the paths to these separate files are sanitised.
1355
+
1356
+ If ` trim-paths ` is not ` none ` or ` false ` , then the following paths are sanitised if they appear in a selected scope:
1357
+
1358
+ 1 . Path to the source files of the standard and core library (sysroot) will begin with ` /rustc/[rustc commit hash] ` ,
1359
+ e.g. ` /home/username/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/result.rs ` ->
1360
+ ` /rustc/fe72845f7bb6a77b9e671e6a4f32fe714962cec4/library/core/src/result.rs `
1361
+ 2 . Path to the current package will be stripped, e.g. ` /home/username/crate/src/lib.rs ` -> ` src/lib.rs ` .
1362
+ 3 . Path to dependency packages will be replaced with ` [package name]-[version] ` . E.g. ` /home/username/deps/foo/src/lib.rs ` -> ` foo-0.1.0/src/lib.rs `
1363
+
1364
+ When a path to the source files of the standard and core library is * not* in scope for sanitisation,
1365
+ the emitted path will depend on if ` rust-src ` component is present.
1366
+ If it is, then some paths will point to the copy of the source files on your file system;
1367
+ if it isn't, then they will show up as ` /rustc/[rustc commit hash]/library/... `
1368
+ (just like when it is selected for sanitisation).
1369
+ Paths to all other source files will not be affected.
1370
+
1371
+ This will not affect any hard-coded paths in the source code, such as in strings.
1372
+
1373
+ #### Environment variable
1374
+
1375
+ * as a new entry of [ "Environment variables Cargo sets for build scripts"] ( ./environment-variables.md#environment-variables-cargo-sets-for-crates ) *
1376
+
1377
+ * ` CARGO_TRIM_PATHS ` --- The value of ` trim-paths ` profile option.
1378
+ If the build script introduces absolute paths to built artefacts (such as by invoking a compiler),
1379
+ the user may request them to be sanitised in different types of artefacts.
1380
+ Common paths requiring sanitisation include ` OUT_DIR ` and ` CARGO_MANIFEST_DIR ` ,
1381
+ plus any other introduced by the build script, such as include directories.
1382
+
1292
1383
# Stabilized and removed features
1293
1384
1294
1385
## Compile progress
0 commit comments