@@ -164,6 +164,246 @@ fn custom_build_env_var_rustc_linker() {
164
164
p. cargo ( "build --target" ) . arg ( & target) . run ( ) ;
165
165
}
166
166
167
+ #[ cargo_test]
168
+ fn custom_build_env_var_rustc_linker_bad_host_target ( ) {
169
+ let target = rustc_host ( ) ;
170
+ let p = project ( )
171
+ . file (
172
+ ".cargo/config" ,
173
+ & format ! (
174
+ r#"
175
+ [target.{}]
176
+ linker = "/path/to/linker"
177
+ "# ,
178
+ target
179
+ ) ,
180
+ )
181
+ . file (
182
+ "build.rs" ,
183
+ r#"
184
+ use std::env;
185
+
186
+ fn main() {
187
+ assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/linker"));
188
+ }
189
+ "# ,
190
+ )
191
+ . file ( "src/lib.rs" , "" )
192
+ . build ( ) ;
193
+
194
+ // build.rs should fail since host == target when no target is set
195
+ p. cargo ( "build --verbose" )
196
+ . with_status ( 101 )
197
+ . with_stderr_contains (
198
+ "\
199
+ [COMPILING] foo v0.0.1 ([CWD])
200
+ [RUNNING] `rustc --crate-name build_script_build build.rs [..]--crate-type bin [..]-C linker=[..]/path/to/linker [..]`
201
+ [ERROR] linker `[..]/path/to/linker` not found
202
+ "
203
+ )
204
+ . run ( ) ;
205
+ }
206
+
207
+ #[ cargo_test]
208
+ fn custom_build_env_var_rustc_linker_host_target ( ) {
209
+ let target = rustc_host ( ) ;
210
+ let p = project ( )
211
+ . file (
212
+ ".cargo/config" ,
213
+ & format ! (
214
+ r#"
215
+ [target.{}]
216
+ linker = "/path/to/linker"
217
+ "# ,
218
+ target
219
+ ) ,
220
+ )
221
+ . file (
222
+ "build.rs" ,
223
+ r#"
224
+ use std::env;
225
+
226
+ fn main() {
227
+ assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/linker"));
228
+ }
229
+ "# ,
230
+ )
231
+ . file ( "src/lib.rs" , "" )
232
+ . build ( ) ;
233
+
234
+ // no crate type set => linker never called => build succeeds if and
235
+ // only if build.rs succeeds, despite linker binary not existing.
236
+ p. cargo ( "build --target" ) . arg ( & target) . run ( ) ;
237
+ }
238
+
239
+ #[ cargo_test]
240
+ fn custom_build_env_var_rustc_linker_bad_host ( ) {
241
+ let target = rustc_host ( ) ;
242
+ let p = project ( )
243
+ . file (
244
+ ".cargo/config" ,
245
+ & format ! (
246
+ r#"
247
+ [host]
248
+ linker = "/path/to/host/linker"
249
+ [target.{}]
250
+ linker = "/path/to/target/linker"
251
+ "# ,
252
+ target
253
+ ) ,
254
+ )
255
+ . file (
256
+ "build.rs" ,
257
+ r#"
258
+ use std::env;
259
+
260
+ fn main() {
261
+ assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/target/linker"));
262
+ }
263
+ "# ,
264
+ )
265
+ . file ( "src/lib.rs" , "" )
266
+ . build ( ) ;
267
+
268
+ // build.rs should fail due to bad host linker being set
269
+ p. cargo ( "build --verbose --target" )
270
+ . arg ( & target)
271
+ . with_status ( 101 )
272
+ . with_stderr_contains (
273
+ "\
274
+ [COMPILING] foo v0.0.1 ([CWD])
275
+ [RUNNING] `rustc --crate-name build_script_build build.rs [..]--crate-type bin [..]-C linker=[..]/path/to/host/linker [..]`
276
+ [ERROR] linker `[..]/path/to/host/linker` not found
277
+ "
278
+ )
279
+ . run ( ) ;
280
+ }
281
+
282
+ #[ cargo_test]
283
+ fn custom_build_env_var_rustc_linker_bad_host_with_arch ( ) {
284
+ let target = rustc_host ( ) ;
285
+ let p = project ( )
286
+ . file (
287
+ ".cargo/config" ,
288
+ & format ! (
289
+ r#"
290
+ [host]
291
+ linker = "/path/to/host/linker"
292
+ [host.{}]
293
+ linker = "/path/to/host/arch/linker"
294
+ [target.{}]
295
+ linker = "/path/to/target/linker"
296
+ "# ,
297
+ target, target
298
+ ) ,
299
+ )
300
+ . file (
301
+ "build.rs" ,
302
+ r#"
303
+ use std::env;
304
+
305
+ fn main() {
306
+ assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/target/linker"));
307
+ }
308
+ "# ,
309
+ )
310
+ . file ( "src/lib.rs" , "" )
311
+ . build ( ) ;
312
+
313
+ // build.rs should fail due to bad host linker being set
314
+ p. cargo ( "build --verbose --target" )
315
+ . arg ( & target)
316
+ . with_status ( 101 )
317
+ . with_stderr_contains (
318
+ "\
319
+ [COMPILING] foo v0.0.1 ([CWD])
320
+ [RUNNING] `rustc --crate-name build_script_build build.rs [..]--crate-type bin [..]-C linker=[..]/path/to/host/arch/linker [..]`
321
+ [ERROR] linker `[..]/path/to/host/arch/linker` not found
322
+ "
323
+ )
324
+ . run ( ) ;
325
+ }
326
+
327
+ #[ cargo_test]
328
+ fn custom_build_env_var_rustc_linker_cross_arch_host ( ) {
329
+ let target = rustc_host ( ) ;
330
+ let cross_target = cross_compile:: alternate ( ) ;
331
+ let p = project ( )
332
+ . file (
333
+ ".cargo/config" ,
334
+ & format ! (
335
+ r#"
336
+ [host.{}]
337
+ linker = "/path/to/host/arch/linker"
338
+ [target.{}]
339
+ linker = "/path/to/target/linker"
340
+ "# ,
341
+ cross_target, target
342
+ ) ,
343
+ )
344
+ . file (
345
+ "build.rs" ,
346
+ r#"
347
+ use std::env;
348
+
349
+ fn main() {
350
+ assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/target/linker"));
351
+ }
352
+ "# ,
353
+ )
354
+ . file ( "src/lib.rs" , "" )
355
+ . build ( ) ;
356
+
357
+ // build.rs should fail due to bad host linker being set
358
+ p. cargo ( "build --verbose --target" ) . arg ( & target) . run ( ) ;
359
+ }
360
+
361
+ #[ cargo_test]
362
+ fn custom_build_env_var_rustc_linker_bad_cross_arch_host ( ) {
363
+ let target = rustc_host ( ) ;
364
+ let cross_target = cross_compile:: alternate ( ) ;
365
+ let p = project ( )
366
+ . file (
367
+ ".cargo/config" ,
368
+ & format ! (
369
+ r#"
370
+ [host]
371
+ linker = "/path/to/host/linker"
372
+ [host.{}]
373
+ linker = "/path/to/host/arch/linker"
374
+ [target.{}]
375
+ linker = "/path/to/target/linker"
376
+ "# ,
377
+ cross_target, target
378
+ ) ,
379
+ )
380
+ . file (
381
+ "build.rs" ,
382
+ r#"
383
+ use std::env;
384
+
385
+ fn main() {
386
+ assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/target/linker"));
387
+ }
388
+ "# ,
389
+ )
390
+ . file ( "src/lib.rs" , "" )
391
+ . build ( ) ;
392
+
393
+ // build.rs should fail due to bad host linker being set
394
+ p. cargo ( "build --verbose --target" )
395
+ . arg ( & target)
396
+ . with_status ( 101 )
397
+ . with_stderr_contains (
398
+ "\
399
+ [COMPILING] foo v0.0.1 ([CWD])
400
+ [RUNNING] `rustc --crate-name build_script_build build.rs [..]--crate-type bin [..]-C linker=[..]/path/to/host/linker [..]`
401
+ [ERROR] linker `[..]/path/to/host/linker` not found
402
+ "
403
+ )
404
+ . run ( ) ;
405
+ }
406
+
167
407
#[ cargo_test]
168
408
fn custom_build_script_wrong_rustc_flags ( ) {
169
409
let p = project ( )
0 commit comments