Skip to content

Fix nondeterministic SVH from sandbox-local OUT_DIR/CARGO_MANIFEST_DIR#3980

Open
walter-zeromatter wants to merge 1 commit intobazelbuild:mainfrom
walter-zeromatter:user/wgray/outdir-svh-fix-upstream
Open

Fix nondeterministic SVH from sandbox-local OUT_DIR/CARGO_MANIFEST_DIR#3980
walter-zeromatter wants to merge 1 commit intobazelbuild:mainfrom
walter-zeromatter:user/wgray/outdir-svh-fix-upstream

Conversation

@walter-zeromatter
Copy link
Copy Markdown

Under sandboxing, ${pwd} resolves to a per-pid sandbox path that differs across actions. rustc's env!() bakes the raw string into the crate SVH and --remap-path-prefix does not normalize env!() values, so crates like pyo3-build-config that do PathBuf::from(env!("OUT_DIR")) produce divergent SVHs between metadata and full rlib actions, breaking pipelined compilation and potentially poisoning cache.

Route CARGO_MANIFEST_DIR and OUT_DIR through ${exec_root}, and resolve ${exec_root} in the process wrapper by walking up from cwd to the first ancestor containing Bazel's DO_NOT_BUILD_HERE sentinel, then appending execroot/<workspace_name>. Falls back to the prior cwd-derived value if the sentinel is not found. ${output_base} is left untouched so that --remap-path-prefix=${output_base}=. keeps stripping sandbox-local prefixes from paths embedded in rmeta/debuginfo.

Under sandboxing, ${pwd} resolves to a per-pid sandbox path that differs
across actions. rustc's env!() bakes the raw string into the crate SVH
and --remap-path-prefix does not normalize env!() values, so crates like
pyo3-build-config that do PathBuf::from(env!("OUT_DIR")) produce
divergent SVHs between hollow-metadata and full rlib actions, breaking
pipelined compilation and poisoning the cache.

Route CARGO_MANIFEST_DIR and OUT_DIR through ${exec_root}, and resolve
${exec_root} in the process wrapper by walking up from cwd to the first
ancestor containing Bazel's DO_NOT_BUILD_HERE sentinel, then appending
execroot/<workspace_name>. Falls back to the prior cwd-derived value if
the sentinel is not found. ${output_base} is left untouched so that
--remap-path-prefix=\${output_base}=. keeps stripping sandbox-local
prefixes from paths embedded in rmeta/debuginfo.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant