@@ -50,8 +50,6 @@ struct VersionMetadata {
5050struct CargoManifestDependencyPackage {
5151 version : Option < String > ,
5252 path : Option < PathBuf > ,
53- #[ serde( default ) ]
54- features : Vec < String > ,
5553}
5654
5755#[ derive( Clone , Deserialize ) ]
@@ -291,6 +289,45 @@ fn webview2_version() -> crate::Result<Option<String>> {
291289 Ok ( version)
292290}
293291
292+ #[ cfg( windows) ]
293+ fn run_vs_setup_instance ( ) -> std:: io:: Result < std:: process:: Output > {
294+ Command :: new ( "powershell" )
295+ . args ( & [ "-NoProfile" , "-Command" ] )
296+ . arg ( "Get-VSSetupInstance" )
297+ . output ( )
298+ }
299+
300+ #[ cfg( windows) ]
301+ fn build_tools_version ( ) -> crate :: Result < Option < Vec < String > > > {
302+ let mut output = run_vs_setup_instance ( ) ;
303+ if output. is_err ( ) {
304+ Command :: new ( "powershell" )
305+ . args ( & [ "-NoProfile" , "-Command" ] )
306+ . arg ( "Install-Module VSSetup -Scope CurrentUser" )
307+ . output ( ) ?;
308+ output = run_vs_setup_instance ( ) ;
309+ }
310+ let output = output?;
311+ let versions = if output. status . success ( ) {
312+ let stdout = String :: from_utf8_lossy ( & output. stdout ) ;
313+ let mut versions = Vec :: new ( ) ;
314+
315+ let regex = regex:: Regex :: new ( r"Visual Studio Build Tools (?P<version>\d+)" ) . unwrap ( ) ;
316+ for caps in regex. captures_iter ( & stdout) {
317+ versions. push ( caps[ "version" ] . to_string ( ) ) ;
318+ }
319+
320+ if versions. is_empty ( ) {
321+ None
322+ } else {
323+ Some ( versions)
324+ }
325+ } else {
326+ None
327+ } ;
328+ Ok ( versions)
329+ }
330+
294331struct InfoBlock {
295332 section : bool ,
296333 key : & ' static str ,
@@ -403,6 +440,24 @@ impl Info {
403440
404441 #[ cfg( windows) ]
405442 VersionBlock :: new ( "Webview2" , webview2_version ( ) . unwrap_or_default ( ) ) . display ( ) ;
443+ #[ cfg( windows) ]
444+ VersionBlock :: new (
445+ "Visual Studio Build Tools" ,
446+ build_tools_version ( )
447+ . map ( |r| {
448+ let required_string = "(>= 2019 required)" ;
449+ let multiple_string =
450+ "(multiple versions might conflict; keep only 2019 if build errors occur)" ;
451+ r. map ( |v| match v. len ( ) {
452+ 1 if v[ 0 ] . as_str ( ) < "2019" => format ! ( "{} {}" , v[ 0 ] , required_string) ,
453+ 1 if v[ 0 ] . as_str ( ) >= "2019" => v[ 0 ] . clone ( ) ,
454+ _ if v. contains ( & "2019" . into ( ) ) => format ! ( "{} {}" , v. join( ", " ) , multiple_string) ,
455+ _ => format ! ( "{} {} {}" , v. join( ", " ) , required_string, multiple_string) ,
456+ } )
457+ } )
458+ . unwrap_or_default ( ) ,
459+ )
460+ . display ( ) ;
406461
407462 let hook = panic:: take_hook ( ) ;
408463 panic:: set_hook ( Box :: new ( |_info| {
0 commit comments