From 7d64c7cd024ac22e71df104577037d2e2fb42c49 Mon Sep 17 00:00:00 2001 From: jyn Date: Wed, 12 Apr 2023 21:17:08 -0500 Subject: [PATCH] Add `libLLVM.so` to the target libdir when download-rustc is enabled Previously, we would only add it to the host libdir, which meant it couldn't be loaded by `ui-fulldeps` tests that used rustc_private. --- src/bootstrap/compile.rs | 9 +++++---- src/bootstrap/dist.rs | 14 ++++++++++++++ src/bootstrap/lib.rs | 5 +++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 85d1c12cc6a..aaed5cf2e32 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -1273,9 +1273,7 @@ fn run(self, builder: &Builder<'_>) -> Interned { } // Copy the compiler into the correct sysroot. - let ci_rustc_dir = - builder.config.out.join(&*builder.config.build.triple).join("ci-rustc"); - builder.cp_r(&ci_rustc_dir, &sysroot); + builder.cp_r(&builder.ci_rustc_dir(builder.build.build), &sysroot); return INTERNER.intern_path(sysroot); } @@ -1377,7 +1375,10 @@ fn run(self, builder: &Builder<'_>) -> Compiler { // If we're downloading a compiler from CI, we can use the same compiler for all stages other than 0. if builder.download_rustc() { - builder.ensure(Sysroot { compiler: target_compiler }); + let sysroot = builder.ensure(Sysroot { compiler: target_compiler }); + // Ensure that `libLLVM.so` ends up in the newly created target directory, + // so that tools using `rustc_private` can use it. + dist::maybe_install_llvm_target(builder, target_compiler.host, &sysroot); return target_compiler; } diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index 8ce220c8647..28478aca403 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -1960,6 +1960,20 @@ fn maybe_install_llvm(builder: &Builder<'_>, target: TargetSelection, dst_libdir } } + // FIXME: for reasons I don't understand, the LLVM so in the `rustc` component is different than the one in `rust-dev`. + // Only the one in `rustc` works with the downloaded compiler. + if builder.download_rustc() && target == builder.build.build { + let src_libdir = builder.ci_rustc_dir(target).join("lib"); + for entry in t!(std::fs::read_dir(&src_libdir)) { + let entry = t!(entry); + if entry.file_name().to_str().unwrap().starts_with("libLLVM-") { + install_llvm_file(builder, &entry.path(), dst_libdir); + return !builder.config.dry_run(); + } + } + panic!("libLLVM.so not found in src_libdir {}!", src_libdir.display()); + } + // On macOS, rustc (and LLVM tools) link to an unversioned libLLVM.dylib // instead of libLLVM-11-rust-....dylib, as on linux. It's not entirely // clear why this is the case, though. llvm-config will emit the versioned diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index eaa3afa4b7b..6296fdad8a1 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -805,6 +805,11 @@ fn cargo_out(&self, compiler: Compiler, mode: Mode, target: TargetSelection) -> self.stage_out(compiler, mode).join(&*target.triple).join(self.cargo_dir()) } + /// Directory where the extracted `rustc-dev` component is stored. + fn ci_rustc_dir(&self, target: TargetSelection) -> PathBuf { + self.out.join(&*target.triple).join("ci-rustc") + } + /// Root output directory for LLVM compiled for `target` /// /// Note that if LLVM is configured externally then the directory returned