Skip to content

Commit abd1a00

Browse files
Rollup merge of rust-lang#42067 - Keruspe:master, r=alexcrichton
rustbuild: install improvements Install rust-analysis and rust-src to get in par with what we can get from rustup. Allow bypassing the vendoring of dependencies. When we only build to install and not to redistribute dist tarballs, that part is not necessary, so avoid trying to install cargo-vendor.
2 parents 0011828 + 801e2b7 commit abd1a00

File tree

2 files changed

+99
-72
lines changed

2 files changed

+99
-72
lines changed

src/bootstrap/install.rs

+98-71
Original file line numberDiff line numberDiff line change
@@ -21,83 +21,110 @@ use std::process::Command;
2121
use Build;
2222
use dist::{sanitize_sh, tmpdir};
2323

24-
/// Installs everything.
25-
pub fn install(build: &Build, stage: u32, host: &str) {
26-
let prefix_default = PathBuf::from("/usr/local");
27-
let sysconfdir_default = PathBuf::from("/etc");
28-
let docdir_default = PathBuf::from("share/doc/rust");
29-
let bindir_default = PathBuf::from("bin");
30-
let libdir_default = PathBuf::from("lib");
31-
let mandir_default = PathBuf::from("share/man");
32-
let prefix = build.config.prefix.as_ref().unwrap_or(&prefix_default);
33-
let sysconfdir = build.config.sysconfdir.as_ref().unwrap_or(&sysconfdir_default);
34-
let docdir = build.config.docdir.as_ref().unwrap_or(&docdir_default);
35-
let bindir = build.config.bindir.as_ref().unwrap_or(&bindir_default);
36-
let libdir = build.config.libdir.as_ref().unwrap_or(&libdir_default);
37-
let mandir = build.config.mandir.as_ref().unwrap_or(&mandir_default);
38-
39-
let sysconfdir = prefix.join(sysconfdir);
40-
let docdir = prefix.join(docdir);
41-
let bindir = prefix.join(bindir);
42-
let libdir = prefix.join(libdir);
43-
let mandir = prefix.join(mandir);
44-
45-
let destdir = env::var_os("DESTDIR").map(PathBuf::from);
46-
47-
let prefix = add_destdir(&prefix, &destdir);
48-
let sysconfdir = add_destdir(&sysconfdir, &destdir);
49-
let docdir = add_destdir(&docdir, &destdir);
50-
let bindir = add_destdir(&bindir, &destdir);
51-
let libdir = add_destdir(&libdir, &destdir);
52-
let mandir = add_destdir(&mandir, &destdir);
53-
54-
let empty_dir = build.out.join("tmp/empty_dir");
55-
t!(fs::create_dir_all(&empty_dir));
56-
if build.config.docs {
57-
install_sh(&build, "docs", "rust-docs", &build.rust_package_vers(),
58-
stage, host, &prefix, &sysconfdir, &docdir, &bindir, &libdir,
59-
&mandir, &empty_dir);
60-
}
24+
pub struct Installer<'a> {
25+
build: &'a Build,
26+
prefix: PathBuf,
27+
sysconfdir: PathBuf,
28+
docdir: PathBuf,
29+
bindir: PathBuf,
30+
libdir: PathBuf,
31+
mandir: PathBuf,
32+
}
6133

