diff options
| author | bors <bors@rust-lang.org> | 2024-03-06 14:51:49 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-03-06 14:51:49 +0000 |
| commit | bfe762e0ed2e95041cc12c02c5565c4368f2cc9f (patch) | |
| tree | c156827bc4e3bb47e81e9167ac96c54d14a786cd | |
| parent | 3314d5ce4c209e840c2e4b2c4442f6e031ae0989 (diff) | |
| parent | 5d1d4081d9e5b2d8748bd3f7b7403a5dffee69b1 (diff) | |
| download | rust-bfe762e0ed2e95041cc12c02c5565c4368f2cc9f.tar.gz rust-bfe762e0ed2e95041cc12c02c5565c4368f2cc9f.zip | |
Auto merge of #121967 - nikic:libllvm-linker-script, r=Mark-Simulacrum
Replace libLLVM symlink with linker script It turns out that the libLLVM-N.so -> libLLVM.so.N.1 symlink is also needed when projects like miri link against librustc_driver.so. As such, we have to distribute it in real rustup components like rustc-dev, rather than only for download-ci-llvm. To avoid actually distributing symlinks (which are not supported or not fully supported by the rustup infrastructure) replace it with a linker script that does the same thing instead. Fixes https://github.com/rust-lang/rust/issues/121889. r? `@cuviper`
| -rw-r--r-- | src/bootstrap/src/core/build_steps/dist.rs | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 067dede904f..6c7cc3bf6a7 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -2035,10 +2035,18 @@ fn install_llvm_file( // If we have a symlink like libLLVM-18.so -> libLLVM.so.18.1, install the target of the // symlink, which is what will actually get loaded at runtime. builder.install(&t!(fs::canonicalize(source)), destination, 0o644); + + let full_dest = destination.join(source.file_name().unwrap()); if install_symlink { - // If requested, also install the symlink. This is used by download-ci-llvm. - let full_dest = destination.join(source.file_name().unwrap()); + // For download-ci-llvm, also install the symlink, to match what LLVM does. Using a + // symlink is fine here, as this is not a rustup component. builder.copy(&source, &full_dest); + } else { + // Otherwise, replace the symlink with an equivalent linker script. This is used when + // projects like miri link against librustc_driver.so. We don't use a symlink, as + // these are not allowed inside rustup components. + let link = t!(fs::read_link(source)); + t!(std::fs::write(full_dest, format!("INPUT({})\n", link.display()))); } } else { builder.install(&source, destination, 0o644); |
