@@ -2,28 +2,14 @@ use std::env;
2
2
use std:: path:: PathBuf ;
3
3
use std:: process:: { Command , Output } ;
4
4
5
- pub fn aux_build ( args : & str ) -> Output {
6
- let ( words, mut cmd) = build_common ( args) ;
7
- cmd. arg ( "--crate-type=lib" ) ;
8
- for word in words {
9
- cmd. arg ( word) ;
10
- }
11
- let output = cmd. output ( ) . unwrap ( ) ;
12
- if !output. status . success ( ) {
13
- handle_failed_output ( & format ! ( "{:?}" , cmd) , output) ;
14
- }
15
- output
16
- }
17
-
18
- fn build_common ( args : & str ) -> ( Vec < String > , Command ) {
5
+ fn setup_common_build_cmd ( ) -> Command {
19
6
let rustc = env:: var ( "RUSTC" ) . unwrap ( ) ;
20
- let words = shell_words:: split ( args) . expect ( "failed to parse arguments" ) ;
21
7
let mut cmd = Command :: new ( rustc) ;
22
8
cmd. arg ( "--out-dir" )
23
9
. arg ( env:: var ( "TMPDIR" ) . unwrap ( ) )
24
10
. arg ( "-L" )
25
11
. arg ( env:: var ( "TMPDIR" ) . unwrap ( ) ) ;
26
- ( words , cmd)
12
+ cmd
27
13
}
28
14
29
15
fn handle_failed_output ( cmd : & str , output : Output ) -> ! {
@@ -33,19 +19,72 @@ fn handle_failed_output(cmd: &str, output: Output) -> ! {
33
19
std:: process:: exit ( 1 )
34
20
}
35
21
36
- pub fn rustc ( args : & str ) -> Output {
37
- let ( words, mut cmd) = build_common ( args) ;
38
- for word in words {
39
- cmd. arg ( word) ;
22
+ pub fn rustc ( ) -> RustcInvocationBuilder {
23
+ RustcInvocationBuilder :: new ( )
24
+ }
25
+
26
+ pub fn aux_build ( ) -> AuxBuildInvocationBuilder {
27
+ AuxBuildInvocationBuilder :: new ( )
28
+ }
29
+
30
+ #[ derive( Debug ) ]
31
+ pub struct RustcInvocationBuilder {
32
+ cmd : Command ,
33
+ }
34
+
35
+ impl RustcInvocationBuilder {
36
+ fn new ( ) -> Self {
37
+ let cmd = setup_common_build_cmd ( ) ;
38
+ Self { cmd }
40
39
}
41
- let output = cmd. output ( ) . unwrap ( ) ;
42
- if !output. status . success ( ) {
43
- handle_failed_output ( & format ! ( "{:?}" , cmd) , output) ;
40
+
41
+ pub fn arg ( & mut self , arg : & str ) -> & mut RustcInvocationBuilder {
42
+ self . cmd . arg ( arg) ;
43
+ self
44
+ }
45
+
46
+ pub fn run ( & mut self ) -> Output {
47
+ let output = self . cmd . output ( ) . unwrap ( ) ;
48
+ if !output. status . success ( ) {
49
+ handle_failed_output ( & format ! ( "{:?}" , self . cmd) , output) ;
50
+ }
51
+ output
52
+ }
53
+ }
54
+
55
+ #[ derive( Debug ) ]
56
+ pub struct AuxBuildInvocationBuilder {
57
+ cmd : Command ,
58
+ }
59
+
60
+ impl AuxBuildInvocationBuilder {
61
+ fn new ( ) -> Self {
62
+ let mut cmd = setup_common_build_cmd ( ) ;
63
+ cmd. arg ( "--crate-type=lib" ) ;
64
+ Self { cmd }
65
+ }
66
+
67
+ pub fn arg ( & mut self , arg : & str ) -> & mut AuxBuildInvocationBuilder {
68
+ self . cmd . arg ( arg) ;
69
+ self
70
+ }
71
+
72
+ pub fn run ( & mut self ) -> Output {
73
+ let output = self . cmd . output ( ) . unwrap ( ) ;
74
+ if !output. status . success ( ) {
75
+ handle_failed_output ( & format ! ( "{:?}" , self . cmd) , output) ;
76
+ }
77
+ output
44
78
}
45
- output
46
79
}
47
80
48
81
fn run_common ( bin_name : & str ) -> ( Command , Output ) {
82
+ let bin_name = if std:: env:: var ( "TARGET" ) . unwrap ( ) . contains ( "windows" ) {
83
+ format ! ( "{}.exe" , bin_name)
84
+ } else {
85
+ bin_name. to_owned ( )
86
+ } ;
87
+
49
88
let mut bin_path = PathBuf :: new ( ) ;
50
89
bin_path. push ( std:: env:: var ( "TMPDIR" ) . unwrap ( ) ) ;
51
90
bin_path. push ( & bin_name) ;
0 commit comments