@@ -300,6 +300,13 @@ mod impl_ {
300300        include :  Vec < PathBuf > , 
301301    } 
302302
303+     #[ derive( Default ) ]  
304+     struct  SdkInfo  { 
305+         libs :  Vec < PathBuf > , 
306+         path :  Vec < PathBuf > , 
307+         include :  Vec < PathBuf > , 
308+     } 
309+ 
303310    struct  LibraryHandle ( HMODULE ) ; 
304311
305312    impl  LibraryHandle  { 
@@ -373,6 +380,12 @@ mod impl_ {
373380            } 
374381        } 
375382
383+         fn  add_sdk ( & mut  self ,  sdk_info :  SdkInfo )  { 
384+             self . libs . extend ( sdk_info. libs ) ; 
385+             self . path . extend ( sdk_info. path ) ; 
386+             self . include . extend ( sdk_info. include ) ; 
387+         } 
388+ 
376389        fn  into_tool ( self ,  env_getter :  & dyn  EnvGetter )  -> Tool  { 
377390            let  MsvcTool  { 
378391                tool, 
@@ -392,6 +405,12 @@ mod impl_ {
392405        } 
393406    } 
394407
408+     impl  SdkInfo  { 
409+         fn  find_tool ( & self ,  tool :  & str )  -> Option < PathBuf >  { 
410+             self . path . iter ( ) . map ( |p| p. join ( tool) ) . find ( |p| p. exists ( ) ) 
411+         } 
412+     } 
413+ 
395414    /// Checks to see if the target's arch matches the VS environment. Returns `None` if the 
396415/// environment is unknown. 
397416fn  is_vscmd_target ( target :  TargetArch ,  env_getter :  & dyn  EnvGetter )  -> Option < bool >  { 
@@ -738,9 +757,10 @@ mod impl_ {
738757    )  -> Option < Tool >  { 
739758        let  ( root_path,  bin_path,  host_dylib_path,  lib_path,  alt_lib_path,  include_path)  =
740759            vs15plus_vc_paths ( target,  instance_path,  env_getter) ?; 
741-         let  tool_path = bin_path. join ( tool) ; 
760+         let  sdk_info = get_sdks ( target,  env_getter) ?; 
761+         let  mut  tool_path = bin_path. join ( tool) ; 
742762        if  !tool_path. exists ( )  { 
743-             return   None ; 
763+             tool_path = sdk_info . find_tool ( tool ) ? ; 
744764        } ; 
745765
746766        let  mut  tool = MsvcTool :: new ( tool_path) ; 
@@ -757,7 +777,7 @@ mod impl_ {
757777            tool. include . push ( atl_include_path) ; 
758778        } 
759779
760-         add_sdks ( & mut   tool,  target ,  env_getter ) ? ; 
780+         tool. add_sdk ( sdk_info ) ; 
761781
762782        Some ( tool. into_tool ( env_getter) ) 
763783    } 
@@ -900,12 +920,13 @@ mod impl_ {
900920        env_getter :  & dyn  EnvGetter , 
901921    )  -> Option < Tool >  { 
902922        let  vcdir = get_vc_dir ( "14.0" ) ?; 
903-         let  mut  tool = get_tool ( tool,  & vcdir,  target) ?; 
904-         add_sdks ( & mut  tool,  target,  env_getter) ?; 
923+         let  sdk_info = get_sdks ( target,  env_getter) ?; 
924+         let  mut  tool = get_tool ( tool,  & vcdir,  target,  & sdk_info) ?; 
925+         tool. add_sdk ( sdk_info) ; 
905926        Some ( tool. into_tool ( env_getter) ) 
906927    } 
907928
908-     fn  add_sdks ( tool :   & mut   MsvcTool ,   target :  TargetArch ,  env_getter :  & dyn  EnvGetter )  -> Option < ( ) >  { 
929+     fn  get_sdks ( target :  TargetArch ,  env_getter :  & dyn  EnvGetter )  -> Option < SdkInfo >  { 
909930        let  sub = target. as_vs_arch ( ) ; 
910931        let  ( ucrt,  ucrt_version)  = get_ucrt_dir ( ) ?; 
911932
@@ -916,35 +937,37 @@ mod impl_ {
916937            _ => return  None , 
917938        } ; 
918939
919-         tool. path 
940+         let  mut  info = SdkInfo :: default ( ) ; 
941+ 
942+         info. path 
920943            . push ( ucrt. join ( "bin" ) . join ( & ucrt_version) . join ( host) ) ; 
921944
922945        let  ucrt_include = ucrt. join ( "include" ) . join ( & ucrt_version) ; 
923-         tool . include . push ( ucrt_include. join ( "ucrt" ) ) ; 
946+         info . include . push ( ucrt_include. join ( "ucrt" ) ) ; 
924947
925948        let  ucrt_lib = ucrt. join ( "lib" ) . join ( & ucrt_version) ; 
926-         tool . libs . push ( ucrt_lib. join ( "ucrt" ) . join ( sub) ) ; 
949+         info . libs . push ( ucrt_lib. join ( "ucrt" ) . join ( sub) ) ; 
927950
928951        if  let  Some ( ( sdk,  version) )  = get_sdk10_dir ( env_getter)  { 
929-             tool . path . push ( sdk. join ( "bin" ) . join ( host) ) ; 
952+             info . path . push ( sdk. join ( "bin" ) . join ( host) ) ; 
930953            let  sdk_lib = sdk. join ( "lib" ) . join ( & version) ; 
931-             tool . libs . push ( sdk_lib. join ( "um" ) . join ( sub) ) ; 
954+             info . libs . push ( sdk_lib. join ( "um" ) . join ( sub) ) ; 
932955            let  sdk_include = sdk. join ( "include" ) . join ( & version) ; 
933-             tool . include . push ( sdk_include. join ( "um" ) ) ; 
934-             tool . include . push ( sdk_include. join ( "cppwinrt" ) ) ; 
935-             tool . include . push ( sdk_include. join ( "winrt" ) ) ; 
936-             tool . include . push ( sdk_include. join ( "shared" ) ) ; 
956+             info . include . push ( sdk_include. join ( "um" ) ) ; 
957+             info . include . push ( sdk_include. join ( "cppwinrt" ) ) ; 
958+             info . include . push ( sdk_include. join ( "winrt" ) ) ; 
959+             info . include . push ( sdk_include. join ( "shared" ) ) ; 
937960        }  else  if  let  Some ( sdk)  = get_sdk81_dir ( )  { 
938-             tool . path . push ( sdk. join ( "bin" ) . join ( host) ) ; 
961+             info . path . push ( sdk. join ( "bin" ) . join ( host) ) ; 
939962            let  sdk_lib = sdk. join ( "lib" ) . join ( "winv6.3" ) ; 
940-             tool . libs . push ( sdk_lib. join ( "um" ) . join ( sub) ) ; 
963+             info . libs . push ( sdk_lib. join ( "um" ) . join ( sub) ) ; 
941964            let  sdk_include = sdk. join ( "include" ) ; 
942-             tool . include . push ( sdk_include. join ( "um" ) ) ; 
943-             tool . include . push ( sdk_include. join ( "winrt" ) ) ; 
944-             tool . include . push ( sdk_include. join ( "shared" ) ) ; 
965+             info . include . push ( sdk_include. join ( "um" ) ) ; 
966+             info . include . push ( sdk_include. join ( "winrt" ) ) ; 
967+             info . include . push ( sdk_include. join ( "shared" ) ) ; 
945968        } 
946969
947-         Some ( ( ) ) 
970+         Some ( info ) 
948971    } 
949972
950973    fn  add_env ( 
@@ -963,22 +986,25 @@ mod impl_ {
963986
964987    // Given a possible MSVC installation directory, we look for the linker and 
965988    // then add the MSVC library path. 
966-     fn  get_tool ( tool :  & str ,  path :  & Path ,  target :  TargetArch )  -> Option < MsvcTool >  { 
989+     fn  get_tool ( 
990+         tool :  & str , 
991+         path :  & Path , 
992+         target :  TargetArch , 
993+         sdk_info :  & SdkInfo , 
994+     )  -> Option < MsvcTool >  { 
967995        bin_subdir ( target) 
968996            . into_iter ( ) 
969997            . map ( |( sub,  host) | { 
970998                ( 
971999                    path. join ( "bin" ) . join ( sub) . join ( tool) , 
972-                     path. join ( "bin" ) . join ( host) , 
1000+                     Some ( path. join ( "bin" ) . join ( host) ) , 
9731001                ) 
9741002            } ) 
9751003            . filter ( |( path,  _) | path. is_file ( ) ) 
976-             . map ( |( path,  host) | { 
977-                 let  mut  tool = MsvcTool :: new ( path) ; 
978-                 tool. path . push ( host) ; 
979-                 tool
980-             } ) 
981-             . filter_map ( |mut  tool| { 
1004+             . chain ( iter:: once_with ( || Some ( ( sdk_info. find_tool ( tool) ?,  None ) ) ) . flatten ( ) ) 
1005+             . map ( |( tool_path,  host) | { 
1006+                 let  mut  tool = MsvcTool :: new ( tool_path) ; 
1007+                 tool. path . extend ( host) ; 
9821008                let  sub = vc_lib_subdir ( target) ; 
9831009                tool. libs . push ( path. join ( "lib" ) . join ( sub) ) ; 
9841010                tool. include . push ( path. join ( "include" ) ) ; 
@@ -987,7 +1013,7 @@ mod impl_ {
9871013                    tool. libs . push ( atlmfc_path. join ( "lib" ) . join ( sub) ) ; 
9881014                    tool. include . push ( atlmfc_path. join ( "include" ) ) ; 
9891015                } 
990-                 Some ( tool) 
1016+                 tool
9911017            } ) 
9921018            . next ( ) 
9931019    } 
0 commit comments