13
13
//! This module is responsible for installing the standard library,
14
14
//! compiler, and documentation.
15
15
16
+ use std:: env;
16
17
use std:: fs;
17
- use std:: borrow:: Cow ;
18
- use std:: path:: Path ;
18
+ use std:: path:: { Path , PathBuf , Component } ;
19
19
use std:: process:: Command ;
20
20
21
21
use Build ;
22
22
use dist:: { package_vers, sanitize_sh, tmpdir} ;
23
23
24
24
/// Installs everything.
25
25
pub fn install ( build : & Build , stage : u32 , host : & str ) {
26
- let prefix = build. config . prefix . as_ref ( ) . clone ( ) . map ( |x| Path :: new ( x) )
27
- . unwrap_or ( Path :: new ( "/usr/local" ) ) ;
28
- let docdir = build. config . docdir . as_ref ( ) . clone ( ) . map ( |x| Cow :: Borrowed ( Path :: new ( x) ) )
29
- . unwrap_or ( Cow :: Owned ( prefix. join ( "share/doc/rust" ) ) ) ;
30
- let libdir = build. config . libdir . as_ref ( ) . clone ( ) . map ( |x| Cow :: Borrowed ( Path :: new ( x) ) )
31
- . unwrap_or ( Cow :: Owned ( prefix. join ( "lib" ) ) ) ;
32
- let mandir = build. config . mandir . as_ref ( ) . clone ( ) . map ( |x| Cow :: Borrowed ( Path :: new ( x) ) )
33
- . unwrap_or ( Cow :: Owned ( prefix. join ( "share/man" ) ) ) ;
26
+ let prefix_default = PathBuf :: from ( "/usr/local" ) ;
27
+ let docdir_default = PathBuf :: from ( "share/doc/rust" ) ;
28
+ let mandir_default = PathBuf :: from ( "share/man" ) ;
29
+ let libdir_default = PathBuf :: from ( "lib" ) ;
30
+ let prefix = build. config . prefix . as_ref ( ) . unwrap_or ( & prefix_default) ;
31
+ let docdir = build. config . docdir . as_ref ( ) . unwrap_or ( & docdir_default) ;
32
+ let libdir = build. config . libdir . as_ref ( ) . unwrap_or ( & libdir_default) ;
33
+ let mandir = build. config . mandir . as_ref ( ) . unwrap_or ( & mandir_default) ;
34
+
35
+ let docdir = prefix. join ( docdir) ;
36
+ let libdir = prefix. join ( libdir) ;
37
+ let mandir = prefix. join ( mandir) ;
38
+
39
+ let destdir = env:: var_os ( "DESTDIR" ) . map ( PathBuf :: from) ;
40
+
41
+ let prefix = add_destdir ( & prefix, & destdir) ;
42
+ let docdir = add_destdir ( & docdir, & destdir) ;
43
+ let libdir = add_destdir ( & libdir, & destdir) ;
44
+ let mandir = add_destdir ( & mandir, & destdir) ;
45
+
34
46
let empty_dir = build. out . join ( "tmp/empty_dir" ) ;
35
47
t ! ( fs:: create_dir_all( & empty_dir) ) ;
36
48
if build. config . docs {
37
- install_sh ( & build, "docs" , "rust-docs" , stage, host, prefix,
49
+ install_sh ( & build, "docs" , "rust-docs" , stage, host, & prefix,
38
50
& docdir, & libdir, & mandir, & empty_dir) ;
39
51
}
40
- install_sh ( & build, "std" , "rust-std" , stage, host, prefix,
52
+ install_sh ( & build, "std" , "rust-std" , stage, host, & prefix,
41
53
& docdir, & libdir, & mandir, & empty_dir) ;
42
- install_sh ( & build, "rustc" , "rustc" , stage, host, prefix,
54
+ install_sh ( & build, "rustc" , "rustc" , stage, host, & prefix,
43
55
& docdir, & libdir, & mandir, & empty_dir) ;
44
56
t ! ( fs:: remove_dir_all( & empty_dir) ) ;
45
57
}
@@ -59,3 +71,17 @@ fn install_sh(build: &Build, package: &str, name: &str, stage: u32, host: &str,
59
71
. arg ( "--disable-ldconfig" ) ;
60
72
build. run ( & mut cmd) ;
61
73
}
74
+
75
+ fn add_destdir ( path : & Path , destdir : & Option < PathBuf > ) -> PathBuf {
76
+ let mut ret = match * destdir {
77
+ Some ( ref dest) => dest. clone ( ) ,
78
+ None => return path. to_path_buf ( ) ,
79
+ } ;
80
+ for part in path. components ( ) {
81
+ match part {
82
+ Component :: Normal ( s) => ret. push ( s) ,
83
+ _ => { }
84
+ }
85
+ }
86
+ return ret
87
+ }
0 commit comments