
                           % S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	J
r
JrJr  SSKJr  SSKJr  SSKJr  SSKr\
(       a  SS	KJrJr  \
(       d   \R0                  " 5       S
:X  a  SSKrSSKJr  O " S S5      r\" 5       rS\S'    " S S5      r " S S5      r " S S5      r " S S\5      r  " S S5      r!g)zo
Environment info about Microsoft Compilers.

>>> getfixture('windows_only')
>>> ei = EnvironmentInfo('amd64')
    )annotationsN)TYPE_CHECKING	TypedDictoverload)unique_everseen   )StrPath)py310)LiteralStringNotRequiredWindows)environc                  $    \ rS rSrSrSrSrSrSrg)winreg#   N )	__name__
__module____qualname____firstlineno__
HKEY_USERSHKEY_CURRENT_USERHKEY_LOCAL_MACHINEHKEY_CLASSES_ROOT__static_attributes__r       Jplatform/bundledpythonunix/lib/python3.13/site-packages/setuptools/msvc.pyr   r   #   s    
 ! r   r   zdict[str, str]r   c                      \ rS rSrSr\R                  " SS5      R                  5       rSS jr	\
SS j5       rSS jrSS jrSSS	 jjrSSS
 jjrSSS jjrSrg)PlatformInfo,   zi
Current and Target Architectures information.

Parameters
----------
arch: str
    Target architecture.
processor_architecture c                N    UR                  5       R                  SS5      U l        g )Nx64amd64)lowerreplacearch)selfr(   s     r   __init__PlatformInfo.__init__8   s    JJL((8	r   c                X    U R                   U R                   R                  S5      S-   S $ )zC
Return Target CPU architecture.

Return
------
str
    Target CPU
_r   N)r(   findr)   s    r   
target_cpuPlatformInfo.target_cpu;   s(     yy,q0233r   c                     U R                   S:H  $ )zW
Return True if target CPU is x86 32 bits..

Return
------
bool
    CPU is x86 32 bits
x86r0   r/   s    r   target_is_x86PlatformInfo.target_is_x86G   s     %''r   c                     U R                   S:H  $ )zX
Return True if current CPU is x86 32 bits..

Return
------
bool
    CPU is x86 32 bits
r3   current_cpur/   s    r   current_is_x86PlatformInfo.current_is_x86R   s     5((r   c                    U R                   S:X  a	  U(       a  S$ U R                   S:X  a	  U(       a  S$ SU R                    3$ )u  
Current platform specific subfolder.

Parameters
----------
hidex86: bool
    return '' and not '' if architecture is x86.
x64: bool
    return 'd' and not 'md64' if architecture is amd64.

Return
------
str
    subfolder: '        arget', or '' (see hidex86 parameter)
r3   r"   r%   \x64\r8   r)   hidex86r$   s      r   current_dirPlatformInfo.current_dir]   sR    $   E)g 	
   G+ 	

 d&&'(	
r   c                    U R                   S:X  a	  U(       a  S$ U R                   S:X  a	  U(       a  S$ SU R                    3$ )a  
Target platform specific subfolder.

Parameters
----------
hidex86: bool
    return '' and not '\x86' if architecture is x86.
x64: bool
    return '\x64' and not '\amd64' if architecture is amd64.

Return
------
str
    subfolder: '\current', or '' (see hidex86 parameter)
r3   r"   r%   r=   r>   r4   r?   s      r   
target_dirPlatformInfo.target_diru   sL    $ 5(W 	
 7*s 	

 doo&'	
r   c                    U(       a  SOU R                   nU R                  U:X  a  S$ U R                  5       R                  SSU S35      $ )a  
Cross platform specific subfolder.

Parameters
----------
forcex86: bool
    Use 'x86' as current architecture even if current architecture is
    not x86.

Return
------
str
    subfolder: '' if target architecture is current architecture,
    '\current_target' if not.
r3   r"   r>   r-   )r9   r0   rD   r'   )r)   forcex86currents      r   	cross_dirPlatformInfo.cross_dir   sQ      $%)9)9 ') 	
 "**42gYaA	
r   )r(   N)r(   strreturnNonerL   rK   )rL   bool)FFF)r   r   r   r   __doc__r   getr&   r9   r*   propertyr0   r5   r:   rA   rD   rI   r   r   r   r   r   r   ,   sZ     ++6;AACK9 	4 	4	(	)
0
0
 
r   r   c                  z   \ rS rSrSr\R                  \R                  \R                  \R                  4r
SS jr\SS j5       r\SS j5       r\SS j5       r\SS j5       r\SS j5       r\SS	 j5       r\SS
 j5       r\SS j5       r\SS j5       r\SSS jj5       r\SSS jj5       rSSS jjrSS jrSrg)RegistryInfo   z
Microsoft Visual Studio related registry information.

Parameters
----------
platform_info: PlatformInfo
    "PlatformInfo" instance.
c                    Xl         g Npi)r)   platform_infos     r   r*   RegistryInfo.__init__   s    r   c                    g)zP
Microsoft Visual Studio root registry key.

Return
------
str
    Registry key
VisualStudior   r/   s    r   visualstudioRegistryInfo.visualstudio   s     r   c                V    [         R                  R                  U R                  S5      $ )zO
Microsoft Visual Studio SxS registry key.

Return
------
str
    Registry key
SxS)ospathjoinr_   r/   s    r   sxsRegistryInfo.sxs   s     ww||D--u55r   c                V    [         R                  R                  U R                  S5      $ )zL
Microsoft Visual C++ VC7 registry key.

Return
------
str
    Registry key
VC7rc   rd   re   rf   r/   s    r   vcRegistryInfo.vc        ww||DHHe,,r   c                V    [         R                  R                  U R                  S5      $ )zO
Microsoft Visual Studio VS7 registry key.

Return
------
str
    Registry key
VS7rj   r/   s    r   vsRegistryInfo.vs   rm   r   c                    g)zS
Microsoft Visual C++ for Python registry key.

