From 2a8c87b1da8cc9f069ef2d8add6044d6352af209 Mon Sep 17 00:00:00 2001 From: jyn Date: Mon, 10 Mar 2025 22:40:12 -0400 Subject: [PATCH] Rebuild llvm spuriously less frequently I noticed that `x check` was rebuilding rustc_llvm basically every time I modified a source file. I tracked this down to the following env variable change: ``` cargo::core::compiler::fingerprint: dirty: EnvVarChanged { name: "REAL_LIBRARY_PATH", old_value: Some("/home/jyn/.local/lib/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib"), new_value: None } ``` The problem was that I had installed rust-analyzer from rustup, not as a standalone tool. As a result, rustup sets `LD_LIBRARY_PATH=$(rustc --print target-libdir)` in the environment under the assumption that rust-analyzer needs it to link to rustc_private crates. This is not in fact the case; RA does not link to rustc_private. But rustup does not know this. Ideally we would make rustup smarter, but that takes a while because rustup has infrequent releases. In the meantime, as a workaround, be a little more selective about when we forward LD_LIBRARY_PATH. See the new comment for more details. --- src/bootstrap/src/core/builder/cargo.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/bootstrap/src/core/builder/cargo.rs b/src/bootstrap/src/core/builder/cargo.rs index 2cbf82ccda366..ef30c49f1f26e 100644 --- a/src/bootstrap/src/core/builder/cargo.rs +++ b/src/bootstrap/src/core/builder/cargo.rs @@ -511,7 +511,19 @@ impl Builder<'_> { // needs to not accidentally link to libLLVM in stage0/lib. cargo.env("REAL_LIBRARY_PATH_VAR", helpers::dylib_path_var()); if let Some(e) = env::var_os(helpers::dylib_path_var()) { - cargo.env("REAL_LIBRARY_PATH", e); + // We only need the original LIBRARY_PATH when using system llvm. In all other cases, we can + // just discard it. This is useful because rust-analyzer sometimes has a different + // LIBRARY_PATH than a baseline environment, causing spurious rebuilds. + let ci_llvm = self.config.llvm_from_ci && target == self.build.build; + let prebuilt_llvm = self + .config + .target_config + .get(&target) + .and_then(|conf| conf.llvm_config.as_ref()) + .is_some(); + if prebuilt_llvm && !ci_llvm { + cargo.env("REAL_LIBRARY_PATH", e); + } } // Set a flag for `check`/`clippy`/`fix`, so that certain build