pub quiet_tests: bool,
// Fallback musl-root for all targets
pub musl_root: Option<PathBuf>,
- pub prefix: Option<String>,
- pub docdir: Option<String>,
- pub libdir: Option<String>,
- pub mandir: Option<String>,
+ pub prefix: Option<PathBuf>,
+ pub docdir: Option<PathBuf>,
+ pub libdir: Option<PathBuf>,
+ pub mandir: Option<PathBuf>,
pub codegen_tests: bool,
pub nodejs: Option<PathBuf>,
pub gdb: Option<PathBuf>,
#[derive(RustcDecodable, Default)]
struct TomlConfig {
build: Option<Build>,
+ install: Option<Install>,
llvm: Option<Llvm>,
rust: Option<Rust>,
target: Option<HashMap<String, TomlTarget>>,
python: Option<String>,
}
+/// TOML representation of various global install decisions.
+#[derive(RustcDecodable, Default, Clone)]
+struct Install {
+ prefix: Option<String>,
+ mandir: Option<String>,
+ docdir: Option<String>,
+ libdir: Option<String>,
+}
+
/// TOML representation of how the LLVM build is configured.
#[derive(RustcDecodable, Default)]
struct Llvm {
set(&mut config.submodules, build.submodules);
set(&mut config.vendor, build.vendor);
+ if let Some(ref install) = toml.install {
+ config.prefix = install.prefix.clone().map(PathBuf::from);
+ config.mandir = install.mandir.clone().map(PathBuf::from);
+ config.docdir = install.docdir.clone().map(PathBuf::from);
+ config.libdir = install.libdir.clone().map(PathBuf::from);
+ }
+
if let Some(ref llvm) = toml.llvm {
match llvm.ccache {
Some(StringOrBool::String(ref s)) => {
set(&mut config.llvm_version_check, llvm.version_check);
set(&mut config.llvm_static_stdcpp, llvm.static_libstdcpp);
}
+
if let Some(ref rust) = toml.rust {
set(&mut config.rust_debug_assertions, rust.debug_assertions);
set(&mut config.rust_debuginfo, rust.debuginfo);
self.channel = value.to_string();
}
"CFG_PREFIX" => {
- self.prefix = Some(value.to_string());
+ self.prefix = Some(PathBuf::from(value));
}
"CFG_DOCDIR" => {
- self.docdir = Some(value.to_string());
+ self.docdir = Some(PathBuf::from(value));
}
"CFG_LIBDIR" => {
- self.libdir = Some(value.to_string());
+ self.libdir = Some(PathBuf::from(value));
}
"CFG_MANDIR" => {
- self.mandir = Some(value.to_string());
+ self.mandir = Some(PathBuf::from(value));
}
"CFG_LLVM_ROOT" if value.len() > 0 => {
let target = self.target_config.entry(self.build.clone())
//! This module is responsible for installing the standard library,
//! compiler, and documentation.
+use std::env;
use std::fs;
-use std::borrow::Cow;
-use std::path::Path;
+use std::path::{Path, PathBuf, Component};
use std::process::Command;
use Build;
/// Installs everything.
pub fn install(build: &Build, stage: u32, host: &str) {
- let prefix = build.config.prefix.as_ref().clone().map(|x| Path::new(x))
- .unwrap_or(Path::new("/usr/local"));
- let docdir = build.config.docdir.as_ref().clone().map(|x| Cow::Borrowed(Path::new(x)))
- .unwrap_or(Cow::Owned(prefix.join("share/doc/rust")));
- let libdir = build.config.libdir.as_ref().clone().map(|x| Cow::Borrowed(Path::new(x)))
- .unwrap_or(Cow::Owned(prefix.join("lib")));
- let mandir = build.config.mandir.as_ref().clone().map(|x| Cow::Borrowed(Path::new(x)))
- .unwrap_or(Cow::Owned(prefix.join("share/man")));
+ let prefix_default = PathBuf::from("/usr/local");
+ let docdir_default = PathBuf::from("share/doc/rust");
+ let mandir_default = PathBuf::from("share/man");
+ let libdir_default = PathBuf::from("lib");
+ let prefix = build.config.prefix.as_ref().unwrap_or(&prefix_default);
+ let docdir = build.config.docdir.as_ref().unwrap_or(&docdir_default);
+ let libdir = build.config.libdir.as_ref().unwrap_or(&libdir_default);
+ let mandir = build.config.mandir.as_ref().unwrap_or(&mandir_default);
+
+ let docdir = prefix.join(docdir);
+ let libdir = prefix.join(libdir);
+ let mandir = prefix.join(mandir);
+
+ let destdir = env::var_os("DESTDIR").map(PathBuf::from);
+
+ let prefix = add_destdir(&prefix, &destdir);
+ let docdir = add_destdir(&docdir, &destdir);
+ let libdir = add_destdir(&libdir, &destdir);
+ let mandir = add_destdir(&mandir, &destdir);
+
let empty_dir = build.out.join("tmp/empty_dir");
t!(fs::create_dir_all(&empty_dir));
if build.config.docs {
- install_sh(&build, "docs", "rust-docs", stage, host, prefix,
+ install_sh(&build, "docs", "rust-docs", stage, host, &prefix,
&docdir, &libdir, &mandir, &empty_dir);
}
- install_sh(&build, "std", "rust-std", stage, host, prefix,
+ install_sh(&build, "std", "rust-std", stage, host, &prefix,
&docdir, &libdir, &mandir, &empty_dir);
- install_sh(&build, "rustc", "rustc", stage, host, prefix,
+ install_sh(&build, "rustc", "rustc", stage, host, &prefix,
&docdir, &libdir, &mandir, &empty_dir);
t!(fs::remove_dir_all(&empty_dir));
}
.arg("--disable-ldconfig");
build.run(&mut cmd);
}
+
+fn add_destdir(path: &Path, destdir: &Option<PathBuf>) -> PathBuf {
+ let mut ret = match *destdir {
+ Some(ref dest) => dest.clone(),
+ None => return path.to_path_buf(),
+ };
+ for part in path.components() {
+ match part {
+ Component::Normal(s) => ret.push(s),
+ _ => {}
+ }
+ }
+ return ret
+}