62-
for target in build.config.target.iter() {
63-
install_sh(&build, "std", "rust-std", &build.rust_package_vers(),
64-
stage, target, &prefix, &sysconfdir, &docdir, &bindir, &libdir,
65-
&mandir, &empty_dir);
66-
}
34+
impl<'a> Installer<'a> {
35+
pub fn new(build: &'a Build) -> Installer<'a> {
36+
let prefix_default = PathBuf::from("/usr/local");
37+
let sysconfdir_default = PathBuf::from("/etc");
38+
let docdir_default = PathBuf::from("share/doc/rust");
39+
let bindir_default = PathBuf::from("bin");
40+
let libdir_default = PathBuf::from("lib");
41+
let mandir_default = PathBuf::from("share/man");
42+
let prefix = build.config.prefix.as_ref().unwrap_or(&prefix_default);
43+
let sysconfdir = build.config.sysconfdir.as_ref().unwrap_or(&sysconfdir_default);
44+
let docdir = build.config.docdir.as_ref().unwrap_or(&docdir_default);
45+
let bindir = build.config.bindir.as_ref().unwrap_or(&bindir_default);
46+
let libdir = build.config.libdir.as_ref().unwrap_or(&libdir_default);
47+
let mandir = build.config.mandir.as_ref().unwrap_or(&mandir_default);
48+
49+
let sysconfdir = prefix.join(sysconfdir);
50+
let docdir = prefix.join(docdir);
51+
let bindir = prefix.join(bindir);
52+
let libdir = prefix.join(libdir);
53+
let mandir = prefix.join(mandir);
54+
55+
let destdir = env::var_os("DESTDIR").map(PathBuf::from);
6756

68-
if build.config.extended {
69-
install_sh(&build, "cargo", "cargo", &build.cargo_package_vers(),
70-
stage, host, &prefix, &sysconfdir, &docdir, &bindir, &libdir,
71-
&mandir, &empty_dir);
72-
install_sh(&build, "rls", "rls", &build.rls_package_vers(),
73-
stage, host, &prefix, &sysconfdir, &docdir, &bindir, &libdir,
74-
&mandir, &empty_dir);
57+
let prefix = add_destdir(&prefix, &destdir);
58+
let sysconfdir = add_destdir(&sysconfdir, &destdir);
59+
let docdir = add_destdir(&docdir, &destdir);
60+
let bindir = add_destdir(&bindir, &destdir);
61+
let libdir = add_destdir(&libdir, &destdir);
62+
let mandir = add_destdir(&mandir, &destdir);
63+
64+
Installer {
65+
build,
66+
prefix,
67+
sysconfdir,
68+
docdir,
69+
bindir,
70+
libdir,
71+
mandir,
72+
}
7573
}
7674

77-
install_sh(&build, "rustc", "rustc", &build.rust_package_vers(),
78-
stage, host, &prefix, &sysconfdir, &docdir, &bindir, &libdir,
79-
&mandir, &empty_dir);
75+
/// Installs everything.
76+
pub fn install(&self, stage: u32, host: &str) {
77+
let empty_dir = self.build.out.join("tmp/empty_dir");
78+
t!(fs::create_dir_all(&empty_dir));
8079

81-
t!(fs::remove_dir_all(&empty_dir));
82-
}
80+
if self.build.config.docs {
81+
self.install_sh("docs", "rust-docs", &self.build.rust_package_vers(),
82+
stage, Some(host), &empty_dir);
83+
}
8384

84-
fn install_sh(build: &Build, package: &str, name: &str, version: &str, stage: u32, host: &str,
85-
prefix: &Path, sysconfdir: &Path, docdir: &Path, bindir: &Path, libdir: &Path,
86-
mandir: &Path, empty_dir: &Path) {
87-
println!("Install {} stage{} ({})", package, stage, host);
88-
let package_name = format!("{}-{}-{}", name, version, host);
89-
90-
let mut cmd = Command::new("sh");
91-
cmd.current_dir(empty_dir)
92-
.arg(sanitize_sh(&tmpdir(build).join(&package_name).join("install.sh")))
93-
.arg(format!("--prefix={}", sanitize_sh(prefix)))
94-
.arg(format!("--sysconfdir={}", sanitize_sh(sysconfdir)))
95-
.arg(format!("--docdir={}", sanitize_sh(docdir)))
96-
.arg(format!("--bindir={}", sanitize_sh(bindir)))
97-
.arg(format!("--libdir={}", sanitize_sh(libdir)))
98-
.arg(format!("--mandir={}", sanitize_sh(mandir)))
99-
.arg("--disable-ldconfig");
100-
build.run(&mut cmd);
85+
for target in self.build.config.target.iter() {
86+
self.install_sh("std", "rust-std", &self.build.rust_package_vers(),
87+
stage, Some(target), &empty_dir);
88+
}
89+
90+
if self.build.config.extended {
91+
self.install_sh("cargo", "cargo", &self.build.cargo_package_vers(),
92+
stage, Some(host), &empty_dir);
93+
self.install_sh("rls", "rls", &self.build.rls_package_vers(),
94+
stage, Some(host), &empty_dir);
95+
self.install_sh("analysis", "rust-analysis", &self.build.rust_package_vers(),
96+
stage, Some(host), &empty_dir);
97+
self.install_sh("src", "rust-src", &self.build.rust_package_vers(),
98+
stage, None, &empty_dir);
99+
}
100+
101+
self.install_sh("rustc", "rustc", &self.build.rust_package_vers(),
102+
stage, Some(host), &empty_dir);
103+
104+
t!(fs::remove_dir_all(&empty_dir));
105+
}
106+
107+
fn install_sh(&self, package: &str, name: &str, version: &str,
108+
stage: u32, host: Option<&str>, empty_dir: &Path) {
109+
println!("Install {} stage{} ({:?})", package, stage, host);
110+
let package_name = if let Some(host) = host {
111+
format!("{}-{}-{}", name, version, host)
112+
} else {
113+
format!("{}-{}", name, version)
114+
};
115+
116+
let mut cmd = Command::new("sh");
117+
cmd.current_dir(empty_dir)
118+
.arg(sanitize_sh(&tmpdir(self.build).join(&package_name).join("install.sh")))
119+
.arg(format!("--prefix={}", sanitize_sh(&self.prefix)))
120+
.arg(format!("--sysconfdir={}", sanitize_sh(&self.sysconfdir)))
121+
.arg(format!("--docdir={}", sanitize_sh(&self.docdir)))
122+
.arg(format!("--bindir={}", sanitize_sh(&self.bindir)))
123+
.arg(format!("--libdir={}", sanitize_sh(&self.libdir)))
124+
.arg(format!("--mandir={}", sanitize_sh(&self.mandir)))
125+
.arg("--disable-ldconfig");
126+
self.build.run(&mut cmd);
127+
}
101128
}
102129

103130
fn add_destdir(path: &Path, destdir: &Option<PathBuf>) -> PathBuf {

src/bootstrap/step.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -761,7 +761,7 @@ pub fn build_rules<'a>(build: &'a Build) -> Rules {
761761
.run(move |s| dist::rls(build, s.stage, s.target));
762762
rules.dist("install", "path/to/nowhere")
763763
.dep(|s| s.name("default:dist"))
764-
.run(move |s| install::install(build, s.stage, s.target));
764+
.run(move |s| install::Installer::new(build).install(s.stage, s.target));
765765
rules.dist("dist-cargo", "cargo")
766766
.host(true)
767767
.only_host_build(true)

0 commit comments

Comments
 (0)