@@ -505,7 +505,13 @@ impl ProjectWorkspace {
505
505
progress : & dyn Fn ( String ) ,
506
506
) -> anyhow:: Result < WorkspaceBuildScripts > {
507
507
match self {
508
- ProjectWorkspace :: Cargo { cargo, toolchain, sysroot, .. } => {
508
+ ProjectWorkspace :: DetachedFile {
509
+ cargo_script : Some ( cargo) ,
510
+ toolchain,
511
+ sysroot,
512
+ ..
513
+ }
514
+ | ProjectWorkspace :: Cargo { cargo, toolchain, sysroot, .. } => {
509
515
WorkspaceBuildScripts :: run_for_workspace (
510
516
config,
511
517
cargo,
@@ -517,9 +523,8 @@ impl ProjectWorkspace {
517
523
format ! ( "Failed to run build scripts for {}" , cargo. workspace_root( ) )
518
524
} )
519
525
}
520
- ProjectWorkspace :: Json { .. } | ProjectWorkspace :: DetachedFile { .. } => {
521
- Ok ( WorkspaceBuildScripts :: default ( ) )
522
- }
526
+ ProjectWorkspace :: DetachedFile { cargo_script : None , .. }
527
+ | ProjectWorkspace :: Json { .. } => Ok ( WorkspaceBuildScripts :: default ( ) ) ,
523
528
}
524
529
}
525
530
@@ -720,13 +725,50 @@ impl ProjectWorkspace {
720
725
} ) )
721
726
. collect ( )
722
727
}
723
- ProjectWorkspace :: DetachedFile { file, sysroot, .. } => iter:: once ( PackageRoot {
724
- is_local : true ,
725
- include : vec ! [ file. clone( ) ] ,
726
- exclude : Vec :: new ( ) ,
727
- } )
728
- . chain ( mk_sysroot ( sysroot. as_ref ( ) ) )
729
- . collect ( ) ,
728
+ ProjectWorkspace :: DetachedFile { file, cargo_script, sysroot, .. } => {
729
+ iter:: once ( PackageRoot {
730
+ is_local : true ,
731
+ include : vec ! [ file. clone( ) ] ,
732
+ exclude : Vec :: new ( ) ,
733
+ } )
734
+ . chain ( cargo_script. iter ( ) . flat_map ( |cargo| {
735
+ cargo. packages ( ) . map ( |pkg| {
736
+ let is_local = cargo[ pkg] . is_local ;
737
+ let pkg_root = cargo[ pkg] . manifest . parent ( ) . to_path_buf ( ) ;
738
+
739
+ let mut include = vec ! [ pkg_root. clone( ) ] ;
740
+
741
+ // In case target's path is manually set in Cargo.toml to be
742
+ // outside the package root, add its parent as an extra include.
743
+ // An example of this situation would look like this:
744
+ //
745
+ // ```toml
746
+ // [lib]
747
+ // path = "../../src/lib.rs"
748
+ // ```
749
+ let extra_targets = cargo[ pkg]
750
+ . targets
751
+ . iter ( )
752
+ . filter ( |& & tgt| matches ! ( cargo[ tgt] . kind, TargetKind :: Lib { .. } ) )
753
+ . filter_map ( |& tgt| cargo[ tgt] . root . parent ( ) )
754
+ . map ( |tgt| tgt. normalize ( ) . to_path_buf ( ) )
755
+ . filter ( |path| !path. starts_with ( & pkg_root) ) ;
756
+ include. extend ( extra_targets) ;
757
+
758
+ let mut exclude = vec ! [ pkg_root. join( ".git" ) ] ;
759
+ if is_local {
760
+ exclude. push ( pkg_root. join ( "target" ) ) ;
761
+ } else {
762
+ exclude. push ( pkg_root. join ( "tests" ) ) ;
763
+ exclude. push ( pkg_root. join ( "examples" ) ) ;
764
+ exclude. push ( pkg_root. join ( "benches" ) ) ;
765
+ }
766
+ PackageRoot { is_local, include, exclude }
767
+ } )
768
+ } ) )
769
+ . chain ( mk_sysroot ( sysroot. as_ref ( ) ) )
770
+ . collect ( )
771
+ }
730
772
}
731
773
}
732
774
@@ -742,9 +784,10 @@ impl ProjectWorkspace {
742
784
let sysroot_package_len = sysroot. as_ref ( ) . map_or ( 0 , |it| it. num_packages ( ) ) ;
743
785
cargo. packages ( ) . len ( ) + sysroot_package_len + rustc_package_len
744
786
}
745
- ProjectWorkspace :: DetachedFile { sysroot, .. } => {
787
+ ProjectWorkspace :: DetachedFile { sysroot, cargo_script , .. } => {
746
788
let sysroot_package_len = sysroot. as_ref ( ) . map_or ( 0 , |it| it. num_packages ( ) ) ;
747
- sysroot_package_len + 1
789
+ sysroot_package_len
790
+ + cargo_script. as_ref ( ) . map_or ( 1 , |cargo| cargo. packages ( ) . len ( ) )
748
791
}
749
792
}
750
793
}
0 commit comments