@@ -409,6 +409,205 @@ path = "src/main.rs"
409
409
. run ( ) ;
410
410
}
411
411
412
+ #[ cargo_test]
413
+ fn custom_build_script_first_index_script_failed ( ) {
414
+ // In this, the script that is at first index in the build script array fails
415
+ let p = project ( )
416
+ . file (
417
+ "Cargo.toml" ,
418
+ r#"
419
+ cargo-features = ["multiple-build-scripts"]
420
+
421
+ [package]
422
+ name = "foo"
423
+ version = "0.1.0"
424
+ edition = "2024"
425
+
426
+ build = ["build1.rs", "build2.rs"]
427
+ "# ,
428
+ )
429
+ . file ( "src/main.rs" , "fn main() {}" )
430
+ . file ( "build1.rs" , "fn main() { std::process::exit(101); }" )
431
+ . file ( "build2.rs" , "fn main() {}" )
432
+ . build ( ) ;
433
+
434
+ p. cargo ( "check -v" )
435
+ . masquerade_as_nightly_cargo ( & [ "multiple-build-scripts" ] )
436
+ . with_status ( 101 )
437
+ . with_stderr_data ( str![ [ r#"
438
+ [COMPILING] foo v0.1.0 ([ROOT]/foo)
439
+ [RUNNING] `rustc --crate-name build_script_build1 --edition=2024 build1.rs [..]--crate-type bin [..]`
440
+ [RUNNING] `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build1`
441
+ [ERROR] failed to run custom build command for `foo v0.1.0 ([ROOT]/foo)`
442
+
443
+ Caused by:
444
+ process didn't exit successfully: `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build1` ([EXIT_STATUS]: 101)
445
+
446
+ "# ] ] )
447
+ . run ( ) ;
448
+ }
449
+
450
+ #[ cargo_test]
451
+ fn custom_build_script_second_index_script_failed ( ) {
452
+ // In this, the script that is at second index in the build script array fails
453
+ // This test was necessary because earlier, the program failed only if first script failed.
454
+ let p = project ( )
455
+ . file (
456
+ "Cargo.toml" ,
457
+ r#"
458
+ cargo-features = ["multiple-build-scripts"]
459
+
460
+ [package]
461
+ name = "foo"
462
+ version = "0.1.0"
463
+ edition = "2024"
464
+
465
+ build = ["build1.rs", "build2.rs"]
466
+ "# ,
467
+ )
468
+ . file ( "src/main.rs" , "fn main() {}" )
469
+ . file ( "build1.rs" , "fn main() {}" )
470
+ . file ( "build2.rs" , "fn main() { std::process::exit(101); }" )
471
+ . build ( ) ;
472
+
473
+ p. cargo ( "check -v" )
474
+ . masquerade_as_nightly_cargo ( & [ "multiple-build-scripts" ] )
475
+ . with_status ( 0 )
476
+ . with_stderr_data ( str![ [ r#"
477
+ [COMPILING] foo v0.1.0 ([ROOT]/foo)
478
+ [RUNNING] `rustc --crate-name build_script_build1 --edition=2024 build1.rs [..]--crate-type bin [..]`
479
+ [RUNNING] `[ROOT]/foo/target/debug/build/foo-[HASH]/build-script-build1`
480
+ [RUNNING] `rustc --crate-name foo --edition=2024 src/main.rs [..] --crate-type bin [..]`
481
+ [FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
482
+
483
+ "# ] ] )
484
+ . run ( ) ;
485
+ }
486
+
487
+ #[ cargo_test]
488
+ fn build_script_with_conflicting_environment_variables ( ) {
489
+ // In this, multiple scripts set different values to same environment variables
490
+ let p = project ( )
491
+ . file (
492
+ "Cargo.toml" ,
493
+ r#"
494
+ cargo-features = ["multiple-build-scripts"]
495
+
496
+ [package]
497
+ name = "foo"
498
+ version = "0.1.0"
499
+ edition = "2024"
500
+
501
+ build = ["build1.rs", "build2.rs"]
502
+ "# ,
503
+ )
504
+ . file (
505
+ "src/main.rs" ,
506
+ r#"
507
+ const FOO: &'static str = env!("FOO");
508
+ fn main() {
509
+ println!("{}", FOO);
510
+ }
511
+ "# ,
512
+ )
513
+ . file (
514
+ "build1.rs" ,
515
+ r#"fn main() { println!("cargo::rustc-env=FOO=bar1"); }"# ,
516
+ )
517
+ . file (
518
+ "build2.rs" ,
519
+ r#"fn main() { println!("cargo::rustc-env=FOO=bar2"); }"# ,
520
+ )
521
+ . build ( ) ;
522
+
523
+ p. cargo ( "run -v" )
524
+ . masquerade_as_nightly_cargo ( & [ "multiple-build-scripts" ] )
525
+ . with_status ( 0 )
526
+ . with_stdout_data ( str![ [ r#"
527
+ bar1
528
+
529
+ "# ] ] )
530
+ . run ( ) ;
531
+ }
532
+
533
+ #[ cargo_test]
534
+ fn build_script_with_conflicting_out_dirs ( ) {
535
+ // In this, multiple scripts create file with same name in their respective OUT_DIR.
536
+
537
+ let p = project ( )
538
+ . file (
539
+ "Cargo.toml" ,
540
+ r#"
541
+ cargo-features = ["multiple-build-scripts"]
542
+
543
+ [package]
544
+ name = "foo"
545
+ version = "0.1.0"
546
+ edition = "2024"
547
+
548
+ build = ["build1.rs", "build2.rs"]
549
+ "# ,
550
+ )
551
+ // OUT_DIR is set to the lexicographically largest build script's OUT_DIR by default
552
+ . file (
553
+ "src/main.rs" ,
554
+ r#"
555
+ include!(concat!(env!("OUT_DIR"), "/foo.rs"));
556
+ fn main() {
557
+ println!("{}", message());
558
+ }
559
+ "# ,
560
+ )
561
+ . file (
562
+ "build1.rs" ,
563
+ r#"
564
+ use std::env;
565
+ use std::fs;
566
+ use std::path::Path;
567
+
568
+ fn main() {
569
+ let out_dir = env::var_os("OUT_DIR").unwrap();
570
+ let dest_path = Path::new(&out_dir).join("foo.rs");
571
+ fs::write(
572
+ &dest_path,
573
+ "pub fn message() -> &'static str {
574
+ \"Hello, from Build Script 1!\"
575
+ }
576
+ "
577
+ ).unwrap();
578
+ }"# ,
579
+ )
580
+ . file (
581
+ "build2.rs" ,
582
+ r#"
583
+ use std::env;
584
+ use std::fs;
585
+ use std::path::Path;
586
+
587
+ fn main() {
588
+ let out_dir = env::var_os("OUT_DIR").unwrap();
589
+ let dest_path = Path::new(&out_dir).join("foo.rs");
590
+ fs::write(
591
+ &dest_path,
592
+ "pub fn message() -> &'static str {
593
+ \"Hello, from Build Script 2!\"
594
+ }
595
+ "
596
+ ).unwrap();
597
+ }"# ,
598
+ )
599
+ . build ( ) ;
600
+
601
+ p. cargo ( "run -v" )
602
+ . masquerade_as_nightly_cargo ( & [ "multiple-build-scripts" ] )
603
+ . with_status ( 0 )
604
+ . with_stdout_data ( str![ [ r#"
605
+ Hello, from Build Script 1!
606
+
607
+ "# ] ] )
608
+ . run ( ) ;
609
+ }
610
+
412
611
#[ cargo_test]
413
612
fn rerun_untracks_other_files ( ) {
414
613
let p = project ( )
0 commit comments