@@ -518,7 +518,13 @@ impl ProjectWorkspace {
518
518
progress : & dyn Fn ( String ) ,
519
519
) -> anyhow:: Result < WorkspaceBuildScripts > {
520
520
match self {
521
- ProjectWorkspace :: Cargo { cargo, toolchain, sysroot, .. } => {
521
+ ProjectWorkspace :: DetachedFile {
522
+ cargo_script : Some ( cargo) ,
523
+ toolchain,
524
+ sysroot,
525
+ ..
526
+ }
527
+ | ProjectWorkspace :: Cargo { cargo, toolchain, sysroot, .. } => {
522
528
WorkspaceBuildScripts :: run_for_workspace (
523
529
config,
524
530
cargo,
@@ -530,9 +536,8 @@ impl ProjectWorkspace {
530
536
format ! ( "Failed to run build scripts for {}" , cargo. workspace_root( ) )
531
537
} )
532
538
}
533
- ProjectWorkspace :: Json { .. } | ProjectWorkspace :: DetachedFile { .. } => {
534
- Ok ( WorkspaceBuildScripts :: default ( ) )
535
- }
539
+ ProjectWorkspace :: DetachedFile { cargo_script : None , .. }
540
+ | ProjectWorkspace :: Json { .. } => Ok ( WorkspaceBuildScripts :: default ( ) ) ,
536
541
}
537
542
}
538
543
@@ -734,13 +739,50 @@ impl ProjectWorkspace {
734
739
} ) )
735
740
. collect ( )
736
741
}
737
- ProjectWorkspace :: DetachedFile { file, sysroot, .. } => iter:: once ( PackageRoot {
738
- is_local : true ,
739
- include : vec ! [ file. clone( ) ] ,
740
- exclude : Vec :: new ( ) ,
741
- } )
742
- . chain ( mk_sysroot ( sysroot. as_ref ( ) ) )
743
- . collect ( ) ,
742
+ ProjectWorkspace :: DetachedFile { file, cargo_script, sysroot, .. } => {
743
+ iter:: once ( PackageRoot {
744
+ is_local : true ,
745
+ include : vec ! [ file. clone( ) ] ,
746
+ exclude : Vec :: new ( ) ,
747
+ } )
748
+ . chain ( cargo_script. iter ( ) . flat_map ( |cargo| {
749
+ cargo. packages ( ) . map ( |pkg| {
750
+ let is_local = cargo[ pkg] . is_local ;
751
+ let pkg_root = cargo[ pkg] . manifest . parent ( ) . to_path_buf ( ) ;
752
+
753
+ let mut include = vec ! [ pkg_root. clone( ) ] ;
754
+
755
+ // In case target's path is manually set in Cargo.toml to be
756
+ // outside the package root, add its parent as an extra include.
757
+ // An example of this situation would look like this:
758
+ //
759
+ // ```toml
760
+ // [lib]
761
+ // path = "../../src/lib.rs"
762
+ // ```
763
+ let extra_targets = cargo[ pkg]
764
+ . targets
765
+ . iter ( )
766
+ . filter ( |& & tgt| matches ! ( cargo[ tgt] . kind, TargetKind :: Lib { .. } ) )
767
+ . filter_map ( |& tgt| cargo[ tgt] . root . parent ( ) )
768
+ . map ( |tgt| tgt. normalize ( ) . to_path_buf ( ) )
769
+ . filter ( |path| !path. starts_with ( & pkg_root) ) ;
770
+ include. extend ( extra_targets) ;
771
+
772
+ let mut exclude = vec ! [ pkg_root. join( ".git" ) ] ;
773
+ if is_local {
774
+ exclude. push ( pkg_root. join ( "target" ) ) ;
775
+ } else {
776
+ exclude. push ( pkg_root. join ( "tests" ) ) ;
777
+ exclude. push ( pkg_root. join ( "examples" ) ) ;
778
+ exclude. push ( pkg_root. join ( "benches" ) ) ;
779
+ }
780
+ PackageRoot { is_local, include, exclude }
781
+ } )
782
+ } ) )
783
+ . chain ( mk_sysroot ( sysroot. as_ref ( ) ) )
784
+ . collect ( )
785
+ }
744
786
}
745
787
}
746
788
@@ -756,9 +798,10 @@ impl ProjectWorkspace {
756
798
let sysroot_package_len = sysroot. as_ref ( ) . map_or ( 0 , |it| it. num_packages ( ) ) ;
757
799
cargo. packages ( ) . len ( ) + sysroot_package_len + rustc_package_len
758
800
}
759
- ProjectWorkspace :: DetachedFile { sysroot, .. } => {
801
+ ProjectWorkspace :: DetachedFile { sysroot, cargo_script , .. } => {
760
802
let sysroot_package_len = sysroot. as_ref ( ) . map_or ( 0 , |it| it. num_packages ( ) ) ;
761
- sysroot_package_len + 1
803
+ sysroot_package_len
804
+ + cargo_script. as_ref ( ) . map_or ( 1 , |cargo| cargo. packages ( ) . len ( ) )
762
805
}
763
806
}
764
807
}
0 commit comments