@@ -300,6 +300,13 @@ mod impl_ {
300
300
include : Vec < PathBuf > ,
301
301
}
302
302
303
+ #[ derive( Default ) ]
304
+ struct SdkInfo {
305
+ libs : Vec < PathBuf > ,
306
+ path : Vec < PathBuf > ,
307
+ include : Vec < PathBuf > ,
308
+ }
309
+
303
310
struct LibraryHandle ( HMODULE ) ;
304
311
305
312
impl LibraryHandle {
@@ -373,6 +380,12 @@ mod impl_ {
373
380
}
374
381
}
375
382
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
+
376
389
fn into_tool ( self , env_getter : & dyn EnvGetter ) -> Tool {
377
390
let MsvcTool {
378
391
tool,
@@ -392,6 +405,12 @@ mod impl_ {
392
405
}
393
406
}
394
407
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
+
395
414
/// Checks to see if the target's arch matches the VS environment. Returns `None` if the
396
415
/// environment is unknown.
397
416
fn is_vscmd_target ( target : TargetArch , env_getter : & dyn EnvGetter ) -> Option < bool > {
@@ -738,9 +757,10 @@ mod impl_ {
738
757
) -> Option < Tool > {
739
758
let ( root_path, bin_path, host_dylib_path, lib_path, alt_lib_path, include_path) =
740
759
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) ;
742
762
if !tool_path. exists ( ) {
743
- return None ;
763
+ tool_path = sdk_info . find_tool ( tool ) ? ;
744
764
} ;
745
765
746
766
let mut tool = MsvcTool :: new ( tool_path) ;
@@ -757,7 +777,7 @@ mod impl_ {
757
777
tool. include . push ( atl_include_path) ;
758
778
}
759
779
760
- add_sdks ( & mut tool, target , env_getter ) ? ;
780
+ tool. add_sdk ( sdk_info ) ;
761
781
762
782
Some ( tool. into_tool ( env_getter) )
763
783
}
@@ -900,12 +920,13 @@ mod impl_ {
900
920
env_getter : & dyn EnvGetter ,
901
921
) -> Option < Tool > {
902
922
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) ;
905
926
Some ( tool. into_tool ( env_getter) )
906
927
}
907
928
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 > {
909
930
let sub = target. as_vs_arch ( ) ;
910
931
let ( ucrt, ucrt_version) = get_ucrt_dir ( ) ?;
911
932
@@ -916,35 +937,37 @@ mod impl_ {
916
937
_ => return None ,
917
938
} ;
918
939
919
- tool. path
940
+ let mut info = SdkInfo :: default ( ) ;
941
+
942
+ info. path
920
943
. push ( ucrt. join ( "bin" ) . join ( & ucrt_version) . join ( host) ) ;
921
944
922
945
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" ) ) ;
924
947
925
948
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) ) ;
927
950
928
951
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) ) ;
930
953
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) ) ;
932
955
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" ) ) ;
937
960
} 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) ) ;
939
962
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) ) ;
941
964
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" ) ) ;
945
968
}
946
969
947
- Some ( ( ) )
970
+ Some ( info )
948
971
}
949
972
950
973
fn add_env (
@@ -963,22 +986,25 @@ mod impl_ {
963
986
964
987
// Given a possible MSVC installation directory, we look for the linker and
965
988
// 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 > {
967
995
bin_subdir ( target)
968
996
. into_iter ( )
969
997
. map ( |( sub, host) | {
970
998
(
971
999
path. join ( "bin" ) . join ( sub) . join ( tool) ,
972
- path. join ( "bin" ) . join ( host) ,
1000
+ Some ( path. join ( "bin" ) . join ( host) ) ,
973
1001
)
974
1002
} )
975
1003
. 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) ;
982
1008
let sub = vc_lib_subdir ( target) ;
983
1009
tool. libs . push ( path. join ( "lib" ) . join ( sub) ) ;
984
1010
tool. include . push ( path. join ( "include" ) ) ;
@@ -987,7 +1013,7 @@ mod impl_ {
987
1013
tool. libs . push ( atlmfc_path. join ( "lib" ) . join ( sub) ) ;
988
1014
tool. include . push ( atlmfc_path. join ( "include" ) ) ;
989
1015
}
990
- Some ( tool)
1016
+ tool
991
1017
} )
992
1018
. next ( )
993
1019
}
0 commit comments