Return
------
str
    Registry key
zDevDiv\VCForPythonr   r/   s    r   vc_for_pythonRegistryInfo.vc_for_python   s     %r   c                    g)zA
Microsoft SDK registry key.

Return
------
str
    Registry key
zMicrosoft SDKsr   r/   s    r   microsoft_sdkRegistryInfo.microsoft_sdk   s      r   c                V    [         R                  R                  U R                  S5      $ )zR
Microsoft Windows/Platform SDK registry key.

Return
------
str
    Registry key
r   rc   rd   re   rv   r/   s    r   windows_sdkRegistryInfo.windows_sdk  s     ww||D..	::r   c                V    [         R                  R                  U R                  S5      $ )zP
Microsoft .NET Framework SDK registry key.

Return
------
str
    Registry key
NETFXSDKry   r/   s    r   	netfx_sdkRegistryInfo.netfx_sdk  s     ww||D..
;;r   c                    g)zP
Microsoft Windows Kits Roots registry key.

Return
------
str
    Registry key
zWindows Kits\Installed Rootsr   r/   s    r   windows_kits_rootsRegistryInfo.windows_kits_roots  s     /r   c                    g rX   r   r)   keyr3   s      r   	microsoftRegistryInfo.microsoft%  s    QTr   c                    g rX   r   r   s      r   r   r   '  s    =@r   c                    U R                   R                  5       (       d  U(       a  SOSn[        R                  R	                  SUSU5      $ )z
Return key in Microsoft software registry.

Parameters
----------
key: str
    Registry key path where look.
x86: bool
    Force x86 software registry.

Return
------
str
    Registry key
r"   Wow6432NodeSoftware	Microsoft)rZ   r:   rc   rd   re   )r)   r   r3   node64s       r   r   r   )  s8      ww--//3Mww||JSAAr   c           	     >   [         R                  n[         R                  n[         R                  nU R                  nU R
                   HB  nSn U" Xv" U5      SU5      n [         R                  " X5      S   U(       a  U" U5        s  $ s  $    g! [         aI    U R                  R                  5       (       d&   U" Xv" US5      SU5      n Nn! [         a      M  f = f M  f = f! [         a     Of = f U(       a
  U" U5        M  M  ! U(       a	  U" U5        f f = f)z
Look for values in registry in Microsoft software registry.

Parameters
----------
key: str
    Registry key path where look.
name: str
    Value name to find.

Return
------
str | None
    value
Nr   T)
r   KEY_READOpenKeyCloseKeyr   HKEYSOSErrorrZ   r:   QueryValueEx)	r)   r   namekey_readopenkeyclosekeymshkeybkeys	            r   lookupRegistryInfo.lookup<  s     ??..??^^JJDD	tRWa:#**46q9 TN # &   ww--//!&tRT]AxH" ! !   TN 4TN sT   B C&)C#:C
CC#CC#"C#&
C30D
2C33D

DrY   N)r[   r   rL   rM   )rL   r   rP   )r   r   r3   rO   rL   r   )r   rK   r3   rO   rL   rK   )r   rK   r   rK   rL   
str | None)r   r   r   r   rQ   r   r   r   r   r   r   r*   rS   r_   rf   rk   rp   rs   rv   rz   r~   r   r   r   r   r   r   r   r   rU   rU      s    	  !!  	E  	 	 	6 	6 	- 	- 	- 	- 	% 	% 	  	  	; 	; 	< 	< 	/ 	/ T T@ @B&'r   rU   c                  (   \ rS rSrSr\R                  " SS5      r\R                  " SS5      r\R                  " S\5      r	 S!     S"S jjr
S	 rS#S
 jrS$S jr\S 5       r\S%S j5       r\S%S j5       rS rS r\S&S j5       r\S%S j5       r\S%S j5       r\S'S j5       r\S%S j5       r\S'S j5       r\S%S j5       r\S&S j5       r\S'S j5       r\S%S j5       r\S%S j5       r\S(S j5       r \S(S j5       r!S(S jr"\S)S*S jj5       r#S r$g)+
SystemInfoif  z
Microsoft Windows and Visual Studio related system information.

Parameters
----------
registry_info: RegistryInfo
    "RegistryInfo" instance.
vc_ver: float
    Required Microsoft Visual C++ version.
