summaryrefslogtreecommitdiffstats
path: root/debian/patches/u-make-compiletest-work-without-rpath.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches/u-make-compiletest-work-without-rpath.patch')
-rw-r--r--debian/patches/u-make-compiletest-work-without-rpath.patch187
1 files changed, 187 insertions, 0 deletions
diff --git a/debian/patches/u-make-compiletest-work-without-rpath.patch b/debian/patches/u-make-compiletest-work-without-rpath.patch
new file mode 100644
index 000000000..67c3badcd
--- /dev/null
+++ b/debian/patches/u-make-compiletest-work-without-rpath.patch
@@ -0,0 +1,187 @@
+From f8a0cc2ca8a644ddb63867526711ba17cb7508c8 Mon Sep 17 00:00:00 2001
+From: Josh Stone <jistone@redhat.com>
+Date: Fri, 14 Oct 2022 16:11:28 -0700
+Subject: [PATCH] compiletest: set the dylib path when gathering target cfg
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+If the compiler is built with `rpath = false`, then it won't find its
+own libraries unless the library search path is set. We already do that
+while running the actual compiletests, but #100260 added another rustc
+command for getting the target cfg.
+
+ Check compiletest suite=codegen mode=codegen (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu)
+ thread 'main' panicked at 'error: failed to get cfg info from "[...]/build/x86_64-unknown-linux-gnu/stage1/bin/rustc"
+ --- stdout
+
+ --- stderr
+ [...]/build/x86_64-unknown-linux-gnu/stage1/bin/rustc: error while loading shared libraries: librustc_driver-a2a76dc626cd02d2.so: cannot open shared object file: No such file or directory
+ ', src/tools/compiletest/src/common.rs:476:13
+
+Now the library path is set here as well, so it works without rpath.
+
+FG: Context adapted
+
+Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
+---
+ src/tools/compiletest/src/common.rs | 18 +++++++++++-------
+ src/tools/compiletest/src/runtest.rs | 27 +++------------------------
+ src/tools/compiletest/src/util.rs | 23 +++++++++++++++++++++++
+ 3 files changed, 37 insertions(+), 31 deletions(-)
+
+diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs
+index 64df76e2772..98a35810cfd 100644
+--- a/src/tools/compiletest/src/common.rs
++++ b/src/tools/compiletest/src/common.rs
+@@ -2,11 +2,12 @@ pub use self::Mode::*;
+
+ use std::ffi::OsString;
+ use std::fmt;
++use std::iter;
+ use std::path::{Path, PathBuf};
+ use std::process::Command;
+ use std::str::FromStr;
+
+-use crate::util::PathBufExt;
++use crate::util::{add_dylib_path, PathBufExt};
+ use lazycell::LazyCell;
+ use test::ColorConfig;
+
+@@ -389,7 +390,7 @@ impl Config {
+ }
+
+ fn target_cfg(&self) -> &TargetCfg {
+- self.target_cfg.borrow_with(|| TargetCfg::new(&self.rustc_path, &self.target))
++ self.target_cfg.borrow_with(|| TargetCfg::new(self))
+ }
+
+ pub fn matches_arch(&self, arch: &str) -> bool {
+@@ -455,20 +456,22 @@ pub enum Endian {
+ }
+
+ impl TargetCfg {
+- fn new(rustc_path: &Path, target: &str) -> TargetCfg {
+- let output = match Command::new(rustc_path)
++ fn new(config: &Config) -> TargetCfg {
++ let mut command = Command::new(&config.rustc_path);
++ add_dylib_path(&mut command, iter::once(&config.compile_lib_path));
++ let output = match command
+ .arg("--print=cfg")
+ .arg("--target")
+- .arg(target)
++ .arg(&config.target)
+ .output()
+ {
+ Ok(output) => output,
+- Err(e) => panic!("error: failed to get cfg info from {:?}: {e}", rustc_path),
++ Err(e) => panic!("error: failed to get cfg info from {:?}: {e}", config.rustc_path),
+ };
+ if !output.status.success() {
+ panic!(
+ "error: failed to get cfg info from {:?}\n--- stdout\n{}\n--- stderr\n{}",
+- rustc_path,
++ config.rustc_path,
+ String::from_utf8(output.stdout).unwrap(),
+ String::from_utf8(output.stderr).unwrap(),
+ );
+diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs
+index 8f289876f73..eb467170249 100644
+--- a/src/tools/compiletest/src/runtest.rs
++++ b/src/tools/compiletest/src/runtest.rs
+@@ -13,7 +13,7 @@ use crate::errors::{self, Error, ErrorKind};
+ use crate::header::TestProps;
+ use crate::json;
+ use crate::read2::read2_abbreviated;
+-use crate::util::{logv, PathBufExt};
++use crate::util::{add_dylib_path, dylib_env_var, logv, PathBufExt};
+ use crate::ColorConfig;
+ use regex::{Captures, Regex};
+ use rustfix::{apply_suggestions, get_suggestions_from_json, Filter};
+@@ -26,6 +26,7 @@ use std::fs::{self, create_dir_all, File, OpenOptions};
+ use std::hash::{Hash, Hasher};
+ use std::io::prelude::*;
+ use std::io::{self, BufReader};
++use std::iter;
+ use std::path::{Path, PathBuf};
+ use std::process::{Child, Command, ExitStatus, Output, Stdio};
+ use std::str;
+@@ -72,19 +73,6 @@ fn disable_error_reporting<F: FnOnce() -> R, R>(f: F) -> R {
+ f()
+ }
+
+-/// The name of the environment variable that holds dynamic library locations.
+-pub fn dylib_env_var() -> &'static str {
+- if cfg!(windows) {
+- "PATH"
+- } else if cfg!(target_os = "macos") {
+- "DYLD_LIBRARY_PATH"
+- } else if cfg!(target_os = "haiku") {
+- "LIBRARY_PATH"
+- } else {
+- "LD_LIBRARY_PATH"
+- }
+-}
+-
+ /// The platform-specific library name
+ pub fn get_lib_name(lib: &str, dylib: bool) -> String {
+ // In some casess (e.g. MUSL), we build a static
+@@ -1826,16 +1814,7 @@ impl<'test> TestCx<'test> {
+
+ // Need to be sure to put both the lib_path and the aux path in the dylib
+ // search path for the child.
+- let mut path =
+- env::split_paths(&env::var_os(dylib_env_var()).unwrap_or_default()).collect::<Vec<_>>();
+- if let Some(p) = aux_path {
+- path.insert(0, PathBuf::from(p))
+- }
+- path.insert(0, PathBuf::from(lib_path));
+-
+- // Add the new dylib search path var
+- let newpath = env::join_paths(&path).unwrap();
+- command.env(dylib_env_var(), newpath);
++ add_dylib_path(&mut command, iter::once(lib_path).chain(aux_path));
+
+ let mut child = disable_error_reporting(|| command.spawn())
+ .unwrap_or_else(|_| panic!("failed to exec `{:?}`", &command));
+diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs
+index 9d047b63c85..4b73be0fbb9 100644
+--- a/src/tools/compiletest/src/util.rs
++++ b/src/tools/compiletest/src/util.rs
+@@ -2,6 +2,7 @@ use crate::common::Config;
+ use std::env;
+ use std::ffi::OsStr;
+ use std::path::PathBuf;
++use std::process::Command;
+
+ use tracing::*;
+
+@@ -105,3 +106,25 @@ impl PathBufExt for PathBuf {
+ }
+ }
+ }
++
++/// The name of the environment variable that holds dynamic library locations.
++pub fn dylib_env_var() -> &'static str {
++ if cfg!(windows) {
++ "PATH"
++ } else if cfg!(target_os = "macos") {
++ "DYLD_LIBRARY_PATH"
++ } else if cfg!(target_os = "haiku") {
++ "LIBRARY_PATH"
++ } else {
++ "LD_LIBRARY_PATH"
++ }
++}
++
++/// Adds a list of lookup paths to `cmd`'s dynamic library lookup path.
++/// If the dylib_path_var is already set for this cmd, the old value will be overwritten!
++pub fn add_dylib_path(cmd: &mut Command, paths: impl Iterator<Item = impl Into<PathBuf>>) {
++ let path_env = env::var_os(dylib_env_var());
++ let old_paths = path_env.as_ref().map(env::split_paths);
++ let new_paths = paths.map(Into::into).chain(old_paths.into_iter().flatten());
++ cmd.env(dylib_env_var(), env::join_paths(new_paths).unwrap());
++}
+--
+2.30.2
+