]> git.lizzy.rs Git - rust.git/blob - src/bootstrap/install.rs
638b0613bf2ccf6c5b50e340ccdf0d9809130752
[rust.git] / src / bootstrap / install.rs
1 // Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 //! Implementation of the install aspects of the compiler.
12 //!
13 //! This module is responsible for installing the standard library,
14 //! compiler, and documentation.
15
16 use std::env;
17 use std::fs;
18 use std::path::{Path, PathBuf, Component};
19 use std::process::Command;
20
21 use Build;
22 use dist::{pkgname, sanitize_sh, tmpdir};
23
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     empty_dir: PathBuf,
33 }
34
35 impl<'a> Drop for Installer<'a> {
36     fn drop(&mut self) {
37         t!(fs::remove_dir_all(&self.empty_dir));
38     }
39 }
40
41 impl<'a> Installer<'a> {
42     pub fn new(build: &'a Build) -> Installer<'a> {
43         let prefix_default = PathBuf::from("/usr/local");
44         let sysconfdir_default = PathBuf::from("/etc");
45         let docdir_default = PathBuf::from("share/doc/rust");
46         let bindir_default = PathBuf::from("bin");
47         let libdir_default = PathBuf::from("lib");
48         let mandir_default = PathBuf::from("share/man");
49         let prefix = build.config.prefix.as_ref().unwrap_or(&prefix_default);
50         let sysconfdir = build.config.sysconfdir.as_ref().unwrap_or(&sysconfdir_default);
51         let docdir = build.config.docdir.as_ref().unwrap_or(&docdir_default);
52         let bindir = build.config.bindir.as_ref().unwrap_or(&bindir_default);
53         let libdir = build.config.libdir.as_ref().unwrap_or(&libdir_default);
54         let mandir = build.config.mandir.as_ref().unwrap_or(&mandir_default);
55
56         let sysconfdir = prefix.join(sysconfdir);
57         let docdir = prefix.join(docdir);
58         let bindir = prefix.join(bindir);
59         let libdir = prefix.join(libdir);
60         let mandir = prefix.join(mandir);
61
62         let destdir = env::var_os("DESTDIR").map(PathBuf::from);
63
64         let prefix = add_destdir(&prefix, &destdir);
65         let sysconfdir = add_destdir(&sysconfdir, &destdir);
66         let docdir = add_destdir(&docdir, &destdir);
67         let bindir = add_destdir(&bindir, &destdir);
68         let libdir = add_destdir(&libdir, &destdir);
69         let mandir = add_destdir(&mandir, &destdir);
70
71         let empty_dir = build.out.join("tmp/empty_dir");
72
73         t!(fs::create_dir_all(&empty_dir));
74
75         Installer {
76             build,
77             prefix,
78             sysconfdir,
79             docdir,
80             bindir,
81             libdir,
82             mandir,
83             empty_dir,
84         }
85     }
86
87     pub fn install_docs(&self, stage: u32, host: &str) {
88         self.install_sh("docs", "rust-docs", stage, Some(host));
89     }
90
91     pub fn install_std(&self, stage: u32) {
92         for target in self.build.config.target.iter() {
93             self.install_sh("std", "rust-std", stage, Some(target));
94         }
95     }
96
97     pub fn install_cargo(&self, stage: u32, host: &str) {
98         self.install_sh("cargo", "cargo", stage, Some(host));
99     }
100
101     pub fn install_rls(&self, stage: u32, host: &str) {
102         self.install_sh("rls", "rls", stage, Some(host));
103     }
104
105     pub fn install_analysis(&self, stage: u32, host: &str) {
106         self.install_sh("analysis", "rust-analysis", stage, Some(host));
107     }
108
109     pub fn install_src(&self, stage: u32) {
110         self.install_sh("src", "rust-src", stage, None);
111     }
112     pub fn install_rustc(&self, stage: u32, host: &str) {
113         self.install_sh("rustc", "rustc", stage, Some(host));
114     }
115
116     fn install_sh(&self, package: &str, name: &str, stage: u32, host: Option<&str>) {
117         println!("Install {} stage{} ({:?})", package, stage, host);
118         let package_name = if let Some(host) = host {
119             format!("{}-{}", pkgname(self.build, name), host)
120         } else {
121             pkgname(self.build, name)
122         };
123
124         let mut cmd = Command::new("sh");
125         cmd.current_dir(&self.empty_dir)
126            .arg(sanitize_sh(&tmpdir(self.build).join(&package_name).join("install.sh")))
127            .arg(format!("--prefix={}", sanitize_sh(&self.prefix)))
128            .arg(format!("--sysconfdir={}", sanitize_sh(&self.sysconfdir)))
129            .arg(format!("--docdir={}", sanitize_sh(&self.docdir)))
130            .arg(format!("--bindir={}", sanitize_sh(&self.bindir)))
131            .arg(format!("--libdir={}", sanitize_sh(&self.libdir)))
132            .arg(format!("--mandir={}", sanitize_sh(&self.mandir)))
133            .arg("--disable-ldconfig");
134         self.build.run(&mut cmd);
135     }
136 }
137
138 fn add_destdir(path: &Path, destdir: &Option<PathBuf>) -> PathBuf {
139     let mut ret = match *destdir {
140         Some(ref dest) => dest.clone(),
141         None => return path.to_path_buf(),
142     };
143     for part in path.components() {
144         match part {
145             Component::Normal(s) => ret.push(s),
146             _ => {}
147         }
148     }
149     ret
150 }
151 /*
152 rules.install("install-docs", "src/doc")
153      .default(build.config.docs)
154      .only_host_build(true)
155      .dep(|s| s.name("dist-docs"))
156      .run(move |s| install::Installer::new(build).install_docs(s.stage, s.target));
157 rules.install("install-std", "src/libstd")
158      .default(true)
159      .only_host_build(true)
160      .dep(|s| s.name("dist-std"))
161      .run(move |s| install::Installer::new(build).install_std(s.stage));
162 rules.install("install-cargo", "cargo")
163      .default(build.config.extended)
164      .host(true)
165      .only_host_build(true)
166      .dep(|s| s.name("dist-cargo"))
167      .run(move |s| install::Installer::new(build).install_cargo(s.stage, s.target));
168 rules.install("install-rls", "rls")
169      .default(build.config.extended)
170      .host(true)
171      .only_host_build(true)
172      .dep(|s| s.name("dist-rls"))
173      .run(move |s| install::Installer::new(build).install_rls(s.stage, s.target));
174 rules.install("install-analysis", "analysis")
175      .default(build.config.extended)
176      .only_host_build(true)
177      .dep(|s| s.name("dist-analysis"))
178      .run(move |s| install::Installer::new(build).install_analysis(s.stage, s.target));
179 rules.install("install-src", "src")
180      .default(build.config.extended)
181      .host(true)
182      .only_build(true)
183      .only_host_build(true)
184      .dep(|s| s.name("dist-src"))
185      .run(move |s| install::Installer::new(build).install_src(s.stage));
186 rules.install("install-rustc", "src/librustc")
187      .default(true)
188      .host(true)
189      .only_host_build(true)
190      .dep(|s| s.name("dist-rustc"))
191      .run(move |s| install::Installer::new(build).install_rustc(s.stage, s.target));
192 */