WinDirr"   ProgramFileszProgramFiles(x86)Nc                    Xl         U R                   R                  U l        U R                  5       U l        U=(       d    U R	                  5       =U l        U l        g rX   )rirZ   find_programdata_vs_versknown_vs_paths_find_latest_available_vs_vervs_vervc_ver)r)   registry_infor   s      r   r*   SystemInfo.__init__x  sG      ''**";;= %+$Rd.P.P.RRdkr   c                    U R                  5       nU(       d0  U R                  (       d  [        R                  R	                  S5      e[        U5      nUR                  U R                  5        [        U5      $ )z=
Find the latest VC version

Return
------
float
    version
z%No Microsoft Visual C++ version found)find_reg_vs_versr   	distutilserrorsDistutilsPlatformErrorsetupdatemax)r)   reg_vc_versvc_verss      r   r   (SystemInfo._find_latest_available_vs_ver  sa     ++-t22""997  k"t**+7|r   c           
        U R                   R                  nU R                   R                  U R                   R                  U R                   R                  4n/ n[
        R                  " U R                   R                  U5       GH.  u  pE [        R                  " XA" U5      S[        R                  5      nU   [        R                  " U5      u  pxn	[        U5       H^  n
[        R                  " [         5         [#        [        R$                  " Xj5      S   5      nX;  a  UR'                  U5        SSS5        M`     [        U5       H[  n
[        R                  " [         5         [#        [        R(                  " Xj5      5      nX;  a  UR'                  U5        SSS5        M]     SSS5        GM1     [+        U5      $ ! [         a     GML  f = f! , (       d  f       GM  = f! , (       d  f       M  = f! , (       d  f       GM  = f)zh
Find Microsoft Visual Studio versions available in registry.

Return
------
list of float
    Versions
r   N)r   r   rk   rs   rp   	itertoolsproductr   r   r   r   r   QueryInfoKeyrange
contextlibsuppress
ValueErrorfloat	EnumValueappendEnumKeysorted)r)   r   vckeysvs_versr   r   r   subkeysvaluesr-   ivers               r   r   SystemInfo.find_reg_vs_vers  sw    WW''**dgg33TWWZZ@"**477==&AID~~dBsGQH %+%8%8%>"vA#,,Z8#F$4$4T$=a$@A-#NN3/ 98 '
 wA#,,Z8#FNN4$;<-#NN3/ 98 (  B" g  
 98
 98 sO   ,G:AG:<9G	54G:)6G(	G:
GG
G%	G:(
G72G::
H
	c                   0 nSn [         R                  " U5      nU H  n [         R                  R	                  X$S5      n[        USSS9 n[        R                  " U5      nSSS5        WS   n[         R                  " [         R                  R	                  US5      5        UXR                  US	   5      '   M     U$ ! [         a    Us $ f = f! , (       d  f       Nu= f! [        [        4 a     M  f = f)
z
Find Visual studio 2017+ versions from information in
"C:\ProgramData\Microsoft\VisualStudio\Packages\_Instances".

Return
------
dict
    float version as key, path as value.
z9C:\ProgramData\Microsoft\VisualStudio\Packages\_Instancesz
state.jsonrtzutf-8)encodingNinstallationPathVC\Tools\MSVCinstallationVersion)
rc   listdirr   rd   re   openjsonload_as_float_versionKeyError)	r)   vs_versionsinstances_dirhashed_namesr   
state_path
state_filestatevs_paths	            r   r   #SystemInfo.find_programdata_vs_vers  s     )+T	::m4L !DWW\\-|L
*dW= IIj1E > 23 

277<<1ABC  2259N3OPQ !( 1  		 >= X& s;   C +C$C$AC$CC
C!	C$$C87C8c                Z    [        SR                  U R                  S5      SS 5      5      $ )z
Return a string version as a simplified float version (major.minor)

Parameters
----------
version: str
    Version.

Return
------
float
    version
.N   )r   re   split)versions    r   r   SystemInfo._as_float_version  s(     SXXgmmC0!4566r   c                    [         R                  R                  U R                  SU R                  S 35      nU R
                  R                  U R
                  R                  U R                  S 5      =(       d    U$ )z@
Microsoft Visual Studio directory.

Return
------
str
    path
Microsoft Visual Studio 0.1f)rc   rd   re   ProgramFilesx86r   r   r   rp   )r)   defaults     r   VSInstallDirSystemInfo.VSInstallDir  s]     '',,  $<T[[<N"O

 ww~~dggjjT[[,>@KGKr   c                    U R                  5       =(       d    U R                  5       n[        R                  R	                  U5      (       d!  Sn[
        R                  R                  U5      eU$ )z=
Microsoft Visual C++ directory.

Return
------
str
    path
z(Microsoft Visual C++ directory not found)	_guess_vc_guess_vc_legacyrc   rd   isdirr   r   r   )r)   rd   msgs      r   VCInstallDirSystemInfo.VCInstallDir  sR     ~~:4#8#8#:ww}}T""<C""99#>>r   c                   U R                   S::  a  g U R                  U R                      n[        R
                  R                  US5      n [        R                  " U5      S   nU R                  U5      U l	        [        R
                  R                  X#5      $ ! [         a    U R                  n Nf = f! [        [        4 a     gf = f)z<
Locate Visual C++ for VS2017+.

Return
------
str
    path
      ,@r"   r   )r   r   r   r   rc   rd   re   r   r   r   r   
IndexError)r)   vs_dirguess_vcr   s       r   r   SystemInfo._guess_vc  s     ;;$	'((5F
 77<<(89	ZZ)"-F008DK77<<11  	'&&F	' $ 		s$   B AB7 B43B47C
	C
c                   [         R                  R                  U R                  SU R                  S S35      n[         R                  R                  U R
                  R                  U R                  S 5      nU R
                  R                  US5      nU(       a   [         R                  R                  US5      OUnU R
                  R                  U R
                  R                  U R                  S 5      =(       d    U$ )zK
Locate Visual C++ for versions prior to 2017.

Return
------
str
    path
r   r   z\VC
installdirVC)	rc   rd   re   r   r   r   rs   r   rk   )r)   r   reg_path	python_vc
default_vcs        r   r   SystemInfo._guess_vc_legacy3  s     '',,  'D'9=
 77<< 5 5$++d9KMGGNN8\:	6?RWW\\)T2W
 ww~~dggjjT[[,>@NJNr   c                    U R                   S::  a  gU R                   S:X  a  gU R                   S:X  a  gU R                   S:X  a  gU R                   S	:  a  g
g)zg
Microsoft Windows SDK versions for specified MSVC++ version.

Return
------
tuple of str
    versions
      "@)z7.0z6.1z6.0a      $@)z7.1z7.0a      &@)z8.0z8.0a      (@)8.1z8.1ar   )z10.0r  r   r   r/   s    r   WindowsSdkVersionSystemInfo.WindowsSdkVersionI  sR     ;;#'[[D  [[D  [[D  [[D  r   c                t    U R                  [        R                  R                  U R                  S5      5      $ )zD
Microsoft Windows SDK last version.

Return
------
str
    version
lib)_use_last_dir_namerc   rd   re   WindowsSdkDirr/   s    r   WindowsSdkLastVersion SystemInfo.WindowsSdkLastVersion_  s*     &&rww||D4F4F'NOOr   c                "   SnU R                    H_  n[        R                  R                  U R                  R
                  SU 35      nU R                  R                  US5      nU(       d  M_    O   U(       a$  [        R                  R                  U5      (       d  [        R                  R                  U R                  R                  U R                  S 5      nU R                  R                  US5      nU(       a   [        R                  R                  US5      nU(       a$  [        R                  R                  U5      (       d~  U R                    Hn  nUSUR                  S5       nS	U 3n[        R                  R                  U R                  U5      n[        R                  R                  U5      (       d  Ml  UnMp     U(       a$  [        R                  R                  U5      (       dj  U R                    HZ  nS
U 3n[        R                  R                  U R                  U5      n[        R                  R                  U5      (       d  MX  UnM\     U(       d*  [        R                  R                  U R                  S5      nU$ )z>
Microsoft Windows SDK directory.

Return
------
str
    path
r"   vinstallationfolderr   r   WinSDKNr   zMicrosoft SDKs\Windows Kits\zMicrosoft SDKs\Windows\vPlatformSDK)r  rc   rd   re   r   rz   r   r   rs   r   rfindr   r   )r)   sdkdirr   locrd   install_baseintverds           r   r  SystemInfo.WindowsSdkDirk  s     ))C'',,tww22auI>CWW^^C)=>Fv * RWW]]62277<< 5 5$++d9KMD77>>$=LlH=RWW]]622---syy~.6vh?GGLL!2!2D977==##F . RWW]]622--23%8GGLL!2!2D977==##F	 .
 WW\\$"3"3]CFr   c                x   U R                   S::  a  SnSnO@SnU R                   S::  a  SOSnU R                  R                  SUS9R                  S	S
5      nSU SU 3n/ nU R                   S:  aK  U R                   H;  nU[
        R                  R                  U R                  R                  Xd5      /-  nM=     U R                   H@  nU[
        R                  R                  U R                  R                  SU S3U5      /-  nMB     U H*  nU R                  R                  US5      nU(       d  M(  Us  $    g)zP
Microsoft Windows SDK executable directory.

Return
------
str | None
    path
r  r   r"   (   r  TF)r$   r@   r>   -zWinSDK-NetFxToolsr   r  Ar  N)r   rZ   rA   r'   NetFxSdkVersionrc   rd   re   r   r~   r  rz   r   )	r)   netfxverr(   r@   fxregpathsr   rd   execpaths	            r   WindowsSDKExecutablePath#SystemInfo.WindowsSDKExecutablePath  s%    ;;$HDH"kkT1duG77&&4&AII$PSTDH:U4&1 ;;$++RWW\\$''*;*;SEFF , ))Cdgg&9&9Qse1:rJKKH * Dww~~d,@AHx 
 r   c                    [         R                  R                  U R                  R                  U R
                  S S35      nU R                  R                  US5      =(       d    S$ )z<
Microsoft Visual F# directory.

Return
------
str
    path
r   z	\Setup\F#
productdirr"   )rc   rd   re   r   r_   r   r   )r)   rd   s     r   FSharpInstallDirSystemInfo.FSharpInstallDir  sJ     ww||DGG00dkk$5Gy2QRww~~dL17R7r   c                    U R                   S:  a  SOSnU HA  nU R                  R                  U R                  R                  SU 35      nU(       d  M?  Us  $    g)zK
Microsoft Universal CRT SDK directory.

Return
------
str | None
    path
r   )1081r   kitsrootN)r   r   r   r   )r)   versr   r  s       r   UniversalCRTSdkDirSystemInfo.UniversalCRTSdkDir  sV      ${{d2| CWW^^DGG$>$>(3%@PQFv 
 r   c                     U R                  [        R                  R                  U R                  S5      5      $ ! [
         a  n[        R                  " US5        e SnAff = f)zP
Microsoft Universal C Runtime SDK last version.

Return
------
str
    version
r  Cannot find UniversalCRTSdkDirN)r  rc   rd   re   r1  	TypeErrorr
   add_note)r)   exs     r   UniversalCRTSdkLastVersion%SystemInfo.UniversalCRTSdkLastVersion  sP    	**277<<8O8OQV+WXX 	NN2?@	s   8; 
A"AA"c                *    U R                   S:  a  S$ S$ )zQ
Microsoft .NET Framework SDK versions.

Return
------
tuple of str
    versions
r   )	z4.7.2z4.7.1z4.7z4.6.2z4.6.1z4.6z4.5.2z4.5.1z4.5r   r  r/   s    r   r!  SystemInfo.NetFxSdkVersion  s%     {{d" X	
 	
r   c                    SnU R                    H]  n[        R                  R                  U R                  R
                  U5      nU R                  R                  US5      nU(       d  M\    U$    U$ )zL
Microsoft .NET Framework SDK directory.

Return
------
str | None
    path
r"   kitsinstallationfolder)r!  rc   rd   re   r   r~   r   )r)   r  r   r  s       r   NetFxSdkDirSystemInfo.NetFxSdkDir  s`      ''C'',,tww00#6CWW^^C)ABFv (
 r   c                    [         R                  R                  U R                  S5      nU R                  R                  U R                  R                  S5      =(       d    U$ )zG
Microsoft .NET Framework 32bit directory.

Return
------
str
    path
zMicrosoft.NET\Frameworkframeworkdir32rc   rd   re   r   r   r   rk   r)   guess_fws     r   FrameworkDir32SystemInfo.FrameworkDir32  sB     77<<-GH ww~~dggjj*:;GxGr   c                    [         R                  R                  U R                  S5      nU R                  R                  U R                  R                  S5      =(       d    U$ )zG
Microsoft .NET Framework 64bit directory.

Return
------
str
    path
zMicrosoft.NET\Framework64frameworkdir64rB  rC  s     r   FrameworkDir64SystemInfo.FrameworkDir64   sB     77<<-IJ ww~~dggjj*:;GxGr   c                $    U R                  S5      $ )zS
Microsoft .NET Framework 32bit versions.

Return
------
tuple of str
    versions
    _find_dot_net_versionsr/   s    r   FrameworkVersion32SystemInfo.FrameworkVersion320       **2..r   c                $    U R                  S5      $ )zS
Microsoft .NET Framework 64bit versions.

Return
------
tuple of str
    versions
@   rM  r/   s    r   FrameworkVersion64SystemInfo.FrameworkVersion64<  rQ  r   c                   U R                   R                  U R                   R                  SU 35      n[        U SU 35      nU=(       d    U R	                  US5      =(       d    SnU R
                  S:  a  US4$ U R
                  S:  a  UR                  5       SS	 S
:w  a  SS4$ US4$ U R
                  S:X  a  gU R
                  S:X  a  gg)z
Find Microsoft .NET Framework versions.

Parameters
----------
bits: int
    Platform number of bits: 32 or 64.

Return
------
tuple of str
    versions
frameworkverFrameworkDirr  r"   r  zv4.0r  Nr   v4z
v4.0.30319v3.5r  )rZ  
v2.0.50727g       @)zv3.0r[  r   )r   r   rk   getattrr  r   r&   )r)   bitsreg_verdot_net_dirr   s        r   rN  !SystemInfo._find_dot_net_versionsH  s     ''..|D6-BCdl4&$9:H00cBHb ;;$;[[D #&99;r?d#:<VKKVKK[[C'[[C'r   c                r   ^ ^ U U4S j[        [        R                  " T 5      5       5       n[        US5      $ )z
Return name of the last dir in path or '' if no dir found.

Parameters
----------
path: StrPath
    Use dirs in this path
prefix: str
    Use only dirs starting by this prefix

Return
------
str
    name
c              3     >#    U  Hc  n[         R                  R                  [         R                  R                  TU5      5      (       d  MG  UR	                  T5      (       d  M_  Uv   Me     g 7frX   )rc   rd   r   re   
startswith).0dir_namerd   prefixs     r   	<genexpr>0SystemInfo._use_last_dir_name.<locals>.<genexpr>w  sN      
6ww}}RWW\\$9:  ##F+ H6s   AA.A.%	A.r"   )reversedrc   r   next)rd   rf  matching_dirss   `` r   r  SystemInfo._use_last_dir_namef  s/    "
$RZZ%56
 M2&&r   )r   rZ   r   r   r   rX   )r   rU   r   zfloat | NonerL   rM   )rL   zlist[float])rL   zdict[float, str]rN   )rL   ztuple[LiteralString, ...]rL   r   )rL   ztuple[str, ...])r"   )rd   r	   rf  rK   rL   rK   )%r   r   r   r   rQ   r   rR   r   r   r   r*   r   r   r   staticmethodr   rS   r   r   r   r   r  r  r  r&  r*  r1  r8  r!  r>  rE  rI  rO  rT  rN  r  r   r   r   r   r   r   f  s   	 [[2&F;;~r2Lkk"5|DO CG	S)	S3?	S		S(>(T 7 7  L L"  "<O,  * 	P 	P ( (T " "H 
8 
8  (   
 
   " H H H H 	/ 	/ 	/ 	/< ' 'r   r   c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S	rg
)_EnvironmentDicti  rK   includer  libpathrd   zNotRequired[str | None]py_vcruntime_redistr   N)r   r   r   r   __annotations__r   r   r   r   rp  rp    s    L	HL
I00r   rp  c                     \ rS rSrSrS!S"S jjr\S 5       r\S 5       r\S 5       r	\S 5       r
\S	 5       r\S
 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       rS r\S#S j5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S 5       r\S$S j5       r\S$S j5       r\S#S j5       r\S 5       r\S%S j5       rS&S'S jjr S r!S r"g)(EnvironmentInfoi  a  
Return environment variables for specified Microsoft Visual C++ version
and platform : Lib, Include, Path and libpath.

This function is compatible with Microsoft Visual C++ 9.0 to 14.X.

Script created by analysing Microsoft environment configuration files like
"vcvars[...].bat", "SetEnv.Cmd", "vcbuildtools.bat", ...

Parameters
----------
arch: str
    Target architecture.
vc_ver: float
    Required Microsoft Visual C++ version. If not set, autodetect the last
    version.
vc_min_ver: float
    Minimum Microsoft Visual C++ version.
Nc                    [        U5      U l        [        U R                  5      U l        [	        U R                  U5      U l        U R                  U:  a!  Sn[        R                  R                  U5      eg )Nz.No suitable Microsoft Visual C++ version found)
r   rZ   rU   r   r   sir   r   r   r   )r)   r(   r   
vc_min_vererrs        r   r*   EnvironmentInfo.__init__  s]    t$tww'TWWf-;;#BC""99#>> $r   c                .    U R                   R                  $ )z;
Microsoft Visual Studio.

Return
------
float
    version
)rx  r   r/   s    r   r   EnvironmentInfo.vs_ver       ww~~r   c                .    U R                   R                  $ )z@
Microsoft Visual C++ version.

Return
------
float
    version
)rx  r   r/   s    r   r   EnvironmentInfo.vc_ver  r~  r   c                   SS/nU R                   S:  a/  U R                  R                  SSS9nUS/-  nUS/-  nUSU 3/-  nU Vs/ s H7  n[        R                  R                  U R                  R                  U5      PM9     sn$ s  snf )zE
Microsoft Visual Studio Tools.

Return
------
list of str
    paths
zCommon7\IDEzCommon7\Toolsr   Tr@   r$   z1Common7\IDE\CommonExtensions\Microsoft\TestWindowzTeam Tools\Performance Tools)r   rZ   rA   rc   rd   re   rx  r   )r)   pathsarch_subdirrd   s       r   VSToolsEnvironmentInfo.VSTools  s      !12;;$''--d-EKJKKE566E5k]CDDEEJKUTTWW1148UKKKs   >B	c                    [         R                  R                  U R                  R                  S5      [         R                  R                  U R                  R                  S5      /$ )zb
Microsoft Visual C++ & Microsoft Foundation Class Includes.

Return
------
list of str
    paths
IncludezATLMFC\Include)rc   rd   re   rx  r   r/   s    r   
VCIncludesEnvironmentInfo.VCIncludes  sG     GGLL--y9GGLL--/@A
 	
r   c                b   U R                   S:  a  U R                  R                  SS9nOU R                  R                  SS9nSU 3SU 3/nU R                   S:  a	  USU 3/-  nU Vs/ s H7  n[        R                  R                  U R                  R                  U5      PM9     sn$ s  snf )	zc
Microsoft Visual C++ & Microsoft Foundation Class Libraries.

Return
------
list of str
    paths
      .@Tr$   r@   Libz
ATLMFC\Libr   z	Lib\store)r   rZ   rD   rc   rd   re   rx  r   )r)   r  r  rd   s       r   VCLibrariesEnvironmentInfo.VCLibraries  s     ;;$'',,,6K'',,T,:K{m$K=&AB;;$;-011EEJKUTTWW1148UKKKs   +>B,c                    U R                   S:  a  / $ [        R                  R                  U R                  R
                  S5      /$ )zW
Microsoft Visual C++ store references Libraries.

Return
------
list of str
    paths
r   zLib\store\references)r   rc   rd   re   rx  r   r/   s    r   VCStoreRefsEnvironmentInfo.VCStoreRefs  s8     ;;ITWW113JKLLr   c           	        U R                   n[        R                  R                  UR                  S5      /nU R
                  S::  a  SOSnU R                  R                  U5      nU(       a1  U[        R                  R                  UR                  SU 35      /-  nU R
                  S:X  aL  SU R                  R                  SS9 3nU[        R                  R                  UR                  U5      /-  nU$ U R
                  S:  Ga  U R                  R                  R                  S	S
5      R                  5       n[        R                  R                  SSU S35      nU[        R                  R                  UR                  XpR                  R                  SS9-  5      /-  nU R                  R                  U R                  R                  :w  aG  U[        R                  R                  UR                  XpR                  R                  SS9-  5      /-  nU$ U[        R                  R                  UR                  S5      /-  nU$ )ak  
Microsoft Visual C++ Tools.

Return
------
list of str
    paths

When host CPU is ARM, the tools should be found for ARM.

>>> getfixture('windows_only')
>>> mp = getfixture('monkeypatch')
>>> mp.setattr(PlatformInfo, 'current_cpu', 'arm64')
>>> ei = EnvironmentInfo(arch='irrelevant')
>>> paths = ei.VCTools
>>> any('HostARM64' in path for path in paths)
True

VCPackagesr  TFBinr   r  r  r%   r$   binHostz%sr  )rx  rc   rd   re   r   r   rZ   rI   rA   r9   r'   upperrD   r0   )r)   rx  toolsrG   r  rd   host_idhost_dirs           r   VCToolsEnvironmentInfo.VCTools  s   ( WWboo|<=;;$.4Egg''1bggll2??c+4GHIIE;;$,,T,:;<Dbggll2??D9::E& # [[D gg))11'5AGGIGww||ET'"+=>HR__h9K9KPT9K9U.UV E ww""dgg&8&88GGLLGG4G4GD4G4Q)Q   bggll2??E:;;Er   c                   U R                   S::  aR  U R                  R                  SSS9n[        R                  R                  U R                  R                  SU 35      /$ U R                  R                  SS9n[        R                  R                  U R                  R                  S5      nU R                  n[        R                  R                  X# SU 35      /$ )zG
Microsoft Windows SDK Libraries.

Return
------
list of str
    paths
r  Tr  r  r  r  um)	r   rZ   rD   rc   rd   re   rx  r  _sdk_subdir)r)   r  r  libvers       r   OSLibrariesEnvironmentInfo.OSLibraries:  s     ;;$'',,Tt,DKGGLL!6!6#k]8KLMM '',,,6K'',,tww44e<C%%FGGLL;-&@ABBr   c                   [         R                  R                  U R                  R                  S5      nU R
                  S::  a"  U[         R                  R                  US5      /$ U R
                  S:  a  U R                  nOSn[         R                  R                  X S35      [         R                  R                  X S35      [         R                  R                  X S35      /$ )	zE
Microsoft Windows SDK Include.

Return
------
list of str
    paths
rq  r  glr   r"   sharedr  winrt)rc   rd   re   rx  r  r   r  )r)   rq  sdkvers      r   
OSIncludesEnvironmentInfo.OSIncludesN  s     '',,tww44i@;;$RWW\\'4899 {{d"))W&78Wm4W&67 r   c                   [         R                  R                  U R                  R                  S5      n/ nU R
                  S::  a  X R                  -  nU R
                  S:  a$  U[         R                  R                  US5      /-  nU R
                  S:  a  UU[         R                  R                  U R                  R                  S5      [         R                  R                  USS5      [         R                  R                  US	S5      [         R                  R                  US
S5      [         R                  R                  U R                  R                  SSU R
                  S SSS5      /-  nU$ )zM
Microsoft Windows SDK Libraries Paths.

Return
------
list of str
    paths

Referencesr  r  zCommonConfiguration\Neutralr   UnionMetadataz'Windows.Foundation.UniversalApiContractz1.0.0.0z%Windows.Foundation.FoundationContractz,Windows.Networking.Connectivity.WwanContractExtensionSDKszMicrosoft.VCLibsr   CommonConfigurationneutral)rc   rd   re   rx  r  r   r  )r)   refrr  s      r   	OSLibpathEnvironmentInfo.OSLibpathh  s'    ggll47700,?;;#'''G;;$S*HIJJG;;$TWW22ODS"KYWS"I9UG GG))#&{{4( ) G$ r   c                4    [        U R                  5       5      $ )zC
Microsoft Windows SDK Tools.

Return
------
list of str
    paths
)list
_sdk_toolsr/   s    r   SdkToolsEnvironmentInfo.SdkTools  s     DOO%&&r   c              #  N  #    U R                   S:  aJ  U R                   S::  a  SOSn[        R                  R                  U R                  R
                  U5      v   U R                  R                  5       (       dT  U R                  R                  SS9nSU 3n[        R                  R                  U R                  R
                  U5      v   U R                   S;   ax  U R                  R                  5       (       a  SnOU R                  R                  SSS	9nS
U 3n[        R                  R                  U R                  R
                  U5      v   OU R                   S:  a  [        R                  R                  U R                  R
                  S5      nU R                  R                  SS9nU R                  R                  n[        R                  R                  X4 U 35      v   U R                  R                  (       a  U R                  R                  v   gg7f)zX
Microsoft Windows SDK Tools paths generator.

Return
------
generator of str
    paths
r  r  r  zBin\x86Tr  )r  r  r"   r  zBin\NETFX 4.0 ToolsN)r   rc   rd   re   rx  r  rZ   r:   rA   r5   r  r&  )r)   bin_dirr  rd   r  s        r   r  EnvironmentInfo._sdk_tools  s     ;;#{{d2e
G'',,tww44g>>ww%%''''--$-7K&D'',,tww44d;;;;,&ww$$&& "gg11$D1I)+7D'',,tww44d;;[[D 77<< 5 5u=D''--$-7KWW22F'',,tx}%=>>77++''222 ,s   H#H%c                J    U R                   R                  nU(       a  U S3$ S$ )zE
Microsoft Windows SDK version subdir.

Return
------
str
    subdir
r>   r"   )rx  r  r)   ucrtvers     r   r  EnvironmentInfo._sdk_subdir  s&     ''//#*7)222r   c                    U R                   S:  a  / $ [        R                  R                  U R                  R
                  S5      /$ )zC
Microsoft Windows SDK Setup.

Return
------
list of str
    paths
r  Setup)r   rc   rd   re   rx  r  r/   s    r   SdkSetupEnvironmentInfo.SdkSetup  s7     ;;ITWW22G<==r   c                   U R                   nU R                  nU R                  S::  a4  SnUR                  5       (       + =(       a    UR	                  5       (       + nOLUR                  5       =(       d    UR	                  5       nUR
                  S:H  =(       d    UR                  S:H  n/ nU(       aH  UUR                   Vs/ s H-  n[        R                  R                  UR                  U5      PM/     sn-  nU(       aH  UUR                   Vs/ s H-  n[        R                  R                  UR                  U5      PM/     sn-  nU$ s  snf s  snf )zF
Microsoft .NET Framework Tools.

Return
------
list of str
    paths
r  Tr%   )rZ   rx  r   r5   r:   r9   r0   rO  rc   rd   re   rE  rT  rI  )r)   rZ   rx  	include32	include64r  r   s          r   FxToolsEnvironmentInfo.FxTools  s    WWWW;;$I,,..Jr7H7H7J3JI((*Ab.?.?.AI'1MR]]g5MI@B@U@U@UR..4@U E @B@U@U@UR..4@U E s   4E4Ec                    U R                   S:  d  U R                  R                  (       d  / $ U R                  R	                  SS9n[
        R                  R                  U R                  R                  SU 35      /$ )zN
Microsoft .Net Framework SDK Libraries.

Return
------
list of str
    paths
r   Tr  zlib\um)r   rx  r>  rZ   rD   rc   rd   re   )r)   r  s     r   NetFxSDKLibraries!EnvironmentInfo.NetFxSDKLibraries  sa     ;;TWW%8%8Igg((T(2TWW00VK=2IJKKr   c                    U R                   S:  d  U R                  R                  (       d  / $ [        R                  R                  U R                  R                  S5      /$ )zM
Microsoft .Net Framework SDK Includes.

Return
------
list of str
    paths
r   z
include\um)r   rx  r>  rc   rd   re   r/   s    r   NetFxSDKIncludes EnvironmentInfo.NetFxSDKIncludes
  sC     ;;TWW%8%8ITWW00-@AAr   c                l    [         R                  R                  U R                  R                  S5      /$ )zT
Microsoft Visual Studio Team System Database.

Return
------
list of str
    paths
zVSTSDB\Deploy)rc   rd   re   rx  r   r/   s    r   VsTDbEnvironmentInfo.VsTDb  s'     TWW113CDEEr   c                   U R                   S:  a  / $ U R                   S:  a0  U R                  R                  nU R                  R	                  SS9nOU R                  R
                  nSnSU R                   S SU 3n[        R                  R                  X5      /nU R                   S:  a$  U[        R                  R                  XS	5      /-  nU$ )
z>
Microsoft Build Engine.

Return
------
list of str
    paths
r  r  Tr  r"   zMSBuild\r   z\binRoslyn)	r   rx  r   rZ   rA   r   rc   rd   re   )r)   	base_pathr  rd   builds        r   MSBuildEnvironmentInfo.MSBuild%  s     ;;I[[4//I''--d-;K,,IK4;;t,D>i./;;$bggll9H=>>Er   c                    U R                   S:  a  / $ [        R                  R                  U R                  R
                  S5      /$ )zD
Microsoft HTML Help Workshop.

Return
------
list of str
    paths
r  zHTML Help Workshop)r   rc   rd   re   rx  r   r/   s    r   HTMLHelpWorkshop EnvironmentInfo.HTMLHelpWorkshopA  s8     ;;ITWW446JKLLr   c                x   U R                   S:  a  / $ U R                  R                  SS9n [        R                  R                  U R                  R                  S5      nU R                  n[        R                  R                  X$ SU 35      /$ ! [         a  n[        R                  " US5        e SnAff = f)zS
Microsoft Universal C Runtime SDK Libraries.

Return
------
list of str
    paths
r   Tr  r  r4  Nucrt)r   rZ   rD   rc   rd   re   rx  r1  r5  r
   r6  _ucrt_subdir)r)   r  r  r7  r  s        r   UCRTLibrariesEnvironmentInfo.UCRTLibrariesP  s     ;;Igg((T(2	'',,tww995AC ##SIT+"?@AA	  	NN2?@	s   4B 
B9B44B9c                >   U R                   S:  a  / $  [        R                  R                  U R                  R
                  S5      n[        R                  R                  XR                   S35      /$ ! [         a  n[        R                  " US5        e SnAff = f)zQ
Microsoft Universal C Runtime SDK Include.

Return
------
list of str
    paths
r   rq  r4  Nr  )
r   rc   rd   re   rx  r1  r5  r
   r6  r  )r)   rq  r7  s      r   UCRTIncludesEnvironmentInfo.UCRTIncludesf  s     ;;I	ggll477#=#=yIG W):):(;4&@ABB  	NN2?@	s   4A5 5
B?BBc                J    U R                   R                  nU(       a  U S3$ S$ )zQ
Microsoft Universal C Runtime SDK version subdir.

Return
------
str
    subdir
r>   r"   )rx  r8  r  s     r   r  EnvironmentInfo._ucrt_subdirz  s&     ''44#*7)222r   c                f    SU R                   s=:  a  S:  a   / $   U R                  R                  /$ )z;
Microsoft Visual F#.

Return
------
list of str
    paths
r  r  )r   rx  r*  r/   s    r   FSharpEnvironmentInfo.FSharp  s4     $++$$I % (())r   c                F  ^^ SU R                    S3mU R                  R                  SS9R                  S5      m/ nU R                  R
                  n[        R                  R                  UR                  SS5      5      n[        R                  R                  U5      (       a[  [        R                  R                  U[        R                  " U5      S   5      nX[        R                  R                  US	5      /-  nU[        R                  R                  US
5      /-  nSU R                   S-   S3S[        U R                  5      S-   S34nUU4S j[        R                   " X5       5       n[#        [%        [        R                  R&                  U5      S5      $ )zc
Microsoft Visual C++ runtime redistributable dll.

Returns the first suitable path found or None.
	vcruntimez0.dllTr  r>   z\Toolsz\Redistr   onecoreredistzMicrosoft.VC
   z.CRTc              3  l   >#    U  H)  u  p[         R                  R                  UTUT5      v   M+     g 7frX   )rc   rd   re   )rd  rf  crt_dirr  r  s      r   rg  2EnvironmentInfo.VCRuntimeRedist.<locals>.<genexpr>  s1      
%J! GGLLgyAA%Js   14N)r   rZ   rD   striprx  r   rc   rd   dirnamer'   r   re   r   intr   r   r   rj  filterisfile)r)   prefixes
tools_pathredist_pathcrt_dirscandidate_pathsr  r  s         @@r   VCRuntimeRedistEnvironmentInfo.VCRuntimeRedist  sM     }E2	gg((T(288> WW))
ggooj&8&8J&OP77==%%'',,{BJJ{4KB4OPKbggll;	&JKKHRWW\\*h788 4;;+,D13t{{+b016

%.%6%6x%J
 F277>>?;TBBr   c                   [        U R                  SU R                  U R                  U R                  U R
                  /U5      U R                  SU R                  U R                  U R                  U R                  U R                  /U5      U R                  SU R                  U R                  U R                  U R                  /U5      U R                  SU R                  U R                  U R                  U R                   U R"                  U R                  U R$                  U R&                  U R(                  /	U5      S9nU R*                  S:  a   U R,                  (       a  U R,                  US'   U$ )z
Return environment dict.

Parameters
----------
exists: bool
    It True, only return existing paths.

Return
------
dict
    environment
rq  r  rr  rd   )rq  r  rr  rd      rs  )rp  _build_pathsr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  )r)   existsenvs      r   
return_envEnvironmentInfo.return_env  sR    %%OOOO%%))	 	 !!$$$$LL&&** 
 %%!!4<<1A1A4>>R
 ""LLLLJJMMMMLLLL))KK
 7*
V ;;"!5!5)-)=)=C%&
r   c                   [         R                  R                  U5      n[        R                  " US5      R                  [        R                  5      n[         R                  " XE5      nU(       a-  [        [        [        R                  R                  U5      5      OUnU(       d2  UR                  5        S3n[        R                  R                  U5      e[!        U5      n	[        R                  R#                  U	5      $ )a  
Given an environment variable name and specified paths,
return a pathsep-separated string of paths containing
unique, extant, directories from those paths and from
the environment variable. Raise an error if no paths
are resolved.

Parameters
----------
name: str
    Environment variable name
spec_path_lists: list of str
    Paths
exists: bool
    It True, only return existing paths.

Return
------
str
    Pathsep-separated paths
r"   z environment variable is empty)r   chainfrom_iterabler   rR   r   rc   pathsepr  r  rd   r   r  r   r   r   r   re   )
r)   r   spec_path_listsr  
spec_paths	env_pathsr  extant_pathsr   unique_pathss
             r   r   EnvironmentInfo._build_paths  s    . __22?C
KKb)//

;	
6=CtF277==%89ZZ\N"@AC""99#>>&|4zz|,,r   )rZ   r   rx  )Nr   )rL   rM   rN   )rL   z	list[str]rm  )T)r  rO   rL   rp  )#r   r   r   r   rQ   r*   rS   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r   rv  rv    s   .? 	 	 	 	 L L& 
 
 L L( M M 0 0d C C&  2 % %N 	' 	'!3F 
3 
3 > >  < L L B B 	F 	F  6 M M B B* C C& 
3 
3 * *  C  CD;z-r   rv  )"rQ   
__future__r   r   r   r   rc   os.pathplatformtypingr   r   r   more_itertoolsr   _pathr	   compatr
   distutils.errorsr   typing_extensionsr   r   systemr   r   dictrt  r   rU   r   rp  rv  r   r   r   <module>r     s    #    	   5 5 *   < *i7! ! #fG^$v
 v
r~ ~BW' W't1y 1M
- M
-r   