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.
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.
11 //! Implementation of the install aspects of the compiler.
13 //! This module is responsible for installing the standard library,
14 //! compiler, and documentation.
18 use std
::path
::{Path, PathBuf, Component}
;
19 use std
::process
::Command
;
22 use dist
::{pkgname, sanitize_sh, tmpdir}
;
24 pub struct Installer
<'a
> {
35 impl<'a
> Drop
for Installer
<'a
> {
37 t
!(fs
::remove_dir_all(&self.empty_dir
));
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
);
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
);
62 let destdir
= env
::var_os("DESTDIR").map(PathBuf
::from
);
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
);
71 let empty_dir
= build
.out
.join("tmp/empty_dir");
73 t
!(fs
::create_dir_all(&empty_dir
));
87 pub fn install_docs(&self, stage
: u32, host
: &str) {
88 self.install_sh("docs", "rust-docs", stage
, Some(host
));
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
));
97 pub fn install_cargo(&self, stage
: u32, host
: &str) {
98 self.install_sh("cargo", "cargo", stage
, Some(host
));
101 pub fn install_rls(&self, stage
: u32, host
: &str) {
102 self.install_sh("rls", "rls", stage
, Some(host
));
105 pub fn install_analysis(&self, stage
: u32, host
: &str) {
106 self.install_sh("analysis", "rust-analysis", stage
, Some(host
));
109 pub fn install_src(&self, stage
: u32) {
110 self.install_sh("src", "rust-src", stage
, None
);
112 pub fn install_rustc(&self, stage
: u32, host
: &str) {
113 self.install_sh("rustc", "rustc", stage
, Some(host
));
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
)
121 pkgname(self.build
, name
)
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
);
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(),
143 for part
in path
.components() {
145 Component
::Normal(s
) => ret
.push(s
),