rustbuild: Restore Config.libdir_relative
This re-introduces a `Config.libdir_relative` field, now derived from `libdir` and made relative to `prefix` if necessary. This fixes a regression from #46592 when `--libdir` is given an absolute path. `Builder::sysroot_libdir` should always use a relative path so its callers don't clobber system locations, and `librustc` also asserts that `CFG_LIBDIR_RELATIVE` is really relative.
This commit is contained in:
@@ -444,8 +444,8 @@ impl<'a> Builder<'a> {
|
|||||||
|
|
||||||
fn run(self, builder: &Builder) -> Interned<PathBuf> {
|
fn run(self, builder: &Builder) -> Interned<PathBuf> {
|
||||||
let compiler = self.compiler;
|
let compiler = self.compiler;
|
||||||
let lib = if compiler.stage >= 1 && builder.build.config.libdir.is_some() {
|
let lib = if compiler.stage >= 1 && builder.build.config.libdir_relative.is_some() {
|
||||||
builder.build.config.libdir.clone().unwrap()
|
builder.build.config.libdir_relative.clone().unwrap()
|
||||||
} else {
|
} else {
|
||||||
PathBuf::from("lib")
|
PathBuf::from("lib")
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -517,7 +517,7 @@ fn rustc_cargo_env(build: &Build, cargo: &mut Command) {
|
|||||||
.env("CFG_PREFIX", build.config.prefix.clone().unwrap_or_default());
|
.env("CFG_PREFIX", build.config.prefix.clone().unwrap_or_default());
|
||||||
|
|
||||||
let libdir_relative =
|
let libdir_relative =
|
||||||
build.config.libdir.clone().unwrap_or(PathBuf::from("lib"));
|
build.config.libdir_relative.clone().unwrap_or(PathBuf::from("lib"));
|
||||||
cargo.env("CFG_LIBDIR_RELATIVE", libdir_relative);
|
cargo.env("CFG_LIBDIR_RELATIVE", libdir_relative);
|
||||||
|
|
||||||
// If we're not building a compiler with debugging information then remove
|
// If we're not building a compiler with debugging information then remove
|
||||||
|
|||||||
@@ -126,6 +126,7 @@ pub struct Config {
|
|||||||
pub docdir: Option<PathBuf>,
|
pub docdir: Option<PathBuf>,
|
||||||
pub bindir: Option<PathBuf>,
|
pub bindir: Option<PathBuf>,
|
||||||
pub libdir: Option<PathBuf>,
|
pub libdir: Option<PathBuf>,
|
||||||
|
pub libdir_relative: Option<PathBuf>,
|
||||||
pub mandir: Option<PathBuf>,
|
pub mandir: Option<PathBuf>,
|
||||||
pub codegen_tests: bool,
|
pub codegen_tests: bool,
|
||||||
pub nodejs: Option<PathBuf>,
|
pub nodejs: Option<PathBuf>,
|
||||||
@@ -417,6 +418,22 @@ impl Config {
|
|||||||
config.mandir = install.mandir.clone().map(PathBuf::from);
|
config.mandir = install.mandir.clone().map(PathBuf::from);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to infer `libdir_relative` from `libdir`.
|
||||||
|
if let Some(ref libdir) = config.libdir {
|
||||||
|
let mut libdir = libdir.as_path();
|
||||||
|
if !libdir.is_relative() {
|
||||||
|
// Try to make it relative to the prefix.
|
||||||
|
if let Some(ref prefix) = config.prefix {
|
||||||
|
if let Ok(suffix) = libdir.strip_prefix(prefix) {
|
||||||
|
libdir = suffix;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if libdir.is_relative() {
|
||||||
|
config.libdir_relative = Some(libdir.to_path_buf());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Store off these values as options because if they're not provided
|
// Store off these values as options because if they're not provided
|
||||||
// we'll infer default values for them later
|
// we'll infer default values for them later
|
||||||
let mut thinlto = None;
|
let mut thinlto = None;
|
||||||
|
|||||||
Reference in New Issue
Block a user