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:
Josh Stone
2018-02-19 14:05:21 -08:00
parent 27a046e933
commit 80970e6953
3 changed files with 20 additions and 3 deletions

View File

@@ -444,8 +444,8 @@ impl<'a> Builder<'a> {
fn run(self, builder: &Builder) -> Interned<PathBuf> {
let compiler = self.compiler;
let lib = if compiler.stage >= 1 && builder.build.config.libdir.is_some() {
builder.build.config.libdir.clone().unwrap()
let lib = if compiler.stage >= 1 && builder.build.config.libdir_relative.is_some() {
builder.build.config.libdir_relative.clone().unwrap()
} else {
PathBuf::from("lib")
};

View File

@@ -517,7 +517,7 @@ fn rustc_cargo_env(build: &Build, cargo: &mut Command) {
.env("CFG_PREFIX", build.config.prefix.clone().unwrap_or_default());
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);
// If we're not building a compiler with debugging information then remove

View File

@@ -126,6 +126,7 @@ pub struct Config {
pub docdir: Option<PathBuf>,
pub bindir: Option<PathBuf>,
pub libdir: Option<PathBuf>,
pub libdir_relative: Option<PathBuf>,
pub mandir: Option<PathBuf>,
pub codegen_tests: bool,
pub nodejs: Option<PathBuf>,
@@ -417,6 +418,22 @@ impl Config {
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
// we'll infer default values for them later
let mut thinlto = None;