@@ -5,14 +5,18 @@ use std::net::TcpListener;
5
5
use std:: process:: Command ;
6
6
use std:: thread;
7
7
8
- use cargo_test_support:: install:: { assert_has_installed_exe, cargo_home} ;
9
- use cargo_test_support:: { cargo_exe, project} ;
8
+ use cargo_test_support:: basic_bin_manifest;
9
+ use cargo_test_support:: cargo_exe;
10
+ use cargo_test_support:: install:: assert_has_installed_exe;
11
+ use cargo_test_support:: install:: cargo_home;
12
+ use cargo_test_support:: project;
13
+ use cargo_test_support:: rustc_host;
10
14
11
15
const EXE_CONTENT : & str = r#"
12
16
use std::env;
13
17
14
18
fn main() {
15
- let var = env::var("CARGO_MAKEFLAGS").unwrap( );
19
+ let var = env::var("CARGO_MAKEFLAGS").expect("no jobserver from env" );
16
20
let arg = var.split(' ')
17
21
.find(|p| p.starts_with("--jobserver"))
18
22
.unwrap();
@@ -105,6 +109,134 @@ all:
105
109
p. process ( make) . env ( "CARGO" , cargo_exe ( ) ) . arg ( "-j2" ) . run ( ) ;
106
110
}
107
111
112
+ #[ cargo_test]
113
+ fn runner_inherits_jobserver ( ) {
114
+ let make = make_exe ( ) ;
115
+ if Command :: new ( make) . arg ( "--version" ) . output ( ) . is_err ( ) {
116
+ return ;
117
+ }
118
+
119
+ let runner = project ( )
120
+ . at ( "runner" )
121
+ . file ( "Cargo.toml" , & basic_bin_manifest ( "runner" ) )
122
+ . file (
123
+ "src/main.rs" ,
124
+ r#"
125
+ pub fn main() {
126
+ eprintln!("this is a runner");
127
+ let args: Vec<String> = std::env::args().collect();
128
+ let status = std::process::Command::new(&args[1]).status().unwrap();
129
+ assert!(status.success());
130
+ }
131
+ "# ,
132
+ )
133
+ . build ( ) ;
134
+ runner. cargo ( "build" ) . run ( ) ;
135
+ let runner_bin = runner. bin ( "runner" ) ;
136
+ assert ! ( runner_bin. is_file( ) ) ;
137
+
138
+ let host = rustc_host ( ) ;
139
+ let config_value = & format ! ( "target.{host}.runner = \" {}\" " , runner_bin. display( ) ) ;
140
+
141
+ let name = "cargo-jobserver-check" ;
142
+ let p = project ( )
143
+ . file (
144
+ "Cargo.toml" ,
145
+ & format ! (
146
+ r#"
147
+ [package]
148
+ name = "{name}"
149
+ version = "0.0.1"
150
+ "#
151
+ ) ,
152
+ )
153
+ . file (
154
+ "src/lib.rs" ,
155
+ r#"
156
+ #[test]
157
+ fn test() {
158
+ _ = std::env::var("CARGO_MAKEFLAGS").expect("no jobserver from env");
159
+ }
160
+ "# ,
161
+ )
162
+ . file ( "src/main.rs" , EXE_CONTENT )
163
+ . file (
164
+ "Makefile" ,
165
+ & format ! (
166
+ "\
167
+ run:
168
+ \t +$(CARGO) run
169
+
170
+ run-runner:
171
+ \t +$(CARGO) run --config '{config_value}'
172
+
173
+ test:
174
+ \t +$(CARGO) test --lib
175
+
176
+ test-runner:
177
+ \t +$(CARGO) test --lib --config '{config_value}'
178
+ " ,
179
+ ) ,
180
+ )
181
+ . build ( ) ;
182
+
183
+ // jobserver can be inherited from env
184
+ p. process ( make)
185
+ . env ( "CARGO" , cargo_exe ( ) )
186
+ . arg ( "run" )
187
+ . arg ( "-j2" )
188
+ . with_status ( 2 )
189
+ . with_stderr_contains ( "[..]no jobserver from env[..]" )
190
+ . run ( ) ;
191
+ p. process ( make)
192
+ . env ( "CARGO" , cargo_exe ( ) )
193
+ . arg ( "run-runner" )
194
+ . arg ( "-j2" )
195
+ . with_status ( 2 )
196
+ . with_stderr_contains ( "[..]this is a runner[..]" )
197
+ . with_stderr_contains ( "[..]no jobserver from env[..]" )
198
+ . run ( ) ;
199
+ p. process ( make)
200
+ . env ( "CARGO" , cargo_exe ( ) )
201
+ . arg ( "test" )
202
+ . arg ( "-j2" )
203
+ . with_status ( 2 )
204
+ . with_stdout_contains ( "[..]no jobserver from env[..]" )
205
+ . run ( ) ;
206
+ p. process ( make)
207
+ . env ( "CARGO" , cargo_exe ( ) )
208
+ . arg ( "test-runner" )
209
+ . arg ( "-j2" )
210
+ . with_status ( 2 )
211
+ . with_stderr_contains ( "[..]this is a runner[..]" )
212
+ . with_stdout_contains ( "[..]no jobserver from env[..]" )
213
+ . run ( ) ;
214
+
215
+ // but not from `-j` flag
216
+ p. cargo ( "run -j2" )
217
+ . with_status ( 101 )
218
+ . with_stderr_contains ( "[..]no jobserver from env[..]" )
219
+ . run ( ) ;
220
+ p. cargo ( "run -j2" )
221
+ . arg ( "--config" )
222
+ . arg ( config_value)
223
+ . with_status ( 101 )
224
+ . with_stderr_contains ( "[..]this is a runner[..]" )
225
+ . with_stderr_contains ( "[..]no jobserver from env[..]" )
226
+ . run ( ) ;
227
+ p. cargo ( "test -j2" )
228
+ . with_status ( 101 )
229
+ . with_stdout_contains ( "[..]no jobserver from env[..]" )
230
+ . run ( ) ;
231
+ p. cargo ( "test -j2" )
232
+ . arg ( "--config" )
233
+ . arg ( config_value)
234
+ . with_status ( 101 )
235
+ . with_stderr_contains ( "[..]this is a runner[..]" )
236
+ . with_stdout_contains ( "[..]no jobserver from env[..]" )
237
+ . run ( ) ;
238
+ }
239
+
108
240
#[ cargo_test]
109
241
fn makes_jobserver_used ( ) {
110
242
let make = make_exe ( ) ;
0 commit comments